lightrace 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.
Files changed (43) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +93 -0
  3. package/dist/client.d.ts +71 -0
  4. package/dist/client.d.ts.map +1 -0
  5. package/dist/client.js +116 -0
  6. package/dist/client.js.map +1 -0
  7. package/dist/exporter.d.ts +31 -0
  8. package/dist/exporter.d.ts.map +1 -0
  9. package/dist/exporter.js +88 -0
  10. package/dist/exporter.js.map +1 -0
  11. package/dist/index.d.ts +6 -0
  12. package/dist/index.d.ts.map +1 -0
  13. package/dist/index.js +4 -0
  14. package/dist/index.js.map +1 -0
  15. package/dist/integrations/langchain.d.ts +74 -0
  16. package/dist/integrations/langchain.d.ts.map +1 -0
  17. package/dist/integrations/langchain.js +337 -0
  18. package/dist/integrations/langchain.js.map +1 -0
  19. package/dist/observation.d.ts +58 -0
  20. package/dist/observation.d.ts.map +1 -0
  21. package/dist/observation.js +105 -0
  22. package/dist/observation.js.map +1 -0
  23. package/dist/security.d.ts +20 -0
  24. package/dist/security.d.ts.map +1 -0
  25. package/dist/security.js +46 -0
  26. package/dist/security.js.map +1 -0
  27. package/dist/tool-client.d.ts +32 -0
  28. package/dist/tool-client.d.ts.map +1 -0
  29. package/dist/tool-client.js +186 -0
  30. package/dist/tool-client.js.map +1 -0
  31. package/dist/trace.d.ts +25 -0
  32. package/dist/trace.d.ts.map +1 -0
  33. package/dist/trace.js +163 -0
  34. package/dist/trace.js.map +1 -0
  35. package/dist/types.d.ts +85 -0
  36. package/dist/types.d.ts.map +1 -0
  37. package/dist/types.js +17 -0
  38. package/dist/types.js.map +1 -0
  39. package/dist/utils.d.ts +7 -0
  40. package/dist/utils.d.ts.map +1 -0
  41. package/dist/utils.js +66 -0
  42. package/dist/utils.js.map +1 -0
  43. package/package.json +87 -0
@@ -0,0 +1,186 @@
1
+ /**
2
+ * WebSocket client for remote tool invocation.
3
+ */
4
+ import WebSocket from "ws";
5
+ import { _getToolRegistry } from "./trace.js";
6
+ import { generateId } from "./utils.js";
7
+ import { sign, verify, NonceTracker } from "./security.js";
8
+ import { jsonSerializable } from "./utils.js";
9
+ export class ToolClient {
10
+ host;
11
+ publicKey;
12
+ secretKey;
13
+ sdkInstanceId;
14
+ heartbeatInterval;
15
+ maxReconnectDelay;
16
+ sessionToken = null;
17
+ nonceTracker = new NonceTracker(60);
18
+ running = false;
19
+ ws = null;
20
+ reconnectTimer = null;
21
+ heartbeatTimer = null;
22
+ constructor(options) {
23
+ this.host = options.host.replace(/\/$/, "");
24
+ this.publicKey = options.publicKey;
25
+ this.secretKey = options.secretKey;
26
+ this.sdkInstanceId = options.sdkInstanceId ?? generateId();
27
+ this.heartbeatInterval = (options.heartbeatInterval ?? 30) * 1000;
28
+ this.maxReconnectDelay = (options.maxReconnectDelay ?? 30) * 1000;
29
+ }
30
+ get wsUrl() {
31
+ return (this.host.replace("http://", "ws://").replace("https://", "wss://") + "/api/public/tools/ws");
32
+ }
33
+ start() {
34
+ const registry = _getToolRegistry();
35
+ if (registry.size === 0)
36
+ return;
37
+ this.running = true;
38
+ this.connect(1000);
39
+ }
40
+ stop() {
41
+ this.running = false;
42
+ if (this.reconnectTimer)
43
+ clearTimeout(this.reconnectTimer);
44
+ if (this.heartbeatTimer)
45
+ clearInterval(this.heartbeatTimer);
46
+ if (this.ws) {
47
+ this.ws.close();
48
+ this.ws = null;
49
+ }
50
+ }
51
+ connect(delay) {
52
+ if (!this.running)
53
+ return;
54
+ const auth = Buffer.from(`${this.publicKey}:${this.secretKey}`).toString("base64");
55
+ const ws = new WebSocket(this.wsUrl, {
56
+ headers: { Authorization: `Basic ${auth}` },
57
+ });
58
+ ws.on("open", () => {
59
+ this.ws = ws;
60
+ });
61
+ ws.on("message", (data) => {
62
+ try {
63
+ const msg = JSON.parse(data.toString());
64
+ this.handleMessage(ws, msg);
65
+ }
66
+ catch {
67
+ // ignore malformed messages
68
+ }
69
+ });
70
+ ws.on("close", () => {
71
+ this.cleanup();
72
+ if (this.running) {
73
+ const nextDelay = Math.min(delay * 2, this.maxReconnectDelay);
74
+ this.reconnectTimer = setTimeout(() => this.connect(nextDelay), delay);
75
+ }
76
+ });
77
+ ws.on("error", () => {
78
+ // close event will handle reconnection
79
+ });
80
+ }
81
+ cleanup() {
82
+ if (this.heartbeatTimer) {
83
+ clearInterval(this.heartbeatTimer);
84
+ this.heartbeatTimer = null;
85
+ }
86
+ this.sessionToken = null;
87
+ this.ws = null;
88
+ }
89
+ handleMessage(ws, msg) {
90
+ switch (msg.type) {
91
+ case "connected":
92
+ this.sessionToken = msg.sessionToken;
93
+ this.registerTools(ws);
94
+ this.startHeartbeat(ws);
95
+ break;
96
+ case "registered":
97
+ // Tools registered successfully
98
+ break;
99
+ case "invoke":
100
+ this.handleInvoke(ws, msg);
101
+ break;
102
+ case "heartbeat_ack":
103
+ break;
104
+ case "error":
105
+ console.error(`[lightrace] Server error: ${msg.message}`);
106
+ break;
107
+ }
108
+ }
109
+ registerTools(ws) {
110
+ const registry = _getToolRegistry();
111
+ const tools = Array.from(registry.entries()).map(([name, entry]) => ({
112
+ name,
113
+ inputSchema: entry.inputSchema,
114
+ }));
115
+ ws.send(JSON.stringify({
116
+ type: "register",
117
+ sdkInstanceId: this.sdkInstanceId,
118
+ tools,
119
+ }));
120
+ }
121
+ startHeartbeat(ws) {
122
+ this.heartbeatTimer = setInterval(() => {
123
+ if (ws.readyState === WebSocket.OPEN) {
124
+ ws.send(JSON.stringify({ type: "heartbeat" }));
125
+ }
126
+ }, this.heartbeatInterval);
127
+ }
128
+ async handleInvoke(ws, msg) {
129
+ const { nonce, tool, input, signature: sig } = msg;
130
+ // Verify HMAC
131
+ if (!this.sessionToken || !verify(this.sessionToken, nonce, tool, input, sig)) {
132
+ ws.send(JSON.stringify({ type: "error", message: "Invalid signature" }));
133
+ return;
134
+ }
135
+ // Check nonce freshness
136
+ if (!this.nonceTracker.checkAndMark(nonce)) {
137
+ ws.send(JSON.stringify({ type: "error", message: "Replayed nonce" }));
138
+ return;
139
+ }
140
+ const registry = _getToolRegistry();
141
+ const entry = registry.get(tool);
142
+ if (!entry) {
143
+ ws.send(JSON.stringify({
144
+ type: "result",
145
+ nonce,
146
+ output: null,
147
+ error: `Tool not found: ${tool}`,
148
+ durationMs: 0,
149
+ signature: sign(this.sessionToken, nonce, tool, null),
150
+ }));
151
+ return;
152
+ }
153
+ const start = performance.now();
154
+ try {
155
+ let output;
156
+ if (input && typeof input === "object" && !Array.isArray(input)) {
157
+ output = await entry.fn(input);
158
+ }
159
+ else {
160
+ output = input !== null && input !== undefined ? await entry.fn(input) : await entry.fn();
161
+ }
162
+ const durationMs = Math.round(performance.now() - start);
163
+ output = jsonSerializable(output);
164
+ ws.send(JSON.stringify({
165
+ type: "result",
166
+ nonce,
167
+ output,
168
+ durationMs,
169
+ signature: sign(this.sessionToken, nonce, tool, output),
170
+ }));
171
+ }
172
+ catch (err) {
173
+ const durationMs = Math.round(performance.now() - start);
174
+ const error = err instanceof Error ? err.message : String(err);
175
+ ws.send(JSON.stringify({
176
+ type: "result",
177
+ nonce,
178
+ output: null,
179
+ error,
180
+ durationMs,
181
+ signature: sign(this.sessionToken, nonce, tool, null),
182
+ }));
183
+ }
184
+ }
185
+ }
186
+ //# sourceMappingURL=tool-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-client.js","sourceRoot":"","sources":["../src/tool-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import type { TraceOptions, ToolRegistryEntry } from "./types.js";
2
+ import type { BatchExporter } from "./exporter.js";
3
+ /** Context for trace propagation. */
4
+ interface TraceContext {
5
+ traceId: string;
6
+ observationId: string | null;
7
+ }
8
+ export declare function _setExporter(exporter: BatchExporter | null): void;
9
+ export declare function _setClientDefaults(defaults: {
10
+ userId?: string;
11
+ sessionId?: string;
12
+ }): void;
13
+ /** Get the current trace context (used by imperative API). */
14
+ export declare function _getTraceContext(): TraceContext | undefined;
15
+ export declare function _getToolRegistry(): Map<string, ToolRegistryEntry>;
16
+ /**
17
+ * Unified trace wrapper.
18
+ *
19
+ * Signatures:
20
+ * trace(name, fn) — root trace (no options)
21
+ * trace(name, options, fn) — with options
22
+ */
23
+ export declare function trace<T extends (...args: any[]) => any>(name: string, fnOrOptions: T | TraceOptions, maybeFn?: T): T;
24
+ export {};
25
+ //# sourceMappingURL=trace.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trace.d.ts","sourceRoot":"","sources":["../src/trace.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAc,YAAY,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAG9E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAEnD,qCAAqC;AACrC,UAAU,YAAY;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAaD,wBAAgB,YAAY,CAAC,QAAQ,EAAE,aAAa,GAAG,IAAI,GAAG,IAAI,CAEjE;AAED,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAE1F;AAED,8DAA8D;AAC9D,wBAAgB,gBAAgB,IAAI,YAAY,GAAG,SAAS,CAE3D;AAED,wBAAgB,gBAAgB,IAAI,GAAG,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAEjE;AAED;;;;;;GAMG;AACH,wBAAgB,KAAK,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,EACrD,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,CAAC,GAAG,YAAY,EAC7B,OAAO,CAAC,EAAE,CAAC,GACV,CAAC,CA4IH"}
package/dist/trace.js ADDED
@@ -0,0 +1,163 @@
1
+ /**
2
+ * Unified trace() wrapper for all observation types.
3
+ */
4
+ import { AsyncLocalStorage } from "node:async_hooks";
5
+ import { EVENT_TYPE_MAP, OBSERVATION_TYPE_ENUM } from "./types.js";
6
+ import { generateId, jsonSerializable, zodToJsonSchema } from "./utils.js";
7
+ const asyncStorage = new AsyncLocalStorage();
8
+ /** Global exporter reference (set by Client). */
9
+ let _exporter = null;
10
+ /** Client-level defaults (set by Client to avoid circular imports). */
11
+ let _clientDefaults = {};
12
+ /** Global tool registry for invocable tools. */
13
+ const _toolRegistry = new Map();
14
+ export function _setExporter(exporter) {
15
+ _exporter = exporter;
16
+ }
17
+ export function _setClientDefaults(defaults) {
18
+ _clientDefaults = defaults;
19
+ }
20
+ /** Get the current trace context (used by imperative API). */
21
+ export function _getTraceContext() {
22
+ return asyncStorage.getStore();
23
+ }
24
+ export function _getToolRegistry() {
25
+ return _toolRegistry;
26
+ }
27
+ /**
28
+ * Unified trace wrapper.
29
+ *
30
+ * Signatures:
31
+ * trace(name, fn) — root trace (no options)
32
+ * trace(name, options, fn) — with options
33
+ */
34
+ export function trace(name, fnOrOptions, maybeFn) {
35
+ let options;
36
+ let fn;
37
+ if (typeof fnOrOptions === "function") {
38
+ options = {};
39
+ fn = fnOrOptions;
40
+ }
41
+ else {
42
+ options = fnOrOptions;
43
+ fn = maybeFn;
44
+ }
45
+ const obsName = options.name ?? name;
46
+ const obsType = options.type ?? null;
47
+ const model = options.model ?? null;
48
+ const staticMetadata = options.metadata ?? null;
49
+ const invoke = options.invoke !== false; // default true
50
+ const usage = options.usage ?? null;
51
+ // Resolve userId/sessionId: per-trace option > client default
52
+ const userId = options.userId ?? _clientDefaults.userId;
53
+ const sessionId = options.sessionId ?? _clientDefaults.sessionId;
54
+ // Register tool for remote invocation
55
+ if (obsType === "tool" && invoke) {
56
+ const inputSchema = options.inputSchema ? zodToJsonSchema(options.inputSchema) : null;
57
+ _toolRegistry.set(obsName, {
58
+ fn: fn,
59
+ inputSchema,
60
+ });
61
+ }
62
+ const wrapped = ((...args) => {
63
+ const isRoot = obsType === null;
64
+ const entityId = generateId();
65
+ const startTime = new Date();
66
+ // Get parent context
67
+ const parentCtx = asyncStorage.getStore();
68
+ const traceId = isRoot ? entityId : (parentCtx?.traceId ?? generateId());
69
+ const parentObservationId = isRoot ? null : (parentCtx?.observationId ?? null);
70
+ // Set context for children
71
+ const childCtx = {
72
+ traceId,
73
+ observationId: isRoot ? null : entityId,
74
+ };
75
+ const emitEvent = (output, level, statusMessage) => {
76
+ const endTime = new Date();
77
+ const capturedInput = jsonSerializable(args.length === 1 ? args[0] : args);
78
+ if (isRoot) {
79
+ const body = {
80
+ id: entityId,
81
+ name: obsName,
82
+ timestamp: startTime.toISOString(),
83
+ input: capturedInput,
84
+ output: jsonSerializable(output),
85
+ metadata: staticMetadata,
86
+ };
87
+ if (userId !== undefined)
88
+ body.userId = userId;
89
+ if (sessionId !== undefined)
90
+ body.sessionId = sessionId;
91
+ const event = {
92
+ id: generateId(),
93
+ type: "trace-create",
94
+ timestamp: startTime.toISOString(),
95
+ body,
96
+ };
97
+ _exporter?.enqueue(event);
98
+ }
99
+ else {
100
+ const createType = EVENT_TYPE_MAP[obsType]?.[0] ?? "span-create";
101
+ const body = {
102
+ id: entityId,
103
+ traceId,
104
+ type: OBSERVATION_TYPE_ENUM[obsType] ?? obsType,
105
+ name: obsName,
106
+ startTime: startTime.toISOString(),
107
+ endTime: endTime.toISOString(),
108
+ input: capturedInput,
109
+ output: jsonSerializable(output),
110
+ metadata: staticMetadata,
111
+ model,
112
+ level,
113
+ statusMessage,
114
+ parentObservationId,
115
+ };
116
+ // Add usage fields for generation observations
117
+ if (usage && obsType === "generation") {
118
+ if (usage.promptTokens !== undefined)
119
+ body.promptTokens = usage.promptTokens;
120
+ if (usage.completionTokens !== undefined)
121
+ body.completionTokens = usage.completionTokens;
122
+ if (usage.totalTokens !== undefined)
123
+ body.totalTokens = usage.totalTokens;
124
+ }
125
+ const event = {
126
+ id: generateId(),
127
+ type: createType,
128
+ timestamp: startTime.toISOString(),
129
+ body,
130
+ };
131
+ _exporter?.enqueue(event);
132
+ }
133
+ };
134
+ const execute = () => {
135
+ try {
136
+ const result = fn(...args);
137
+ // Handle async functions
138
+ if (result && typeof result === "object" && typeof result.then === "function") {
139
+ return result.then((resolved) => {
140
+ emitEvent(resolved, "DEFAULT", null);
141
+ return resolved;
142
+ }, (err) => {
143
+ emitEvent(null, "ERROR", err.message ?? String(err));
144
+ throw err;
145
+ });
146
+ }
147
+ // Sync result
148
+ emitEvent(result, "DEFAULT", null);
149
+ return result;
150
+ }
151
+ catch (err) {
152
+ const message = err instanceof Error ? err.message : String(err);
153
+ emitEvent(null, "ERROR", message);
154
+ throw err;
155
+ }
156
+ };
157
+ return asyncStorage.run(childCtx, execute);
158
+ });
159
+ // Preserve function name
160
+ Object.defineProperty(wrapped, "name", { value: fn.name || name });
161
+ return wrapped;
162
+ }
163
+ //# sourceMappingURL=trace.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trace.js","sourceRoot":"","sources":["../src/trace.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,85 @@
1
+ /** Observation types supported by lightrace. */
2
+ export type ObservationType = "span" | "generation" | "event" | "tool" | "chain";
3
+ /** Map user-facing type strings to ingestion event types [create, update]. */
4
+ export declare const EVENT_TYPE_MAP: Record<string, [createType: string, updateType: string]>;
5
+ /** Map type strings to observation type enum values. */
6
+ export declare const OBSERVATION_TYPE_ENUM: Record<string, string>;
7
+ /** Token / cost tracking for generation observations. */
8
+ export interface UsageDetails {
9
+ promptTokens?: number;
10
+ completionTokens?: number;
11
+ totalTokens?: number;
12
+ }
13
+ /** Options for the trace() wrapper. */
14
+ export interface TraceOptions {
15
+ /** Observation type. undefined = root trace. */
16
+ type?: ObservationType;
17
+ /** Override observation name (defaults to the name argument). */
18
+ name?: string;
19
+ /** For type="tool": register for remote invocation. Default: true. */
20
+ invoke?: boolean;
21
+ /** For type="generation": LLM model name. */
22
+ model?: string;
23
+ /** Optional Zod schema for tool input (auto-converted to JSON Schema). */
24
+ inputSchema?: {
25
+ _def?: unknown;
26
+ };
27
+ /** Static metadata attached to every call. */
28
+ metadata?: Record<string, unknown>;
29
+ /** User ID for this trace/observation. */
30
+ userId?: string;
31
+ /** Session ID for this trace/observation. */
32
+ sessionId?: string;
33
+ /** Token usage for generation observations. */
34
+ usage?: UsageDetails;
35
+ }
36
+ /** A single event to be batched and sent to the ingestion endpoint. */
37
+ export interface TraceEvent {
38
+ id: string;
39
+ type: string;
40
+ timestamp: string;
41
+ body: Record<string, unknown>;
42
+ }
43
+ /** Tool registration entry in the local registry. */
44
+ export interface ToolRegistryEntry {
45
+ fn: (...args: unknown[]) => unknown;
46
+ inputSchema: Record<string, unknown> | null;
47
+ }
48
+ /** WebSocket messages from SDK to backend. */
49
+ export type SdkMessage = {
50
+ type: "register";
51
+ sdkInstanceId: string;
52
+ tools: Array<{
53
+ name: string;
54
+ inputSchema: unknown;
55
+ }>;
56
+ } | {
57
+ type: "result";
58
+ nonce: string;
59
+ output: unknown;
60
+ error?: string;
61
+ durationMs: number;
62
+ signature: string;
63
+ } | {
64
+ type: "heartbeat";
65
+ };
66
+ /** WebSocket messages from backend to SDK. */
67
+ export type ServerMessage = {
68
+ type: "connected";
69
+ sessionToken: string;
70
+ } | {
71
+ type: "registered";
72
+ tools: string[];
73
+ } | {
74
+ type: "invoke";
75
+ nonce: string;
76
+ tool: string;
77
+ input: unknown;
78
+ signature: string;
79
+ } | {
80
+ type: "heartbeat_ack";
81
+ } | {
82
+ type: "error";
83
+ message: string;
84
+ };
85
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js ADDED
@@ -0,0 +1,17 @@
1
+ /** Map user-facing type strings to ingestion event types [create, update]. */
2
+ export const EVENT_TYPE_MAP = {
3
+ span: ["span-create", "span-update"],
4
+ generation: ["generation-create", "generation-update"],
5
+ event: ["event-create", "event-create"],
6
+ tool: ["tool-create", "tool-update"],
7
+ chain: ["chain-create", "chain-update"],
8
+ };
9
+ /** Map type strings to observation type enum values. */
10
+ export const OBSERVATION_TYPE_ENUM = {
11
+ span: "SPAN",
12
+ generation: "GENERATION",
13
+ event: "EVENT",
14
+ tool: "TOOL",
15
+ chain: "CHAIN",
16
+ };
17
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAGA,8EAA8E;AAC9E,MAAM,CAAC,MAAM,cAAc,GAA6D;IACtF,IAAI,EAAE,CAAC,aAAa,EAAE,aAAa,CAAC;IACpC,UAAU,EAAE,CAAC,mBAAmB,EAAE,mBAAmB,CAAC;IACtD,KAAK,EAAE,CAAC,cAAc,EAAE,cAAc,CAAC;IACvC,IAAI,EAAE,CAAC,aAAa,EAAE,aAAa,CAAC;IACpC,KAAK,EAAE,CAAC,cAAc,EAAE,cAAc,CAAC;CACxC,CAAC;AAEF,wDAAwD;AACxD,MAAM,CAAC,MAAM,qBAAqB,GAA2B;IAC3D,IAAI,EAAE,MAAM;IACZ,UAAU,EAAE,YAAY;IACxB,KAAK,EAAE,OAAO;IACd,IAAI,EAAE,MAAM;IACZ,KAAK,EAAE,OAAO;CACf,CAAC"}
@@ -0,0 +1,7 @@
1
+ /** Generate a unique ID. */
2
+ export declare function generateId(): string;
3
+ /** Make a value JSON-serializable. */
4
+ export declare function jsonSerializable(value: unknown): unknown;
5
+ /** Convert a Zod schema to JSON Schema (basic). */
6
+ export declare function zodToJsonSchema(schema: unknown): Record<string, unknown> | null;
7
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAEA,4BAA4B;AAC5B,wBAAgB,UAAU,IAAI,MAAM,CAEnC;AAED,sCAAsC;AACtC,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAcxD;AAED,mDAAmD;AACnD,wBAAgB,eAAe,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAwC/E"}
package/dist/utils.js ADDED
@@ -0,0 +1,66 @@
1
+ import { randomUUID } from "node:crypto";
2
+ /** Generate a unique ID. */
3
+ export function generateId() {
4
+ return randomUUID();
5
+ }
6
+ /** Make a value JSON-serializable. */
7
+ export function jsonSerializable(value) {
8
+ if (value === null || value === undefined)
9
+ return value;
10
+ if (typeof value === "string" || typeof value === "number" || typeof value === "boolean")
11
+ return value;
12
+ if (value instanceof Date)
13
+ return value.toISOString();
14
+ if (Array.isArray(value))
15
+ return value.map(jsonSerializable);
16
+ if (typeof value === "object") {
17
+ const result = {};
18
+ for (const [k, v] of Object.entries(value)) {
19
+ result[k] = jsonSerializable(v);
20
+ }
21
+ return result;
22
+ }
23
+ return String(value);
24
+ }
25
+ /** Convert a Zod schema to JSON Schema (basic). */
26
+ export function zodToJsonSchema(schema) {
27
+ if (!schema || typeof schema !== "object")
28
+ return null;
29
+ const s = schema;
30
+ if (!s._def)
31
+ return null;
32
+ // Handle ZodObject
33
+ if (s._def.typeName === "ZodObject" && typeof s._def.shape === "function") {
34
+ const shape = s._def.shape();
35
+ const properties = {};
36
+ const required = [];
37
+ for (const [key, field] of Object.entries(shape)) {
38
+ const f = field;
39
+ if (!f._def)
40
+ continue;
41
+ let typeName = f._def.typeName;
42
+ // Unwrap ZodOptional
43
+ if (typeName === "ZodOptional" && f._def.innerType) {
44
+ const inner = f._def.innerType;
45
+ typeName = inner._def?.typeName;
46
+ }
47
+ else {
48
+ required.push(key);
49
+ }
50
+ const typeMap = {
51
+ ZodString: "string",
52
+ ZodNumber: "number",
53
+ ZodBoolean: "boolean",
54
+ ZodArray: "array",
55
+ ZodObject: "object",
56
+ };
57
+ properties[key] = { type: typeMap[typeName ?? ""] ?? "string" };
58
+ }
59
+ const result = { type: "object", properties };
60
+ if (required.length)
61
+ result.required = required;
62
+ return result;
63
+ }
64
+ return null;
65
+ }
66
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"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"}