@jenz-ai/sdk 0.1.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 ADDED
@@ -0,0 +1,86 @@
1
+ # @jenz-ai/sdk
2
+
3
+ Client SDK for [Jenz](https://jenz.dev) — observability for AI agents. Track runs, events, costs, and latency from any Node.js process.
4
+
5
+ ## Install
6
+
7
+ ```bash
8
+ npm install @jenz-ai/sdk
9
+ # or
10
+ pnpm add @jenz-ai/sdk
11
+ # or
12
+ yarn add @jenz-ai/sdk
13
+ ```
14
+
15
+ ## Usage
16
+
17
+ ```ts
18
+ import { Jenz } from '@jenz-ai/sdk';
19
+
20
+ const jenz = new Jenz({
21
+ apiKey: process.env.JENZ_API_KEY!,
22
+ baseUrl: process.env.JENZ_BASE_URL ?? 'https://api.jenz.dev',
23
+ agentName: 'my-agent',
24
+ agentType: 'scheduled',
25
+ });
26
+
27
+ const run = await jenz.startRun({
28
+ input: 'Summarize today’s sales report',
29
+ expectedDurationMs: 60_000,
30
+ });
31
+ if (!run) return; // backend unavailable — host-safe
32
+
33
+ const evt = run.startEvent({
34
+ type: 'llm_call',
35
+ model: 'claude-haiku-4-5',
36
+ input: prompt,
37
+ });
38
+
39
+ // ... call your LLM ...
40
+ const response = await callLlm(prompt);
41
+
42
+ await evt.finish({
43
+ output: response.text,
44
+ inputTokens: response.usage.input_tokens,
45
+ outputTokens: response.usage.output_tokens,
46
+ });
47
+
48
+ await run.finish({ status: 'completed', output: response.text });
49
+ ```
50
+
51
+ ## API
52
+
53
+ ### `new Jenz(options)`
54
+
55
+ | Option | Type | Description |
56
+ |---|---|---|
57
+ | `apiKey` | `string` | API key from your Jenz dashboard. |
58
+ | `baseUrl` | `string` | Backend URL. Defaults to `https://api.jenz.dev` (or set per environment). |
59
+ | `agentName` | `string` | Stable identifier for the agent (e.g. `seo-agent`). |
60
+ | `agentType` | `string` | Free-form classifier (e.g. `scheduled`, `webhook`, `chat`). |
61
+
62
+ ### `jenz.startRun({ input, expectedDurationMs?, metadata? })`
63
+
64
+ Starts a run. Returns `Run | null` — `null` indicates the backend was unreachable and the SDK gracefully no-op'd.
65
+
66
+ ### `run.startEvent({ type, model?, input, parentEventId?, metadata? })`
67
+
68
+ Starts an event under the run. `type` is `'llm_call' | 'tool_call' | 'log'`. Returns an `Event`.
69
+
70
+ ### `event.finish({ output, inputTokens?, outputTokens?, costUsd?, errorMessage?, metadata? })`
71
+
72
+ Finishes an event. If `costUsd` is omitted, the backend computes from `model` + tokens.
73
+
74
+ ### `run.finish({ status, output?, errorMessage?, metadata? })`
75
+
76
+ Finishes the run. `status` is `'completed' | 'errored' | 'stopped'`.
77
+
78
+ **Important:** Await all `event.finish()` calls before `run.finish()` — the backend sets the run's `endedAt` on the run-finish PATCH.
79
+
80
+ ## Failure model
81
+
82
+ The SDK is fire-and-forget: HTTP errors never throw. `Jenz.startRun` returns `null` on failure so your host process keeps running. `Run.finish` and `Event.finish` only throw on a programmer error (calling `finish()` twice on the same object).
83
+
84
+ ## License
85
+
86
+ MIT
package/dist/index.cjs ADDED
@@ -0,0 +1,177 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/index.ts
21
+ var index_exports = {};
22
+ __export(index_exports, {
23
+ Event: () => Event,
24
+ Jenz: () => Jenz,
25
+ Run: () => Run,
26
+ SDK_VERSION: () => SDK_VERSION
27
+ });
28
+ module.exports = __toCommonJS(index_exports);
29
+
30
+ // src/event.ts
31
+ var Event = class {
32
+ transport;
33
+ init;
34
+ startedAt = /* @__PURE__ */ new Date();
35
+ finished = false;
36
+ constructor(init) {
37
+ this.transport = init.transport;
38
+ this.init = init;
39
+ }
40
+ async finish(input) {
41
+ if (this.finished) throw new Error("Event already finished");
42
+ this.finished = true;
43
+ const endedAt = /* @__PURE__ */ new Date();
44
+ await this.transport.post("/v1/events", {
45
+ runId: this.init.runId,
46
+ parentEventId: this.init.parentEventId,
47
+ type: this.init.type,
48
+ model: this.init.model,
49
+ input: this.init.input,
50
+ output: input.output,
51
+ inputTokens: input.inputTokens,
52
+ outputTokens: input.outputTokens,
53
+ costUsd: input.costUsd,
54
+ errorMessage: input.errorMessage,
55
+ metadata: input.metadata ?? this.init.metadata,
56
+ startedAt: this.startedAt.toISOString(),
57
+ endedAt: endedAt.toISOString(),
58
+ latencyMs: endedAt.getTime() - this.startedAt.getTime()
59
+ });
60
+ }
61
+ };
62
+
63
+ // src/run.ts
64
+ var Run = class {
65
+ id;
66
+ transport;
67
+ finished = false;
68
+ constructor(init) {
69
+ this.id = init.runId;
70
+ this.transport = init.transport;
71
+ }
72
+ startEvent(input) {
73
+ const eventInit = {
74
+ transport: this.transport,
75
+ runId: this.id,
76
+ type: input.type,
77
+ parentEventId: input.parentEventId,
78
+ model: input.model,
79
+ input: input.input,
80
+ metadata: input.metadata
81
+ };
82
+ return new Event(eventInit);
83
+ }
84
+ /** Await all in-flight `Event.finish()` promises before calling — the run's
85
+ * `endedAt` is set server-side on the PATCH, so events that arrive after will
86
+ * not be associated with the run's duration in the dashboard. */
87
+ async finish(input) {
88
+ if (this.finished) throw new Error("Run already finished");
89
+ this.finished = true;
90
+ await this.transport.patch(`/v1/runs/${this.id}`, {
91
+ status: input.status,
92
+ output: input.output,
93
+ errorMessage: input.errorMessage,
94
+ metadata: input.metadata
95
+ });
96
+ }
97
+ };
98
+
99
+ // src/transport.ts
100
+ var Transport = class {
101
+ baseUrl;
102
+ apiKey;
103
+ constructor(opts) {
104
+ this.baseUrl = opts.baseUrl.replace(/\/$/, "");
105
+ this.apiKey = opts.apiKey;
106
+ }
107
+ async post(path, body) {
108
+ return await this.send("POST", path, body);
109
+ }
110
+ async patch(path, body) {
111
+ return await this.send("PATCH", path, body);
112
+ }
113
+ async get(path) {
114
+ return await this.send("GET", path, void 0);
115
+ }
116
+ async send(method, path, body) {
117
+ const url = `${this.baseUrl}${path}`;
118
+ try {
119
+ const res = await fetch(url, {
120
+ method,
121
+ headers: {
122
+ Authorization: `Bearer ${this.apiKey}`,
123
+ "Content-Type": "application/json"
124
+ },
125
+ body: body === void 0 ? void 0 : JSON.stringify(body)
126
+ });
127
+ if (!res.ok) {
128
+ const text = await res.text().catch(() => "");
129
+ console.error(`[jenz] ${method} ${path} \u2192 ${res.status} ${text}`);
130
+ return null;
131
+ }
132
+ if (res.status === 204) return null;
133
+ return await res.json();
134
+ } catch (err) {
135
+ console.error(`[jenz] ${method} ${path} failed:`, err);
136
+ return null;
137
+ }
138
+ }
139
+ };
140
+
141
+ // src/client.ts
142
+ var DEFAULT_BASE_URL = "https://api.jenz.run";
143
+ var Jenz = class {
144
+ transport;
145
+ agentName;
146
+ agentType;
147
+ constructor(opts) {
148
+ this.transport = new Transport({
149
+ baseUrl: opts.baseUrl ?? DEFAULT_BASE_URL,
150
+ apiKey: opts.apiKey
151
+ });
152
+ this.agentName = opts.agentName;
153
+ this.agentType = opts.agentType;
154
+ }
155
+ async startRun(input) {
156
+ const res = await this.transport.post("/v1/runs", {
157
+ agentName: this.agentName,
158
+ agentType: this.agentType,
159
+ input: input.input,
160
+ expectedDurationMs: input.expectedDurationMs,
161
+ metadata: input.metadata
162
+ });
163
+ if (!res) return null;
164
+ return new Run({ transport: this.transport, runId: res.runId });
165
+ }
166
+ };
167
+
168
+ // src/index.ts
169
+ var SDK_VERSION = "0.0.1";
170
+ // Annotate the CommonJS export names for ESM import in node:
171
+ 0 && (module.exports = {
172
+ Event,
173
+ Jenz,
174
+ Run,
175
+ SDK_VERSION
176
+ });
177
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/event.ts","../src/run.ts","../src/transport.ts","../src/client.ts"],"sourcesContent":["export { Jenz } from './client.js';\nexport { Run } from './run.js';\nexport { Event } from './event.js';\nexport type { JenzOptions, AgentType, StartRunInput } from './client.js';\nexport type { RunStatus, RunFinishInput, StartEventInput } from './run.js';\nexport type { EventType, EventFinishInput } from './event.js';\n\nexport const SDK_VERSION = '0.0.1';\n","import type { Transport } from './transport.js';\n\nexport type EventType = 'llm_call' | 'tool_call' | 'log';\n\nexport interface EventInit {\n transport: Transport;\n runId: string;\n parentEventId?: string;\n type: EventType;\n model?: string;\n input?: string;\n metadata?: Record<string, unknown>;\n}\n\nexport interface EventFinishInput {\n output?: string;\n inputTokens?: number;\n outputTokens?: number;\n costUsd?: number;\n errorMessage?: string;\n metadata?: Record<string, unknown>;\n}\n\nexport class Event {\n private readonly transport: Transport;\n private readonly init: EventInit;\n private readonly startedAt: Date = new Date();\n private finished = false;\n\n constructor(init: EventInit) {\n this.transport = init.transport;\n this.init = init;\n }\n\n async finish(input: EventFinishInput): Promise<void> {\n if (this.finished) throw new Error('Event already finished');\n this.finished = true;\n const endedAt = new Date();\n await this.transport.post('/v1/events', {\n runId: this.init.runId,\n parentEventId: this.init.parentEventId,\n type: this.init.type,\n model: this.init.model,\n input: this.init.input,\n output: input.output,\n inputTokens: input.inputTokens,\n outputTokens: input.outputTokens,\n costUsd: input.costUsd,\n errorMessage: input.errorMessage,\n metadata: input.metadata ?? this.init.metadata,\n startedAt: this.startedAt.toISOString(),\n endedAt: endedAt.toISOString(),\n latencyMs: endedAt.getTime() - this.startedAt.getTime(),\n });\n }\n}\n","import { Event, type EventInit, type EventType } from './event.js';\nimport type { Transport } from './transport.js';\n\nexport type RunStatus = 'running' | 'completed' | 'errored' | 'stopped';\n\nexport interface RunInit {\n transport: Transport;\n runId: string;\n}\n\nexport interface StartEventInput {\n type: EventType;\n parentEventId?: string;\n model?: string;\n input?: string;\n metadata?: Record<string, unknown>;\n}\n\nexport interface RunFinishInput {\n status: RunStatus;\n output?: string;\n errorMessage?: string;\n metadata?: Record<string, unknown>;\n}\n\nexport class Run {\n readonly id: string;\n private readonly transport: Transport;\n private finished = false;\n\n constructor(init: RunInit) {\n this.id = init.runId;\n this.transport = init.transport;\n }\n\n startEvent(input: StartEventInput): Event {\n const eventInit: EventInit = {\n transport: this.transport,\n runId: this.id,\n type: input.type,\n parentEventId: input.parentEventId,\n model: input.model,\n input: input.input,\n metadata: input.metadata,\n };\n return new Event(eventInit);\n }\n\n /** Await all in-flight `Event.finish()` promises before calling — the run's\n * `endedAt` is set server-side on the PATCH, so events that arrive after will\n * not be associated with the run's duration in the dashboard. */\n async finish(input: RunFinishInput): Promise<void> {\n if (this.finished) throw new Error('Run already finished');\n this.finished = true;\n await this.transport.patch(`/v1/runs/${this.id}`, {\n status: input.status,\n output: input.output,\n errorMessage: input.errorMessage,\n metadata: input.metadata,\n });\n }\n}\n","export interface TransportOptions {\n baseUrl: string;\n apiKey: string;\n}\n\nexport class Transport {\n private readonly baseUrl: string;\n private readonly apiKey: string;\n\n constructor(opts: TransportOptions) {\n this.baseUrl = opts.baseUrl.replace(/\\/$/, '');\n this.apiKey = opts.apiKey;\n }\n\n async post<T>(path: string, body: unknown): Promise<T | null> {\n return await this.send<T>('POST', path, body);\n }\n\n async patch<T>(path: string, body: unknown): Promise<T | null> {\n return await this.send<T>('PATCH', path, body);\n }\n\n async get<T>(path: string): Promise<T | null> {\n return await this.send<T>('GET', path, undefined);\n }\n\n private async send<T>(\n method: string,\n path: string,\n body: unknown,\n ): Promise<T | null> {\n const url = `${this.baseUrl}${path}`;\n try {\n const res = await fetch(url, {\n method,\n headers: {\n Authorization: `Bearer ${this.apiKey}`,\n 'Content-Type': 'application/json',\n },\n body: body === undefined ? undefined : JSON.stringify(body),\n });\n if (!res.ok) {\n const text = await res.text().catch(() => '');\n console.error(`[jenz] ${method} ${path} → ${res.status} ${text}`);\n return null;\n }\n if (res.status === 204) return null;\n return (await res.json()) as T;\n } catch (err) {\n console.error(`[jenz] ${method} ${path} failed:`, err);\n return null;\n }\n }\n}\n","import { Run } from './run.js';\nimport { Transport } from './transport.js';\n\nexport type AgentType = 'scheduled' | 'claude_code' | 'manual';\n\nexport interface JenzOptions {\n apiKey: string;\n baseUrl?: string;\n agentName: string;\n agentType: AgentType;\n}\n\nexport interface StartRunInput {\n input?: string;\n expectedDurationMs?: number;\n metadata?: Record<string, unknown>;\n}\n\nconst DEFAULT_BASE_URL = 'https://api.jenz.run';\n\nexport class Jenz {\n private readonly transport: Transport;\n private readonly agentName: string;\n private readonly agentType: AgentType;\n\n constructor(opts: JenzOptions) {\n this.transport = new Transport({\n baseUrl: opts.baseUrl ?? DEFAULT_BASE_URL,\n apiKey: opts.apiKey,\n });\n this.agentName = opts.agentName;\n this.agentType = opts.agentType;\n }\n\n async startRun(input: StartRunInput): Promise<Run | null> {\n const res = await this.transport.post<{ runId: string }>('/v1/runs', {\n agentName: this.agentName,\n agentType: this.agentType,\n input: input.input,\n expectedDurationMs: input.expectedDurationMs,\n metadata: input.metadata,\n });\n if (!res) return null;\n return new Run({ transport: this.transport, runId: res.runId });\n }\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,94 @@
1
+ interface TransportOptions {
2
+ baseUrl: string;
3
+ apiKey: string;
4
+ }
5
+ declare class Transport {
6
+ private readonly baseUrl;
7
+ private readonly apiKey;
8
+ constructor(opts: TransportOptions);
9
+ post<T>(path: string, body: unknown): Promise<T | null>;
10
+ patch<T>(path: string, body: unknown): Promise<T | null>;
11
+ get<T>(path: string): Promise<T | null>;
12
+ private send;
13
+ }
14
+
15
+ type EventType = 'llm_call' | 'tool_call' | 'log';
16
+ interface EventInit {
17
+ transport: Transport;
18
+ runId: string;
19
+ parentEventId?: string;
20
+ type: EventType;
21
+ model?: string;
22
+ input?: string;
23
+ metadata?: Record<string, unknown>;
24
+ }
25
+ interface EventFinishInput {
26
+ output?: string;
27
+ inputTokens?: number;
28
+ outputTokens?: number;
29
+ costUsd?: number;
30
+ errorMessage?: string;
31
+ metadata?: Record<string, unknown>;
32
+ }
33
+ declare class Event {
34
+ private readonly transport;
35
+ private readonly init;
36
+ private readonly startedAt;
37
+ private finished;
38
+ constructor(init: EventInit);
39
+ finish(input: EventFinishInput): Promise<void>;
40
+ }
41
+
42
+ type RunStatus = 'running' | 'completed' | 'errored' | 'stopped';
43
+ interface RunInit {
44
+ transport: Transport;
45
+ runId: string;
46
+ }
47
+ interface StartEventInput {
48
+ type: EventType;
49
+ parentEventId?: string;
50
+ model?: string;
51
+ input?: string;
52
+ metadata?: Record<string, unknown>;
53
+ }
54
+ interface RunFinishInput {
55
+ status: RunStatus;
56
+ output?: string;
57
+ errorMessage?: string;
58
+ metadata?: Record<string, unknown>;
59
+ }
60
+ declare class Run {
61
+ readonly id: string;
62
+ private readonly transport;
63
+ private finished;
64
+ constructor(init: RunInit);
65
+ startEvent(input: StartEventInput): Event;
66
+ /** Await all in-flight `Event.finish()` promises before calling — the run's
67
+ * `endedAt` is set server-side on the PATCH, so events that arrive after will
68
+ * not be associated with the run's duration in the dashboard. */
69
+ finish(input: RunFinishInput): Promise<void>;
70
+ }
71
+
72
+ type AgentType = 'scheduled' | 'claude_code' | 'manual';
73
+ interface JenzOptions {
74
+ apiKey: string;
75
+ baseUrl?: string;
76
+ agentName: string;
77
+ agentType: AgentType;
78
+ }
79
+ interface StartRunInput {
80
+ input?: string;
81
+ expectedDurationMs?: number;
82
+ metadata?: Record<string, unknown>;
83
+ }
84
+ declare class Jenz {
85
+ private readonly transport;
86
+ private readonly agentName;
87
+ private readonly agentType;
88
+ constructor(opts: JenzOptions);
89
+ startRun(input: StartRunInput): Promise<Run | null>;
90
+ }
91
+
92
+ declare const SDK_VERSION = "0.0.1";
93
+
94
+ export { type AgentType, Event, type EventFinishInput, type EventType, Jenz, type JenzOptions, Run, type RunFinishInput, type RunStatus, SDK_VERSION, type StartEventInput, type StartRunInput };
@@ -0,0 +1,94 @@
1
+ interface TransportOptions {
2
+ baseUrl: string;
3
+ apiKey: string;
4
+ }
5
+ declare class Transport {
6
+ private readonly baseUrl;
7
+ private readonly apiKey;
8
+ constructor(opts: TransportOptions);
9
+ post<T>(path: string, body: unknown): Promise<T | null>;
10
+ patch<T>(path: string, body: unknown): Promise<T | null>;
11
+ get<T>(path: string): Promise<T | null>;
12
+ private send;
13
+ }
14
+
15
+ type EventType = 'llm_call' | 'tool_call' | 'log';
16
+ interface EventInit {
17
+ transport: Transport;
18
+ runId: string;
19
+ parentEventId?: string;
20
+ type: EventType;
21
+ model?: string;
22
+ input?: string;
23
+ metadata?: Record<string, unknown>;
24
+ }
25
+ interface EventFinishInput {
26
+ output?: string;
27
+ inputTokens?: number;
28
+ outputTokens?: number;
29
+ costUsd?: number;
30
+ errorMessage?: string;
31
+ metadata?: Record<string, unknown>;
32
+ }
33
+ declare class Event {
34
+ private readonly transport;
35
+ private readonly init;
36
+ private readonly startedAt;
37
+ private finished;
38
+ constructor(init: EventInit);
39
+ finish(input: EventFinishInput): Promise<void>;
40
+ }
41
+
42
+ type RunStatus = 'running' | 'completed' | 'errored' | 'stopped';
43
+ interface RunInit {
44
+ transport: Transport;
45
+ runId: string;
46
+ }
47
+ interface StartEventInput {
48
+ type: EventType;
49
+ parentEventId?: string;
50
+ model?: string;
51
+ input?: string;
52
+ metadata?: Record<string, unknown>;
53
+ }
54
+ interface RunFinishInput {
55
+ status: RunStatus;
56
+ output?: string;
57
+ errorMessage?: string;
58
+ metadata?: Record<string, unknown>;
59
+ }
60
+ declare class Run {
61
+ readonly id: string;
62
+ private readonly transport;
63
+ private finished;
64
+ constructor(init: RunInit);
65
+ startEvent(input: StartEventInput): Event;
66
+ /** Await all in-flight `Event.finish()` promises before calling — the run's
67
+ * `endedAt` is set server-side on the PATCH, so events that arrive after will
68
+ * not be associated with the run's duration in the dashboard. */
69
+ finish(input: RunFinishInput): Promise<void>;
70
+ }
71
+
72
+ type AgentType = 'scheduled' | 'claude_code' | 'manual';
73
+ interface JenzOptions {
74
+ apiKey: string;
75
+ baseUrl?: string;
76
+ agentName: string;
77
+ agentType: AgentType;
78
+ }
79
+ interface StartRunInput {
80
+ input?: string;
81
+ expectedDurationMs?: number;
82
+ metadata?: Record<string, unknown>;
83
+ }
84
+ declare class Jenz {
85
+ private readonly transport;
86
+ private readonly agentName;
87
+ private readonly agentType;
88
+ constructor(opts: JenzOptions);
89
+ startRun(input: StartRunInput): Promise<Run | null>;
90
+ }
91
+
92
+ declare const SDK_VERSION = "0.0.1";
93
+
94
+ export { type AgentType, Event, type EventFinishInput, type EventType, Jenz, type JenzOptions, Run, type RunFinishInput, type RunStatus, SDK_VERSION, type StartEventInput, type StartRunInput };
package/dist/index.js ADDED
@@ -0,0 +1,147 @@
1
+ // src/event.ts
2
+ var Event = class {
3
+ transport;
4
+ init;
5
+ startedAt = /* @__PURE__ */ new Date();
6
+ finished = false;
7
+ constructor(init) {
8
+ this.transport = init.transport;
9
+ this.init = init;
10
+ }
11
+ async finish(input) {
12
+ if (this.finished) throw new Error("Event already finished");
13
+ this.finished = true;
14
+ const endedAt = /* @__PURE__ */ new Date();
15
+ await this.transport.post("/v1/events", {
16
+ runId: this.init.runId,
17
+ parentEventId: this.init.parentEventId,
18
+ type: this.init.type,
19
+ model: this.init.model,
20
+ input: this.init.input,
21
+ output: input.output,
22
+ inputTokens: input.inputTokens,
23
+ outputTokens: input.outputTokens,
24
+ costUsd: input.costUsd,
25
+ errorMessage: input.errorMessage,
26
+ metadata: input.metadata ?? this.init.metadata,
27
+ startedAt: this.startedAt.toISOString(),
28
+ endedAt: endedAt.toISOString(),
29
+ latencyMs: endedAt.getTime() - this.startedAt.getTime()
30
+ });
31
+ }
32
+ };
33
+
34
+ // src/run.ts
35
+ var Run = class {
36
+ id;
37
+ transport;
38
+ finished = false;
39
+ constructor(init) {
40
+ this.id = init.runId;
41
+ this.transport = init.transport;
42
+ }
43
+ startEvent(input) {
44
+ const eventInit = {
45
+ transport: this.transport,
46
+ runId: this.id,
47
+ type: input.type,
48
+ parentEventId: input.parentEventId,
49
+ model: input.model,
50
+ input: input.input,
51
+ metadata: input.metadata
52
+ };
53
+ return new Event(eventInit);
54
+ }
55
+ /** Await all in-flight `Event.finish()` promises before calling — the run's
56
+ * `endedAt` is set server-side on the PATCH, so events that arrive after will
57
+ * not be associated with the run's duration in the dashboard. */
58
+ async finish(input) {
59
+ if (this.finished) throw new Error("Run already finished");
60
+ this.finished = true;
61
+ await this.transport.patch(`/v1/runs/${this.id}`, {
62
+ status: input.status,
63
+ output: input.output,
64
+ errorMessage: input.errorMessage,
65
+ metadata: input.metadata
66
+ });
67
+ }
68
+ };
69
+
70
+ // src/transport.ts
71
+ var Transport = class {
72
+ baseUrl;
73
+ apiKey;
74
+ constructor(opts) {
75
+ this.baseUrl = opts.baseUrl.replace(/\/$/, "");
76
+ this.apiKey = opts.apiKey;
77
+ }
78
+ async post(path, body) {
79
+ return await this.send("POST", path, body);
80
+ }
81
+ async patch(path, body) {
82
+ return await this.send("PATCH", path, body);
83
+ }
84
+ async get(path) {
85
+ return await this.send("GET", path, void 0);
86
+ }
87
+ async send(method, path, body) {
88
+ const url = `${this.baseUrl}${path}`;
89
+ try {
90
+ const res = await fetch(url, {
91
+ method,
92
+ headers: {
93
+ Authorization: `Bearer ${this.apiKey}`,
94
+ "Content-Type": "application/json"
95
+ },
96
+ body: body === void 0 ? void 0 : JSON.stringify(body)
97
+ });
98
+ if (!res.ok) {
99
+ const text = await res.text().catch(() => "");
100
+ console.error(`[jenz] ${method} ${path} \u2192 ${res.status} ${text}`);
101
+ return null;
102
+ }
103
+ if (res.status === 204) return null;
104
+ return await res.json();
105
+ } catch (err) {
106
+ console.error(`[jenz] ${method} ${path} failed:`, err);
107
+ return null;
108
+ }
109
+ }
110
+ };
111
+
112
+ // src/client.ts
113
+ var DEFAULT_BASE_URL = "https://api.jenz.run";
114
+ var Jenz = class {
115
+ transport;
116
+ agentName;
117
+ agentType;
118
+ constructor(opts) {
119
+ this.transport = new Transport({
120
+ baseUrl: opts.baseUrl ?? DEFAULT_BASE_URL,
121
+ apiKey: opts.apiKey
122
+ });
123
+ this.agentName = opts.agentName;
124
+ this.agentType = opts.agentType;
125
+ }
126
+ async startRun(input) {
127
+ const res = await this.transport.post("/v1/runs", {
128
+ agentName: this.agentName,
129
+ agentType: this.agentType,
130
+ input: input.input,
131
+ expectedDurationMs: input.expectedDurationMs,
132
+ metadata: input.metadata
133
+ });
134
+ if (!res) return null;
135
+ return new Run({ transport: this.transport, runId: res.runId });
136
+ }
137
+ };
138
+
139
+ // src/index.ts
140
+ var SDK_VERSION = "0.0.1";
141
+ export {
142
+ Event,
143
+ Jenz,
144
+ Run,
145
+ SDK_VERSION
146
+ };
147
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/event.ts","../src/run.ts","../src/transport.ts","../src/client.ts","../src/index.ts"],"sourcesContent":["import type { Transport } from './transport.js';\n\nexport type EventType = 'llm_call' | 'tool_call' | 'log';\n\nexport interface EventInit {\n transport: Transport;\n runId: string;\n parentEventId?: string;\n type: EventType;\n model?: string;\n input?: string;\n metadata?: Record<string, unknown>;\n}\n\nexport interface EventFinishInput {\n output?: string;\n inputTokens?: number;\n outputTokens?: number;\n costUsd?: number;\n errorMessage?: string;\n metadata?: Record<string, unknown>;\n}\n\nexport class Event {\n private readonly transport: Transport;\n private readonly init: EventInit;\n private readonly startedAt: Date = new Date();\n private finished = false;\n\n constructor(init: EventInit) {\n this.transport = init.transport;\n this.init = init;\n }\n\n async finish(input: EventFinishInput): Promise<void> {\n if (this.finished) throw new Error('Event already finished');\n this.finished = true;\n const endedAt = new Date();\n await this.transport.post('/v1/events', {\n runId: this.init.runId,\n parentEventId: this.init.parentEventId,\n type: this.init.type,\n model: this.init.model,\n input: this.init.input,\n output: input.output,\n inputTokens: input.inputTokens,\n outputTokens: input.outputTokens,\n costUsd: input.costUsd,\n errorMessage: input.errorMessage,\n metadata: input.metadata ?? this.init.metadata,\n startedAt: this.startedAt.toISOString(),\n endedAt: endedAt.toISOString(),\n latencyMs: endedAt.getTime() - this.startedAt.getTime(),\n });\n }\n}\n","import { Event, type EventInit, type EventType } from './event.js';\nimport type { Transport } from './transport.js';\n\nexport type RunStatus = 'running' | 'completed' | 'errored' | 'stopped';\n\nexport interface RunInit {\n transport: Transport;\n runId: string;\n}\n\nexport interface StartEventInput {\n type: EventType;\n parentEventId?: string;\n model?: string;\n input?: string;\n metadata?: Record<string, unknown>;\n}\n\nexport interface RunFinishInput {\n status: RunStatus;\n output?: string;\n errorMessage?: string;\n metadata?: Record<string, unknown>;\n}\n\nexport class Run {\n readonly id: string;\n private readonly transport: Transport;\n private finished = false;\n\n constructor(init: RunInit) {\n this.id = init.runId;\n this.transport = init.transport;\n }\n\n startEvent(input: StartEventInput): Event {\n const eventInit: EventInit = {\n transport: this.transport,\n runId: this.id,\n type: input.type,\n parentEventId: input.parentEventId,\n model: input.model,\n input: input.input,\n metadata: input.metadata,\n };\n return new Event(eventInit);\n }\n\n /** Await all in-flight `Event.finish()` promises before calling — the run's\n * `endedAt` is set server-side on the PATCH, so events that arrive after will\n * not be associated with the run's duration in the dashboard. */\n async finish(input: RunFinishInput): Promise<void> {\n if (this.finished) throw new Error('Run already finished');\n this.finished = true;\n await this.transport.patch(`/v1/runs/${this.id}`, {\n status: input.status,\n output: input.output,\n errorMessage: input.errorMessage,\n metadata: input.metadata,\n });\n }\n}\n","export interface TransportOptions {\n baseUrl: string;\n apiKey: string;\n}\n\nexport class Transport {\n private readonly baseUrl: string;\n private readonly apiKey: string;\n\n constructor(opts: TransportOptions) {\n this.baseUrl = opts.baseUrl.replace(/\\/$/, '');\n this.apiKey = opts.apiKey;\n }\n\n async post<T>(path: string, body: unknown): Promise<T | null> {\n return await this.send<T>('POST', path, body);\n }\n\n async patch<T>(path: string, body: unknown): Promise<T | null> {\n return await this.send<T>('PATCH', path, body);\n }\n\n async get<T>(path: string): Promise<T | null> {\n return await this.send<T>('GET', path, undefined);\n }\n\n private async send<T>(\n method: string,\n path: string,\n body: unknown,\n ): Promise<T | null> {\n const url = `${this.baseUrl}${path}`;\n try {\n const res = await fetch(url, {\n method,\n headers: {\n Authorization: `Bearer ${this.apiKey}`,\n 'Content-Type': 'application/json',\n },\n body: body === undefined ? undefined : JSON.stringify(body),\n });\n if (!res.ok) {\n const text = await res.text().catch(() => '');\n console.error(`[jenz] ${method} ${path} → ${res.status} ${text}`);\n return null;\n }\n if (res.status === 204) return null;\n return (await res.json()) as T;\n } catch (err) {\n console.error(`[jenz] ${method} ${path} failed:`, err);\n return null;\n }\n }\n}\n","import { Run } from './run.js';\nimport { Transport } from './transport.js';\n\nexport type AgentType = 'scheduled' | 'claude_code' | 'manual';\n\nexport interface JenzOptions {\n apiKey: string;\n baseUrl?: string;\n agentName: string;\n agentType: AgentType;\n}\n\nexport interface StartRunInput {\n input?: string;\n expectedDurationMs?: number;\n metadata?: Record<string, unknown>;\n}\n\nconst DEFAULT_BASE_URL = 'https://api.jenz.run';\n\nexport class Jenz {\n private readonly transport: Transport;\n private readonly agentName: string;\n private readonly agentType: AgentType;\n\n constructor(opts: JenzOptions) {\n this.transport = new Transport({\n baseUrl: opts.baseUrl ?? DEFAULT_BASE_URL,\n apiKey: opts.apiKey,\n });\n this.agentName = opts.agentName;\n this.agentType = opts.agentType;\n }\n\n async startRun(input: StartRunInput): Promise<Run | null> {\n const res = await this.transport.post<{ runId: string }>('/v1/runs', {\n agentName: this.agentName,\n agentType: this.agentType,\n input: input.input,\n expectedDurationMs: input.expectedDurationMs,\n metadata: input.metadata,\n });\n if (!res) return null;\n return new Run({ transport: this.transport, runId: res.runId });\n }\n}\n","export { Jenz } from './client.js';\nexport { Run } from './run.js';\nexport { Event } from './event.js';\nexport type { JenzOptions, AgentType, StartRunInput } from './client.js';\nexport type { RunStatus, RunFinishInput, StartEventInput } from './run.js';\nexport type { EventType, EventFinishInput } from './event.js';\n\nexport const SDK_VERSION = '0.0.1';\n"],"mappings":"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","names":[]}
package/package.json ADDED
@@ -0,0 +1,57 @@
1
+ {
2
+ "name": "@jenz-ai/sdk",
3
+ "version": "0.1.0",
4
+ "description": "Client SDK for Jenz — observability for AI agents (runs, events, costs, latency).",
5
+ "type": "module",
6
+ "main": "./dist/index.cjs",
7
+ "module": "./dist/index.js",
8
+ "types": "./dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "import": {
12
+ "types": "./dist/index.d.ts",
13
+ "default": "./dist/index.js"
14
+ },
15
+ "require": {
16
+ "types": "./dist/index.d.cts",
17
+ "default": "./dist/index.cjs"
18
+ }
19
+ }
20
+ },
21
+ "files": ["dist", "README.md"],
22
+ "license": "MIT",
23
+ "homepage": "https://github.com/jenz-ai/jenz-mvp/tree/main/packages/sdk",
24
+ "repository": {
25
+ "type": "git",
26
+ "url": "git+https://github.com/jenz-ai/jenz-mvp.git",
27
+ "directory": "packages/sdk"
28
+ },
29
+ "bugs": {
30
+ "url": "https://github.com/jenz-ai/jenz-mvp/issues"
31
+ },
32
+ "keywords": [
33
+ "ai",
34
+ "agent",
35
+ "observability",
36
+ "tracing",
37
+ "llm",
38
+ "telemetry",
39
+ "jenz"
40
+ ],
41
+ "publishConfig": {
42
+ "access": "public"
43
+ },
44
+ "scripts": {
45
+ "build": "tsup",
46
+ "test": "vitest run",
47
+ "test:watch": "vitest",
48
+ "typecheck": "tsc --noEmit",
49
+ "prepublishOnly": "pnpm build && pnpm test"
50
+ },
51
+ "devDependencies": {
52
+ "@types/node": "^22.9.0",
53
+ "tsup": "^8.3.5",
54
+ "typescript": "^5.6.2",
55
+ "vitest": "^2.1.5"
56
+ }
57
+ }