@tokenjam/sdk 0.5.7 → 0.6.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/README.md CHANGED
@@ -71,6 +71,33 @@ new TjClient(options: TjClientOptions)
71
71
  | `client.send(span)` | Buffer a span; auto-flushes when `batchSize` is reached. |
72
72
  | `client.flush()` | Immediately send all buffered spans. Returns `IngestResult | null`. |
73
73
  | `client.shutdown()` | Flush remaining spans and stop the timer. Call before process exit. |
74
+ | `client.recordOutcome(options)` | Emit a gen_ai outcome event attaching a business outcome to a workflow. |
75
+
76
+ ### Record an outcome
77
+
78
+ Attach a business outcome to a workflow in one call — the emerging gen_ai
79
+ outcome event (OTel semconv issue #2665) TokenJam Cloud's ROI backend ingests.
80
+
81
+ ```typescript
82
+ await client.recordOutcome({
83
+ outcomeType: "ticket_resolved", // required marker
84
+ sessionId: "sess-9", // at least one of sessionId / workflowId
85
+ success: true,
86
+ valueUsd: 25.0, // optional, self-reported
87
+ });
88
+ ```
89
+
90
+ | Option | Type | Description |
91
+ |---|---|---|
92
+ | `outcomeType` | `string` | Required. Caller-defined label (e.g. `"ticket_resolved"`). The marker attribute. |
93
+ | `workflowId` | `string` | Explicit workflow key. At least one of `workflowId` / `sessionId` is required. |
94
+ | `sessionId` | `string` | Session (or root session of a fan-out) the outcome belongs to. |
95
+ | `success` | `boolean` | Whether the outcome was achieved. Defaults to `true`. |
96
+ | `valueUsd` | `number` | **Optional, self-reported** business value. TokenJam does not measure or verify it. |
97
+ | `agentId` | `string` | Emitting agent id. |
98
+ | `attributes` | `Record<string, unknown>` | Extra attributes attached verbatim. |
99
+
100
+ **ROI compute is a TokenJam Cloud feature.** The SDK only emits the event.
74
101
 
75
102
  ## SpanBuilder
76
103
 
package/dist/client.d.ts CHANGED
@@ -1,4 +1,35 @@
1
1
  import type { IngestResult, Span } from "./types.js";
2
+ export interface RecordOutcomeOptions {
3
+ /**
4
+ * The kind of outcome, a caller-defined label
5
+ * (e.g. "ticket_resolved", "lead_qualified", "pr_merged"). Required — this is
6
+ * the marker attribute; without it the event is not recognised downstream.
7
+ */
8
+ outcomeType: string;
9
+ /**
10
+ * An explicit workflow key to attach the outcome to. Optional if sessionId is
11
+ * given. At least one of workflowId / sessionId is required.
12
+ */
13
+ workflowId?: string;
14
+ /**
15
+ * The session (or root session of a fan-out) the outcome belongs to. At least
16
+ * one of workflowId / sessionId is required.
17
+ */
18
+ sessionId?: string;
19
+ /** Whether the outcome was achieved (execution succeeded). Defaults to true. */
20
+ success?: boolean;
21
+ /**
22
+ * An OPTIONAL, SELF-REPORTED business value for the outcome in USD. A value
23
+ * YOU declare — TokenJam does not measure or verify it. Negative values are
24
+ * treated as undeclared. ROI compute (declared value / measured cost) is a
25
+ * TokenJam Cloud feature; the SDK only emits the event.
26
+ */
27
+ valueUsd?: number;
28
+ /** The emitting agent id (stamped as gen_ai.agent.id). */
29
+ agentId?: string;
30
+ /** Extra attributes attached verbatim to the event. */
31
+ attributes?: Record<string, unknown>;
32
+ }
2
33
  export interface TjClientOptions {
3
34
  /** Base URL of the TokenJam server (default: http://127.0.0.1:7391) */
4
35
  baseUrl?: string;
@@ -32,6 +63,20 @@ export declare class TjClient {
32
63
  * Add a span to the buffer. Auto-flushes when batchSize is reached.
33
64
  */
34
65
  send(span: Span): Promise<void>;
66
+ /**
67
+ * Emit a gen_ai outcome event attaching a business outcome to a workflow.
68
+ *
69
+ * A thin wrapper that builds and sends one outcome span carrying the emerging
70
+ * gen_ai outcome-event attributes (OTel semconv issue #2665) that TokenJam
71
+ * Cloud's ROI ingest keys off — one call instead of hand-POSTing OTLP JSON.
72
+ * The span is buffered like any other (auto-flushes at batchSize).
73
+ *
74
+ * ROI compute is a TokenJam Cloud feature; the SDK only emits the event.
75
+ * `valueUsd` is self-reported — TokenJam does not measure or verify it.
76
+ *
77
+ * @throws if outcomeType is empty, or neither workflowId nor sessionId is set.
78
+ */
79
+ recordOutcome(options: RecordOutcomeOptions): Promise<void>;
35
80
  /**
36
81
  * Flush all buffered spans to the server.
37
82
  * Returns the ingest result, or null if the buffer was empty.
package/dist/client.js CHANGED
@@ -1,6 +1,12 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.TjClient = void 0;
4
+ /**
5
+ * TjClient — sends spans to the TokenJam REST API.
6
+ * Communicates via HTTP POST to /api/v1/spans in OTLP JSON format.
7
+ */
8
+ const semconv_js_1 = require("./semconv.js");
9
+ const span_builder_js_1 = require("./span-builder.js");
4
10
  const types_js_1 = require("./types.js");
5
11
  const SPAN_KIND_TO_OTLP = {
6
12
  [types_js_1.SpanKind.INTERNAL]: 1,
@@ -105,6 +111,52 @@ class TjClient {
105
111
  await this.flush();
106
112
  }
107
113
  }
114
+ /**
115
+ * Emit a gen_ai outcome event attaching a business outcome to a workflow.
116
+ *
117
+ * A thin wrapper that builds and sends one outcome span carrying the emerging
118
+ * gen_ai outcome-event attributes (OTel semconv issue #2665) that TokenJam
119
+ * Cloud's ROI ingest keys off — one call instead of hand-POSTing OTLP JSON.
120
+ * The span is buffered like any other (auto-flushes at batchSize).
121
+ *
122
+ * ROI compute is a TokenJam Cloud feature; the SDK only emits the event.
123
+ * `valueUsd` is self-reported — TokenJam does not measure or verify it.
124
+ *
125
+ * @throws if outcomeType is empty, or neither workflowId nor sessionId is set.
126
+ */
127
+ async recordOutcome(options) {
128
+ if (!options.outcomeType) {
129
+ throw new Error("recordOutcome requires a non-empty outcomeType");
130
+ }
131
+ if (!options.workflowId && !options.sessionId) {
132
+ throw new Error("recordOutcome requires at least one of workflowId or sessionId");
133
+ }
134
+ const builder = new span_builder_js_1.SpanBuilder(semconv_js_1.GenAIAttributes.SPAN_OUTCOME)
135
+ .kind(types_js_1.SpanKind.CLIENT)
136
+ // The marker attrs the Cloud ROI ingest keys off, plus the stock
137
+ // event.name so the event can also ride the OTLP event path.
138
+ .attribute(semconv_js_1.GenAIAttributes.EVENT_NAME, semconv_js_1.GenAIAttributes.OUTCOME_EVENT_NAME)
139
+ .attribute(semconv_js_1.GenAIAttributes.OUTCOME_TYPE, options.outcomeType)
140
+ .attribute(semconv_js_1.GenAIAttributes.OUTCOME_SUCCESS, options.success ?? true);
141
+ if (options.workflowId) {
142
+ builder.attribute(semconv_js_1.TjAttributes.WORKFLOW_ID, options.workflowId);
143
+ }
144
+ if (options.sessionId) {
145
+ // session.id is the key the canonical OTLP parser reads (not the
146
+ // SpanBuilder.sessionId() gen_ai.session.id form).
147
+ builder.attribute(semconv_js_1.TjAttributes.SESSION_ID, options.sessionId);
148
+ }
149
+ if (options.agentId) {
150
+ builder.agentId(options.agentId);
151
+ }
152
+ if (options.valueUsd != null) {
153
+ builder.attribute(semconv_js_1.GenAIAttributes.OUTCOME_VALUE_USD, options.valueUsd);
154
+ }
155
+ for (const [key, value] of Object.entries(options.attributes ?? {})) {
156
+ builder.attribute(key, value);
157
+ }
158
+ await this.send(builder.build());
159
+ }
108
160
  /**
109
161
  * Flush all buffered spans to the server.
110
162
  * Returns the ingest result, or null if the buffer was empty.
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- export { TjClient, type TjClientOptions } from "./client.js";
1
+ export { TjClient, type TjClientOptions, type RecordOutcomeOptions, } from "./client.js";
2
2
  export { type Span, type SpanBatch, type IngestResult, SpanKind, SpanStatus } from "./types.js";
3
3
  export { SpanBuilder } from "./span-builder.js";
4
4
  export { GenAIAttributes, TjAttributes, ClaudeCodeEvents } from "./semconv.js";
package/dist/index.js.map CHANGED
@@ -1 +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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,yCAIqB;AAHnB,qGAAA,QAAQ,OAAA;AAIV,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 @@
1
+ export {};
@@ -0,0 +1,150 @@
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 node_http_1 = require("node:http");
9
+ const client_js_1 = require("./client.js");
10
+ const semconv_js_1 = require("./semconv.js");
11
+ /**
12
+ * Tests for TjClient.recordOutcome — asserts the emitted outcome span carries
13
+ * the exact attribute names/shape TokenJam Cloud's ROI ingest keys off
14
+ * (roi.is_outcome_event / write_outcome_from_span), and that argument
15
+ * validation mirrors the Cloud OutcomeIn validator.
16
+ */
17
+ function createMockServer() {
18
+ const requests = [];
19
+ const server = (0, node_http_1.createServer)((req, res) => {
20
+ let body = "";
21
+ req.on("data", (chunk) => {
22
+ body += chunk.toString();
23
+ });
24
+ req.on("end", () => {
25
+ requests.push({ body });
26
+ res.writeHead(200, { "Content-Type": "application/json" });
27
+ res.end(JSON.stringify({ ingested: 1, rejected: 0, rejections: [] }));
28
+ });
29
+ });
30
+ return {
31
+ server,
32
+ port: () => {
33
+ const addr = server.address();
34
+ if (addr && typeof addr === "object")
35
+ return addr.port;
36
+ throw new Error("Server not started");
37
+ },
38
+ requests,
39
+ async start() {
40
+ await new Promise((resolve) => {
41
+ server.listen(0, "127.0.0.1", resolve);
42
+ });
43
+ },
44
+ async stop() {
45
+ await new Promise((resolve, reject) => {
46
+ server.close((err) => (err ? reject(err) : resolve()));
47
+ });
48
+ },
49
+ };
50
+ }
51
+ /** Extract the first span's attribute map from a captured OTLP request body. */
52
+ function attrMapOf(body) {
53
+ const parsed = JSON.parse(body);
54
+ const span = parsed.resourceSpans[0].scopeSpans[0].spans[0];
55
+ return new Map(span.attributes.map((a) => [
56
+ a.key,
57
+ a.value,
58
+ ]));
59
+ }
60
+ function spanNameOf(body) {
61
+ return JSON.parse(body).resourceSpans[0].scopeSpans[0].spans[0].name;
62
+ }
63
+ (0, node_test_1.describe)("TjClient.recordOutcome", () => {
64
+ let mock;
65
+ (0, node_test_1.beforeEach)(async () => {
66
+ mock = createMockServer();
67
+ await mock.start();
68
+ });
69
+ (0, node_test_1.afterEach)(async () => {
70
+ await mock.stop();
71
+ });
72
+ function newClient() {
73
+ return new client_js_1.TjClient({
74
+ baseUrl: `http://127.0.0.1:${mock.port()}`,
75
+ ingestSecret: "secret",
76
+ batchSize: 1,
77
+ });
78
+ }
79
+ (0, node_test_1.it)("emits an outcome span with the Cloud marker attributes", async () => {
80
+ await newClient().recordOutcome({
81
+ outcomeType: "ticket_resolved",
82
+ workflowId: "wf-123",
83
+ });
84
+ strict_1.default.equal(mock.requests.length, 1);
85
+ const body = mock.requests[0].body;
86
+ strict_1.default.equal(spanNameOf(body), semconv_js_1.GenAIAttributes.SPAN_OUTCOME);
87
+ const attrs = attrMapOf(body);
88
+ strict_1.default.deepEqual(attrs.get(semconv_js_1.GenAIAttributes.EVENT_NAME), {
89
+ stringValue: semconv_js_1.GenAIAttributes.OUTCOME_EVENT_NAME,
90
+ });
91
+ strict_1.default.deepEqual(attrs.get(semconv_js_1.GenAIAttributes.OUTCOME_TYPE), {
92
+ stringValue: "ticket_resolved",
93
+ });
94
+ strict_1.default.deepEqual(attrs.get(semconv_js_1.GenAIAttributes.OUTCOME_SUCCESS), {
95
+ boolValue: true,
96
+ });
97
+ strict_1.default.deepEqual(attrs.get(semconv_js_1.TjAttributes.WORKFLOW_ID), {
98
+ stringValue: "wf-123",
99
+ });
100
+ // No value declared -> value_usd attribute absent (never fabricated).
101
+ strict_1.default.equal(attrs.has(semconv_js_1.GenAIAttributes.OUTCOME_VALUE_USD), false);
102
+ });
103
+ (0, node_test_1.it)("uses canonical attribute name strings matching the Cloud roi.py", () => {
104
+ strict_1.default.equal(semconv_js_1.GenAIAttributes.OUTCOME_EVENT_NAME, "gen_ai.outcome");
105
+ strict_1.default.equal(semconv_js_1.GenAIAttributes.EVENT_NAME, "event.name");
106
+ strict_1.default.equal(semconv_js_1.GenAIAttributes.OUTCOME_TYPE, "gen_ai.outcome.type");
107
+ strict_1.default.equal(semconv_js_1.GenAIAttributes.OUTCOME_SUCCESS, "gen_ai.outcome.success");
108
+ strict_1.default.equal(semconv_js_1.GenAIAttributes.OUTCOME_VALUE_USD, "gen_ai.outcome.value_usd");
109
+ strict_1.default.equal(semconv_js_1.TjAttributes.WORKFLOW_ID, "tokenjam.workflow_id");
110
+ strict_1.default.equal(semconv_js_1.TjAttributes.SESSION_ID, "session.id");
111
+ });
112
+ (0, node_test_1.it)("stamps session.id and self-reported value_usd", async () => {
113
+ await newClient().recordOutcome({
114
+ outcomeType: "lead_qualified",
115
+ sessionId: "sess-9",
116
+ valueUsd: 42.5,
117
+ agentId: "sales-bot",
118
+ });
119
+ const attrs = attrMapOf(mock.requests[0].body);
120
+ strict_1.default.deepEqual(attrs.get(semconv_js_1.TjAttributes.SESSION_ID), { stringValue: "sess-9" });
121
+ strict_1.default.deepEqual(attrs.get(semconv_js_1.GenAIAttributes.OUTCOME_VALUE_USD), {
122
+ doubleValue: 42.5,
123
+ });
124
+ strict_1.default.deepEqual(attrs.get(semconv_js_1.GenAIAttributes.AGENT_ID), {
125
+ stringValue: "sales-bot",
126
+ });
127
+ });
128
+ (0, node_test_1.it)("carries success=false and extra attributes", async () => {
129
+ await newClient().recordOutcome({
130
+ outcomeType: "checkout",
131
+ workflowId: "wf-1",
132
+ success: false,
133
+ attributes: { customer_tier: "enterprise" },
134
+ });
135
+ const attrs = attrMapOf(mock.requests[0].body);
136
+ strict_1.default.deepEqual(attrs.get(semconv_js_1.GenAIAttributes.OUTCOME_SUCCESS), {
137
+ boolValue: false,
138
+ });
139
+ strict_1.default.deepEqual(attrs.get("customer_tier"), { stringValue: "enterprise" });
140
+ });
141
+ (0, node_test_1.it)("rejects an empty outcomeType", async () => {
142
+ await strict_1.default.rejects(() => newClient().recordOutcome({ outcomeType: "", workflowId: "wf-1" }), /outcomeType/);
143
+ strict_1.default.equal(mock.requests.length, 0);
144
+ });
145
+ (0, node_test_1.it)("rejects when neither workflowId nor sessionId is given", async () => {
146
+ await strict_1.default.rejects(() => newClient().recordOutcome({ outcomeType: "ticket_resolved" }), /workflowId or sessionId/);
147
+ strict_1.default.equal(mock.requests.length, 0);
148
+ });
149
+ });
150
+ //# sourceMappingURL=record-outcome.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"record-outcome.test.js","sourceRoot":"","sources":["../src/record-outcome.test.ts"],"names":[],"mappings":"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"}
package/dist/semconv.d.ts CHANGED
@@ -24,11 +24,19 @@ export declare const GenAIAttributes: {
24
24
  readonly SPAN_CREATE_AGENT: "create_agent";
25
25
  readonly SPAN_TOOL_CALL: "gen_ai.tool.call";
26
26
  readonly SPAN_LLM_CALL: "gen_ai.llm.call";
27
+ readonly SPAN_OUTCOME: "gen_ai.outcome";
28
+ readonly OUTCOME_EVENT_NAME: "gen_ai.outcome";
29
+ readonly EVENT_NAME: "event.name";
30
+ readonly OUTCOME_TYPE: "gen_ai.outcome.type";
31
+ readonly OUTCOME_SUCCESS: "gen_ai.outcome.success";
32
+ readonly OUTCOME_VALUE_USD: "gen_ai.outcome.value_usd";
27
33
  };
28
34
  export declare const TjAttributes: {
29
35
  readonly COST_USD: "tokenjam.cost_usd";
30
36
  readonly ALERT_TYPE: "tokenjam.alert.type";
31
37
  readonly ALERT_SEVERITY: "tokenjam.alert.severity";
38
+ readonly SESSION_ID: "session.id";
39
+ readonly WORKFLOW_ID: "tokenjam.workflow_id";
32
40
  readonly SANDBOX_EVENT: "tokenjam.sandbox.event";
33
41
  readonly EGRESS_HOST: "tokenjam.sandbox.egress_host";
34
42
  readonly EGRESS_PORT: "tokenjam.sandbox.egress_port";
package/dist/semconv.js CHANGED
@@ -27,11 +27,24 @@ exports.GenAIAttributes = {
27
27
  SPAN_CREATE_AGENT: "create_agent",
28
28
  SPAN_TOOL_CALL: "gen_ai.tool.call",
29
29
  SPAN_LLM_CALL: "gen_ai.llm.call",
30
+ // Outcome / feedback event (emerging gen_ai outcome-event semconv, OTel
31
+ // semconv issue #2665). recordOutcome() emits a span carrying these; the
32
+ // outcome-type attribute is the marker TokenJam Cloud's ROI ingest keys off.
33
+ SPAN_OUTCOME: "gen_ai.outcome",
34
+ OUTCOME_EVENT_NAME: "gen_ai.outcome",
35
+ EVENT_NAME: "event.name",
36
+ OUTCOME_TYPE: "gen_ai.outcome.type",
37
+ OUTCOME_SUCCESS: "gen_ai.outcome.success",
38
+ OUTCOME_VALUE_USD: "gen_ai.outcome.value_usd",
30
39
  };
31
40
  exports.TjAttributes = {
32
41
  COST_USD: "tokenjam.cost_usd",
33
42
  ALERT_TYPE: "tokenjam.alert.type",
34
43
  ALERT_SEVERITY: "tokenjam.alert.severity",
44
+ // session.id is the key the canonical OTLP parser reads for a span's session.
45
+ SESSION_ID: "session.id",
46
+ // Explicit workflow key for an outcome event (see recordOutcome).
47
+ WORKFLOW_ID: "tokenjam.workflow_id",
35
48
  SANDBOX_EVENT: "tokenjam.sandbox.event",
36
49
  EGRESS_HOST: "tokenjam.sandbox.egress_host",
37
50
  EGRESS_PORT: "tokenjam.sandbox.egress_port",
@@ -1 +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,mBAAmB;IAC7B,UAAU,EAAE,qBAAqB;IACjC,cAAc,EAAE,yBAAyB;IACzC,aAAa,EAAE,wBAAwB;IACvC,WAAW,EAAE,8BAA8B;IAC3C,WAAW,EAAE,8BAA8B;IAC3C,eAAe,EAAE,kCAAkC;IACnD,YAAY,EAAE,+BAA+B;CACrC,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"}
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;IAEhC,wEAAwE;IACxE,yEAAyE;IACzE,6EAA6E;IAC7E,YAAY,EAAE,gBAAgB;IAC9B,kBAAkB,EAAE,gBAAgB;IACpC,UAAU,EAAE,YAAY;IACxB,YAAY,EAAE,qBAAqB;IACnC,eAAe,EAAE,wBAAwB;IACzC,iBAAiB,EAAE,0BAA0B;CACrC,CAAC;AAEE,QAAA,YAAY,GAAG;IAC1B,QAAQ,EAAE,mBAAmB;IAC7B,UAAU,EAAE,qBAAqB;IACjC,cAAc,EAAE,yBAAyB;IACzC,8EAA8E;IAC9E,UAAU,EAAE,YAAY;IACxB,kEAAkE;IAClE,WAAW,EAAE,sBAAsB;IACnC,aAAa,EAAE,wBAAwB;IACvC,WAAW,EAAE,8BAA8B;IAC3C,WAAW,EAAE,8BAA8B;IAC3C,eAAe,EAAE,kCAAkC;IACnD,YAAY,EAAE,+BAA+B;CACrC,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"}
package/package.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@tokenjam/sdk",
3
- "version": "0.5.7",
3
+ "version": "0.6.0",
4
4
  "description": "TypeScript SDK for TokenJam — local-first observability for AI agents",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
7
7
  "scripts": {
8
8
  "build": "tsc",
9
- "test": "node --test dist/client.test.js dist/span-builder.test.js dist/semconv.test.js",
9
+ "test": "node --test dist/client.test.js dist/record-outcome.test.js dist/span-builder.test.js dist/semconv.test.js",
10
10
  "pretest": "tsc",
11
11
  "lint": "tsc --noEmit"
12
12
  },