@patternzones/koine-sdk 1.0.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.
@@ -0,0 +1,39 @@
1
+ import type { z } from "zod";
2
+ import type { KoineConfig, KoineStreamResult, KoineUsage } from "./types.js";
3
+ /**
4
+ * Generates plain text response from Koine gateway service.
5
+ */
6
+ export declare function generateText(config: KoineConfig, options: {
7
+ system?: string;
8
+ prompt: string;
9
+ sessionId?: string;
10
+ }): Promise<{
11
+ text: string;
12
+ usage: KoineUsage;
13
+ sessionId: string;
14
+ }>;
15
+ /**
16
+ * Streams text response from Koine gateway service.
17
+ * Returns a ReadableStream of text chunks that can be consumed as they arrive.
18
+ */
19
+ export declare function streamText(config: KoineConfig, options: {
20
+ system?: string;
21
+ prompt: string;
22
+ sessionId?: string;
23
+ }): Promise<KoineStreamResult>;
24
+ /**
25
+ * Generates structured JSON response from Koine gateway service.
26
+ * Converts Zod schema to JSON Schema for the gateway service.
27
+ */
28
+ export declare function generateObject<T>(config: KoineConfig, options: {
29
+ system?: string;
30
+ prompt: string;
31
+ schema: z.ZodSchema<T>;
32
+ sessionId?: string;
33
+ }): Promise<{
34
+ object: T;
35
+ rawText: string;
36
+ usage: KoineUsage;
37
+ sessionId: string;
38
+ }>;
39
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAG7B,OAAO,KAAK,EAIX,WAAW,EACX,iBAAiB,EACjB,UAAU,EAIV,MAAM,YAAY,CAAC;AAcpB;;GAEG;AACH,wBAAsB,YAAY,CACjC,MAAM,EAAE,WAAW,EACnB,OAAO,EAAE;IACR,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB,GACC,OAAO,CAAC;IACV,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,UAAU,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CAClB,CAAC,CAsCD;AAkED;;;GAGG;AACH,wBAAsB,UAAU,CAC/B,MAAM,EAAE,WAAW,EACnB,OAAO,EAAE;IACR,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB,GACC,OAAO,CAAC,iBAAiB,CAAC,CAiK5B;AAED;;;GAGG;AACH,wBAAsB,cAAc,CAAC,CAAC,EACrC,MAAM,EAAE,WAAW,EACnB,OAAO,EAAE;IACR,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB,GACC,OAAO,CAAC;IACV,MAAM,EAAE,CAAC,CAAC;IACV,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,UAAU,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CAClB,CAAC,CAwDD"}
package/dist/client.js ADDED
@@ -0,0 +1,286 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.generateText = generateText;
4
+ exports.streamText = streamText;
5
+ exports.generateObject = generateObject;
6
+ const zod_to_json_schema_1 = require("zod-to-json-schema");
7
+ const errors_js_1 = require("./errors.js");
8
+ /**
9
+ * Safely parses JSON from a response, handling non-JSON bodies gracefully.
10
+ */
11
+ async function safeJsonParse(response) {
12
+ const text = await response.text();
13
+ try {
14
+ return JSON.parse(text);
15
+ }
16
+ catch {
17
+ return null;
18
+ }
19
+ }
20
+ /**
21
+ * Generates plain text response from Koine gateway service.
22
+ */
23
+ async function generateText(config, options) {
24
+ const response = await fetch(`${config.baseUrl}/generate-text`, {
25
+ method: "POST",
26
+ headers: {
27
+ "Content-Type": "application/json",
28
+ Authorization: `Bearer ${config.authKey}`,
29
+ },
30
+ body: JSON.stringify({
31
+ system: options.system,
32
+ prompt: options.prompt,
33
+ sessionId: options.sessionId,
34
+ model: config.model,
35
+ }),
36
+ signal: AbortSignal.timeout(config.timeout),
37
+ });
38
+ if (!response.ok) {
39
+ const errorBody = await safeJsonParse(response);
40
+ throw new errors_js_1.KoineError(errorBody?.error || `HTTP ${response.status} ${response.statusText}`, errorBody?.code || "HTTP_ERROR", errorBody?.rawText);
41
+ }
42
+ const result = await safeJsonParse(response);
43
+ if (!result) {
44
+ throw new errors_js_1.KoineError("Invalid response from Koine gateway: expected JSON", "INVALID_RESPONSE");
45
+ }
46
+ return {
47
+ text: result.text,
48
+ usage: result.usage,
49
+ sessionId: result.sessionId,
50
+ };
51
+ }
52
+ /**
53
+ * Parses SSE events from a ReadableStream.
54
+ * SSE format: "event: name\ndata: {...}\n\n"
55
+ */
56
+ function createSSEParser() {
57
+ let buffer = "";
58
+ // Reuse decoder with stream mode to correctly handle multi-byte UTF-8 chars spanning chunks
59
+ const decoder = new TextDecoder();
60
+ return new TransformStream({
61
+ transform(chunk, controller) {
62
+ buffer += decoder.decode(chunk, { stream: true });
63
+ // SSE events are separated by double newlines
64
+ const events = buffer.split("\n\n");
65
+ // Keep the last potentially incomplete event in the buffer
66
+ buffer = events.pop() || "";
67
+ for (const eventStr of events) {
68
+ if (!eventStr.trim())
69
+ continue;
70
+ const lines = eventStr.split("\n");
71
+ let eventType = "";
72
+ let data = "";
73
+ for (const line of lines) {
74
+ if (line.startsWith("event: ")) {
75
+ eventType = line.slice(7);
76
+ }
77
+ else if (line.startsWith("data: ")) {
78
+ data = line.slice(6);
79
+ }
80
+ }
81
+ if (eventType && data) {
82
+ controller.enqueue({ event: eventType, data });
83
+ }
84
+ }
85
+ },
86
+ flush(controller) {
87
+ // Process any remaining data in buffer
88
+ if (buffer.trim()) {
89
+ const lines = buffer.split("\n");
90
+ let eventType = "";
91
+ let data = "";
92
+ for (const line of lines) {
93
+ if (line.startsWith("event: ")) {
94
+ eventType = line.slice(7);
95
+ }
96
+ else if (line.startsWith("data: ")) {
97
+ data = line.slice(6);
98
+ }
99
+ }
100
+ if (eventType && data) {
101
+ controller.enqueue({ event: eventType, data });
102
+ }
103
+ }
104
+ },
105
+ });
106
+ }
107
+ /**
108
+ * Streams text response from Koine gateway service.
109
+ * Returns a ReadableStream of text chunks that can be consumed as they arrive.
110
+ */
111
+ async function streamText(config, options) {
112
+ const response = await fetch(`${config.baseUrl}/stream`, {
113
+ method: "POST",
114
+ headers: {
115
+ "Content-Type": "application/json",
116
+ Authorization: `Bearer ${config.authKey}`,
117
+ },
118
+ body: JSON.stringify({
119
+ system: options.system,
120
+ prompt: options.prompt,
121
+ sessionId: options.sessionId,
122
+ model: config.model,
123
+ }),
124
+ signal: AbortSignal.timeout(config.timeout),
125
+ });
126
+ if (!response.ok) {
127
+ const errorBody = await safeJsonParse(response);
128
+ throw new errors_js_1.KoineError(errorBody?.error || `HTTP ${response.status} ${response.statusText}`, errorBody?.code || "HTTP_ERROR", errorBody?.rawText);
129
+ }
130
+ if (!response.body) {
131
+ throw new errors_js_1.KoineError("No response body from Koine gateway", "NO_RESPONSE_BODY");
132
+ }
133
+ // Set up promises for session, usage, and accumulated text
134
+ let resolveSessionId;
135
+ let rejectSessionId;
136
+ const sessionIdPromise = new Promise((resolve, reject) => {
137
+ resolveSessionId = resolve;
138
+ rejectSessionId = reject;
139
+ });
140
+ let resolveUsage;
141
+ let rejectUsage;
142
+ const usagePromise = new Promise((resolve, reject) => {
143
+ resolveUsage = resolve;
144
+ rejectUsage = reject;
145
+ });
146
+ let resolveText;
147
+ let rejectText;
148
+ const textPromise = new Promise((resolve, reject) => {
149
+ resolveText = resolve;
150
+ rejectText = reject;
151
+ });
152
+ let accumulatedText = "";
153
+ let sessionIdReceived = false;
154
+ let usageReceived = false;
155
+ // Transform SSE events into text chunks
156
+ const textStream = response.body.pipeThrough(createSSEParser()).pipeThrough(new TransformStream({
157
+ transform(sseEvent, controller) {
158
+ // Critical events (session, result, error, done) must propagate parse errors
159
+ // Text events can log and continue - degraded content is better than total failure
160
+ const isCriticalEvent = ["session", "result", "error", "done"].includes(sseEvent.event);
161
+ try {
162
+ switch (sseEvent.event) {
163
+ case "session": {
164
+ const parsed = JSON.parse(sseEvent.data);
165
+ if (!sessionIdReceived) {
166
+ sessionIdReceived = true;
167
+ resolveSessionId(parsed.sessionId);
168
+ }
169
+ break;
170
+ }
171
+ case "text": {
172
+ const parsed = JSON.parse(sseEvent.data);
173
+ accumulatedText += parsed.text;
174
+ controller.enqueue(parsed.text);
175
+ break;
176
+ }
177
+ case "result": {
178
+ const parsed = JSON.parse(sseEvent.data);
179
+ usageReceived = true;
180
+ resolveUsage(parsed.usage);
181
+ if (!sessionIdReceived) {
182
+ sessionIdReceived = true;
183
+ resolveSessionId(parsed.sessionId);
184
+ }
185
+ break;
186
+ }
187
+ case "error": {
188
+ const parsed = JSON.parse(sseEvent.data);
189
+ const error = new errors_js_1.KoineError(parsed.error, parsed.code || "STREAM_ERROR");
190
+ usageReceived = true; // Prevent double rejection in flush
191
+ rejectUsage(error);
192
+ rejectText(error);
193
+ if (!sessionIdReceived) {
194
+ rejectSessionId(error);
195
+ }
196
+ controller.error(error);
197
+ break;
198
+ }
199
+ case "done": {
200
+ // Stream complete, resolve the text promise
201
+ resolveText(accumulatedText);
202
+ break;
203
+ }
204
+ }
205
+ }
206
+ catch (parseError) {
207
+ if (isCriticalEvent) {
208
+ // Critical event parse failure - propagate error
209
+ const error = new errors_js_1.KoineError(`Failed to parse critical SSE event: ${sseEvent.event}`, "SSE_PARSE_ERROR");
210
+ if (!usageReceived) {
211
+ usageReceived = true;
212
+ rejectUsage(error);
213
+ }
214
+ rejectText(error);
215
+ if (!sessionIdReceived) {
216
+ rejectSessionId(error);
217
+ }
218
+ controller.error(error);
219
+ }
220
+ // Non-critical event (text) - continue stream silently
221
+ }
222
+ },
223
+ flush() {
224
+ // Handle promises that were never resolved/rejected during stream
225
+ if (!sessionIdReceived) {
226
+ rejectSessionId(new errors_js_1.KoineError("Stream ended without session ID", "NO_SESSION"));
227
+ }
228
+ if (!usageReceived) {
229
+ rejectUsage(new errors_js_1.KoineError("Stream ended without usage information", "NO_USAGE"));
230
+ }
231
+ resolveText(accumulatedText);
232
+ },
233
+ }));
234
+ return {
235
+ textStream,
236
+ sessionId: sessionIdPromise,
237
+ usage: usagePromise,
238
+ text: textPromise,
239
+ };
240
+ }
241
+ /**
242
+ * Generates structured JSON response from Koine gateway service.
243
+ * Converts Zod schema to JSON Schema for the gateway service.
244
+ */
245
+ async function generateObject(config, options) {
246
+ // Convert Zod schema to JSON Schema for the gateway service
247
+ const jsonSchema = (0, zod_to_json_schema_1.zodToJsonSchema)(options.schema, {
248
+ $refStrategy: "none",
249
+ target: "jsonSchema7",
250
+ });
251
+ const response = await fetch(`${config.baseUrl}/generate-object`, {
252
+ method: "POST",
253
+ headers: {
254
+ "Content-Type": "application/json",
255
+ Authorization: `Bearer ${config.authKey}`,
256
+ },
257
+ body: JSON.stringify({
258
+ system: options.system,
259
+ prompt: options.prompt,
260
+ schema: jsonSchema,
261
+ sessionId: options.sessionId,
262
+ model: config.model,
263
+ }),
264
+ signal: AbortSignal.timeout(config.timeout),
265
+ });
266
+ if (!response.ok) {
267
+ const errorBody = await safeJsonParse(response);
268
+ throw new errors_js_1.KoineError(errorBody?.error || `HTTP ${response.status} ${response.statusText}`, errorBody?.code || "HTTP_ERROR", errorBody?.rawText);
269
+ }
270
+ const result = await safeJsonParse(response);
271
+ if (!result) {
272
+ throw new errors_js_1.KoineError("Invalid response from Koine gateway: expected JSON", "INVALID_RESPONSE");
273
+ }
274
+ // Validate the response against the Zod schema
275
+ const parseResult = options.schema.safeParse(result.object);
276
+ if (!parseResult.success) {
277
+ throw new errors_js_1.KoineError(`Response validation failed: ${parseResult.error.message}`, "VALIDATION_ERROR", result.rawText);
278
+ }
279
+ return {
280
+ object: parseResult.data,
281
+ rawText: result.rawText,
282
+ usage: result.usage,
283
+ sessionId: result.sessionId,
284
+ };
285
+ }
286
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Custom error class for Koine client errors.
3
+ */
4
+ export declare class KoineError extends Error {
5
+ code: string;
6
+ rawText?: string;
7
+ constructor(message: string, code: string, rawText?: string);
8
+ }
9
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,qBAAa,UAAW,SAAQ,KAAK;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;gBAEL,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM;CAM3D"}
package/dist/errors.js ADDED
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.KoineError = void 0;
4
+ /**
5
+ * Custom error class for Koine client errors.
6
+ */
7
+ class KoineError extends Error {
8
+ code;
9
+ rawText;
10
+ constructor(message, code, rawText) {
11
+ super(message);
12
+ this.name = "KoineError";
13
+ this.code = code;
14
+ this.rawText = rawText;
15
+ }
16
+ }
17
+ exports.KoineError = KoineError;
18
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":";;;AAAA;;GAEG;AACH,MAAa,UAAW,SAAQ,KAAK;IACpC,IAAI,CAAS;IACb,OAAO,CAAU;IAEjB,YAAY,OAAe,EAAE,IAAY,EAAE,OAAgB;QAC1D,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,YAAY,CAAC;QACzB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACxB,CAAC;CACD;AAVD,gCAUC"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Koine SDK
3
+ *
4
+ * A TypeScript client for interacting with Koine gateway services.
5
+ *
6
+ * @example
7
+ * ```typescript
8
+ * import { generateText, KoineConfig } from '@patternzones/koine-sdk';
9
+ *
10
+ * const config: KoineConfig = {
11
+ * baseUrl: 'http://localhost:3100',
12
+ * timeout: 300000,
13
+ * authKey: 'your-api-key',
14
+ * model: 'sonnet',
15
+ * };
16
+ *
17
+ * const result = await generateText(config, {
18
+ * prompt: 'Hello, how are you?',
19
+ * });
20
+ *
21
+ * console.log(result.text);
22
+ * ```
23
+ */
24
+ export type { KoineConfig, KoineUsage, KoineStreamResult, GenerateTextResponse, GenerateObjectResponse, ErrorResponse, SSETextEvent, SSEResultEvent, SSEErrorEvent, } from "./types.js";
25
+ export { KoineError } from "./errors.js";
26
+ export { generateText, streamText, generateObject } from "./client.js";
27
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAGH,YAAY,EACX,WAAW,EACX,UAAU,EACV,iBAAiB,EACjB,oBAAoB,EACpB,sBAAsB,EACtB,aAAa,EACb,YAAY,EACZ,cAAc,EACd,aAAa,GACb,MAAM,YAAY,CAAC;AAGpB,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGzC,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+ /**
3
+ * Koine SDK
4
+ *
5
+ * A TypeScript client for interacting with Koine gateway services.
6
+ *
7
+ * @example
8
+ * ```typescript
9
+ * import { generateText, KoineConfig } from '@patternzones/koine-sdk';
10
+ *
11
+ * const config: KoineConfig = {
12
+ * baseUrl: 'http://localhost:3100',
13
+ * timeout: 300000,
14
+ * authKey: 'your-api-key',
15
+ * model: 'sonnet',
16
+ * };
17
+ *
18
+ * const result = await generateText(config, {
19
+ * prompt: 'Hello, how are you?',
20
+ * });
21
+ *
22
+ * console.log(result.text);
23
+ * ```
24
+ */
25
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ exports.generateObject = exports.streamText = exports.generateText = exports.KoineError = void 0;
27
+ // Errors
28
+ var errors_js_1 = require("./errors.js");
29
+ Object.defineProperty(exports, "KoineError", { enumerable: true, get: function () { return errors_js_1.KoineError; } });
30
+ // Client functions
31
+ var client_js_1 = require("./client.js");
32
+ Object.defineProperty(exports, "generateText", { enumerable: true, get: function () { return client_js_1.generateText; } });
33
+ Object.defineProperty(exports, "streamText", { enumerable: true, get: function () { return client_js_1.streamText; } });
34
+ Object.defineProperty(exports, "generateObject", { enumerable: true, get: function () { return client_js_1.generateObject; } });
35
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;;;AAeH,SAAS;AACT,yCAAyC;AAAhC,uGAAA,UAAU,OAAA;AAEnB,mBAAmB;AACnB,yCAAuE;AAA9D,yGAAA,YAAY,OAAA;AAAE,uGAAA,UAAU,OAAA;AAAE,2GAAA,cAAc,OAAA"}
@@ -0,0 +1,74 @@
1
+ /**
2
+ * Configuration for connecting to a Koine gateway service.
3
+ */
4
+ export interface KoineConfig {
5
+ /** Base URL of the gateway service (e.g., "http://localhost:3100") */
6
+ baseUrl: string;
7
+ /** Request timeout in milliseconds */
8
+ timeout: number;
9
+ /** Authentication key for the gateway service (required) */
10
+ authKey: string;
11
+ /** Model alias (e.g., 'sonnet', 'haiku') or full model name */
12
+ model?: string;
13
+ }
14
+ /**
15
+ * Usage information from Koine gateway service.
16
+ */
17
+ export interface KoineUsage {
18
+ inputTokens: number;
19
+ outputTokens: number;
20
+ totalTokens: number;
21
+ }
22
+ /**
23
+ * Response from generate-text endpoint.
24
+ */
25
+ export interface GenerateTextResponse {
26
+ text: string;
27
+ usage: KoineUsage;
28
+ sessionId: string;
29
+ }
30
+ /**
31
+ * Response from generate-object endpoint.
32
+ */
33
+ export interface GenerateObjectResponse {
34
+ object: unknown;
35
+ rawText: string;
36
+ usage: KoineUsage;
37
+ sessionId: string;
38
+ }
39
+ /**
40
+ * Error response from Koine gateway service.
41
+ */
42
+ export interface ErrorResponse {
43
+ error: string;
44
+ code: string;
45
+ rawText?: string;
46
+ }
47
+ /**
48
+ * Result from streaming text generation.
49
+ */
50
+ export interface KoineStreamResult {
51
+ /** ReadableStream of text chunks as they arrive */
52
+ textStream: ReadableStream<string>;
53
+ /** Session ID for conversation continuity (resolves early in stream, after session event) */
54
+ sessionId: Promise<string>;
55
+ /** Usage stats (resolves when stream completes via result event) */
56
+ usage: Promise<KoineUsage>;
57
+ /** Full accumulated text (resolves when stream completes) */
58
+ text: Promise<string>;
59
+ }
60
+ /**
61
+ * SSE event types from Koine gateway /stream endpoint.
62
+ */
63
+ export interface SSETextEvent {
64
+ text: string;
65
+ }
66
+ export interface SSEResultEvent {
67
+ sessionId: string;
68
+ usage: KoineUsage;
69
+ }
70
+ export interface SSEErrorEvent {
71
+ error: string;
72
+ code?: string;
73
+ }
74
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,WAAW;IAC3B,sEAAsE;IACtE,OAAO,EAAE,MAAM,CAAC;IAChB,sCAAsC;IACtC,OAAO,EAAE,MAAM,CAAC;IAChB,4DAA4D;IAC5D,OAAO,EAAE,MAAM,CAAC;IAChB,+DAA+D;IAC/D,KAAK,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,UAAU,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACtC,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,UAAU,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IACjC,mDAAmD;IACnD,UAAU,EAAE,cAAc,CAAC,MAAM,CAAC,CAAC;IACnC,6FAA6F;IAC7F,SAAS,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;IAC3B,oEAAoE;IACpE,KAAK,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;IAC3B,6DAA6D;IAC7D,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC5B,IAAI,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,cAAc;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,UAAU,CAAC;CAClB;AAED,MAAM,WAAW,aAAa;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;CACd"}
package/dist/types.js ADDED
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
package/package.json ADDED
@@ -0,0 +1,48 @@
1
+ {
2
+ "name": "@patternzones/koine-sdk",
3
+ "version": "1.0.0",
4
+ "description": "TypeScript SDK for Koine gateway",
5
+ "repository": {
6
+ "type": "git",
7
+ "url": "https://github.com/pattern-zones-co/koine.git",
8
+ "directory": "packages/sdks/typescript"
9
+ },
10
+ "homepage": "https://github.com/pattern-zones-co/koine",
11
+ "bugs": "https://github.com/pattern-zones-co/koine/issues",
12
+ "author": "Pattern Zones Co",
13
+ "main": "dist/index.js",
14
+ "types": "dist/index.d.ts",
15
+ "exports": {
16
+ ".": {
17
+ "import": "./dist/index.js",
18
+ "types": "./dist/index.d.ts"
19
+ }
20
+ },
21
+ "scripts": {
22
+ "build": "tsc",
23
+ "test": "vitest",
24
+ "test:run": "vitest run",
25
+ "test:coverage": "vitest run --coverage",
26
+ "lint": "biome check ."
27
+ },
28
+ "dependencies": {
29
+ "zod": "3.25.76",
30
+ "zod-to-json-schema": "3.24.5"
31
+ },
32
+ "devDependencies": {
33
+ "@types/node": "25.0.2",
34
+ "@vitest/coverage-v8": "3.2.4",
35
+ "typescript": "5.9.3",
36
+ "vitest": "3.2.4"
37
+ },
38
+ "peerDependencies": {
39
+ "zod": ">=3.0.0"
40
+ },
41
+ "engines": {
42
+ "node": "22.21.1",
43
+ "bun": "1.3.3"
44
+ },
45
+ "keywords": ["claude", "claude-code", "anthropic", "ai", "sdk", "gateway"],
46
+ "license": "AGPL-3.0",
47
+ "files": ["dist", "README.md"]
48
+ }