@jenz-ai/sdk 0.1.0 → 0.1.1
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 +1 -2
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -19,7 +19,6 @@ import { Jenz } from '@jenz-ai/sdk';
|
|
|
19
19
|
|
|
20
20
|
const jenz = new Jenz({
|
|
21
21
|
apiKey: process.env.JENZ_API_KEY!,
|
|
22
|
-
baseUrl: process.env.JENZ_BASE_URL ?? 'https://api.jenz.dev',
|
|
23
22
|
agentName: 'my-agent',
|
|
24
23
|
agentType: 'scheduled',
|
|
25
24
|
});
|
|
@@ -55,9 +54,9 @@ await run.finish({ status: 'completed', output: response.text });
|
|
|
55
54
|
| Option | Type | Description |
|
|
56
55
|
|---|---|---|
|
|
57
56
|
| `apiKey` | `string` | API key from your Jenz dashboard. |
|
|
58
|
-
| `baseUrl` | `string` | Backend URL. Defaults to `https://api.jenz.dev` (or set per environment). |
|
|
59
57
|
| `agentName` | `string` | Stable identifier for the agent (e.g. `seo-agent`). |
|
|
60
58
|
| `agentType` | `string` | Free-form classifier (e.g. `scheduled`, `webhook`, `chat`). |
|
|
59
|
+
| `baseUrl` | `string` _(optional)_ | Override the backend URL. Defaults to `https://api.jenz.dev` — only set this for self-hosted or local-dev. |
|
|
61
60
|
|
|
62
61
|
### `jenz.startRun({ input, expectedDurationMs?, metadata? })`
|
|
63
62
|
|
package/dist/index.cjs
CHANGED
package/dist/index.cjs.map
CHANGED
|
@@ -1 +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.
|
|
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.dev';\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":[]}
|
package/dist/index.js
CHANGED
package/dist/index.js.map
CHANGED
|
@@ -1 +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.
|
|
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.dev';\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":[]}
|