@ragable/sdk 0.0.1 → 0.0.3

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/dist/index.js CHANGED
@@ -22,45 +22,418 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
22
22
  // src/index.ts
23
23
  var index_exports = {};
24
24
  __export(index_exports, {
25
- Agent: () => Agent,
26
- Tool: () => Tool,
27
- default: () => index_default
25
+ AgentsClient: () => AgentsClient,
26
+ Ragable: () => Ragable,
27
+ RagableError: () => RagableError,
28
+ RagableRequestClient: () => RagableRequestClient,
29
+ ShiftClient: () => ShiftClient,
30
+ createClient: () => createClient,
31
+ createRagPipeline: () => createRagPipeline,
32
+ extractErrorMessage: () => extractErrorMessage,
33
+ formatRetrievalContext: () => formatRetrievalContext
28
34
  });
29
35
  module.exports = __toCommonJS(index_exports);
30
- var Agent = class {
31
- constructor(config) {
32
- __publicField(this, "config");
33
- this.config = config;
34
- }
35
- async deploy() {
36
- console.log(`Deploying agent: ${this.config.name}...`);
37
- return {
38
- status: "deployed",
39
- agentId: "ag_" + Math.random().toString(36).substr(2, 9),
40
- url: `https://api.ragable.com/v1/agents/${this.config.name}`
41
- };
36
+
37
+ // src/request-client.ts
38
+ var RagableError = class extends Error {
39
+ constructor(message, status, body) {
40
+ super(message);
41
+ __publicField(this, "status");
42
+ __publicField(this, "body");
43
+ this.name = "RagableError";
44
+ this.status = status;
45
+ this.body = body;
46
+ }
47
+ };
48
+ function extractErrorMessage(payload, fallback) {
49
+ if (payload && typeof payload === "object") {
50
+ if ("error" in payload && typeof payload.error === "string") {
51
+ return payload.error;
52
+ }
53
+ if ("message" in payload && typeof payload.message === "string") {
54
+ return payload.message;
55
+ }
56
+ }
57
+ if (typeof payload === "string" && payload.length > 0) {
58
+ return payload;
59
+ }
60
+ return fallback || "Request failed";
61
+ }
62
+ var RagableRequestClient = class {
63
+ constructor(options) {
64
+ __publicField(this, "apiKey");
65
+ __publicField(this, "baseUrl");
66
+ __publicField(this, "fetchImpl");
67
+ __publicField(this, "defaultHeaders");
68
+ this.apiKey = options.apiKey;
69
+ this.baseUrl = options.baseUrl ?? "http://localhost:8080/api";
70
+ this.fetchImpl = options.fetch ?? fetch;
71
+ this.defaultHeaders = options.headers;
72
+ }
73
+ toUrl(path) {
74
+ const normalizedBase = this.baseUrl.replace(/\/+$/, "");
75
+ const normalizedPath = path.startsWith("/") ? path : `/${path}`;
76
+ return `${normalizedBase}${normalizedPath}`;
77
+ }
78
+ async request(path, options = {}) {
79
+ const response = await this.rawFetch(path, options);
80
+ const payload = await this.parseResponseBody(response);
81
+ if (!response.ok) {
82
+ const message = extractErrorMessage(payload, response.statusText);
83
+ throw new RagableError(message, response.status, payload);
84
+ }
85
+ return payload;
86
+ }
87
+ /**
88
+ * Low-level fetch with API key and JSON body encoding. Caller handles status and body.
89
+ */
90
+ async rawFetch(path, options = {}) {
91
+ const headers = new Headers(this.defaultHeaders);
92
+ headers.set("Authorization", `Bearer ${this.apiKey}`);
93
+ let body = options.body;
94
+ if (body !== void 0 && !isBodyInit(body)) {
95
+ headers.set("Content-Type", "application/json");
96
+ body = JSON.stringify(body);
97
+ }
98
+ return this.fetchImpl(this.toUrl(path), {
99
+ ...options,
100
+ headers,
101
+ body
102
+ });
103
+ }
104
+ async parseResponseBody(response) {
105
+ if (response.status === 204) {
106
+ return null;
107
+ }
108
+ const contentType = response.headers.get("content-type") ?? "";
109
+ if (contentType.includes("application/json")) {
110
+ return response.json();
111
+ }
112
+ return response.text();
42
113
  }
43
- async run(input) {
44
- console.log(`Agent ${this.config.name} processing: ${input}`);
45
- return {
46
- response: "This is a mock response from the SDK.",
47
- traceId: "tr_" + Math.random().toString(36).substr(2, 9)
114
+ };
115
+ function isBodyInit(value) {
116
+ return typeof value === "string" || value instanceof Blob || value instanceof FormData || value instanceof URLSearchParams || value instanceof ArrayBuffer || ArrayBuffer.isView(value);
117
+ }
118
+
119
+ // src/shift.ts
120
+ var ShiftClient = class {
121
+ constructor(client) {
122
+ this.client = client;
123
+ __publicField(this, "indexes");
124
+ __publicField(this, "documents");
125
+ __publicField(this, "entries");
126
+ this.indexes = {
127
+ list: async () => {
128
+ return this.client.request("/v1/shift/indexes");
129
+ },
130
+ create: async (params) => {
131
+ return this.client.request("/v1/shift/indexes", {
132
+ method: "POST",
133
+ body: params
134
+ });
135
+ },
136
+ get: async (indexId) => {
137
+ return this.client.request(`/v1/shift/indexes/${indexId}`);
138
+ },
139
+ update: async (indexId, params) => {
140
+ return this.client.request(`/v1/shift/indexes/${indexId}`, {
141
+ method: "PUT",
142
+ body: params
143
+ });
144
+ },
145
+ delete: async (indexId) => {
146
+ return this.client.request(
147
+ `/v1/shift/indexes/${indexId}`,
148
+ {
149
+ method: "DELETE"
150
+ }
151
+ );
152
+ }
153
+ };
154
+ this.documents = {
155
+ create: async (indexId, params) => {
156
+ return this.client.request(
157
+ `/v1/shift/indexes/${indexId}/documents`,
158
+ {
159
+ method: "POST",
160
+ body: params
161
+ }
162
+ );
163
+ },
164
+ upload: async (indexId, params) => {
165
+ const formData = new FormData();
166
+ const fileName = resolveUploadFileName(params);
167
+ const contentType = resolveUploadContentType(params);
168
+ const file = normalizeUploadFile(params.file, contentType);
169
+ formData.set("file", file, fileName);
170
+ if (params.metadata) {
171
+ formData.set("metadata", JSON.stringify(params.metadata));
172
+ }
173
+ if (typeof params.chunkSize === "number") {
174
+ formData.set("chunkSize", String(params.chunkSize));
175
+ }
176
+ if (typeof params.chunkOverlap === "number") {
177
+ formData.set("chunkOverlap", String(params.chunkOverlap));
178
+ }
179
+ return this.client.request(
180
+ `/v1/shift/indexes/${indexId}/files`,
181
+ {
182
+ method: "POST",
183
+ body: formData
184
+ }
185
+ );
186
+ }
48
187
  };
188
+ this.entries = {
189
+ list: async (indexId, params = {}) => {
190
+ const search = new URLSearchParams();
191
+ if (typeof params.take === "number") {
192
+ search.set("take", String(params.take));
193
+ }
194
+ if (typeof params.skip === "number") {
195
+ search.set("skip", String(params.skip));
196
+ }
197
+ const suffix = search.size > 0 ? `?${search.toString()}` : "";
198
+ return this.client.request(
199
+ `/v1/shift/indexes/${indexId}/entries${suffix}`
200
+ );
201
+ },
202
+ delete: async (indexId, entryId) => {
203
+ return this.client.request(
204
+ `/v1/shift/indexes/${indexId}/entries/${entryId}`,
205
+ {
206
+ method: "DELETE"
207
+ }
208
+ );
209
+ }
210
+ };
211
+ }
212
+ async search(indexId, params) {
213
+ return this.client.request(
214
+ `/v1/shift/indexes/${indexId}/search`,
215
+ {
216
+ method: "POST",
217
+ body: params
218
+ }
219
+ );
49
220
  }
50
221
  };
51
- var Tool = class {
52
- static connect(apiKey) {
53
- void apiKey;
54
- return { type: "tool", connected: true };
222
+ function resolveUploadFileName(params) {
223
+ if (params.fileName) {
224
+ return params.fileName;
225
+ }
226
+ if (isNamedBlob(params.file)) {
227
+ return params.file.name;
228
+ }
229
+ return "upload.bin";
230
+ }
231
+ function resolveUploadContentType(params) {
232
+ if (params.contentType) {
233
+ return params.contentType;
234
+ }
235
+ if (params.file instanceof Blob && params.file.type) {
236
+ return params.file.type;
237
+ }
238
+ return "application/octet-stream";
239
+ }
240
+ function normalizeUploadFile(file, contentType) {
241
+ if (file instanceof Blob) {
242
+ return file;
243
+ }
244
+ if (file instanceof Uint8Array) {
245
+ return new Blob([toArrayBuffer(file)], { type: contentType });
246
+ }
247
+ return new Blob([file], { type: contentType });
248
+ }
249
+ function isNamedBlob(value) {
250
+ return value instanceof Blob && "name" in value && typeof value.name === "string";
251
+ }
252
+ function toArrayBuffer(value) {
253
+ const copy = new Uint8Array(value.byteLength);
254
+ copy.set(value);
255
+ return copy.buffer;
256
+ }
257
+
258
+ // src/agents.ts
259
+ var AgentsClient = class {
260
+ constructor(client) {
261
+ this.client = client;
262
+ }
263
+ async list() {
264
+ return this.client.request("/v1/agents");
265
+ }
266
+ async get(agentId) {
267
+ return this.client.request(`/v1/agents/${agentId}`);
268
+ }
269
+ async chat(agentId, params) {
270
+ return this.client.request(`/v1/agents/${agentId}/chat`, {
271
+ method: "POST",
272
+ body: {
273
+ message: params.message,
274
+ ...params.history !== void 0 ? { history: params.history } : {}
275
+ }
276
+ });
277
+ }
278
+ /**
279
+ * Stream agent execution as SSE (`data: {json}` lines). Yields parsed JSON objects.
280
+ */
281
+ async *chatStream(agentId, params) {
282
+ const response = await this.client.rawFetch(
283
+ `/v1/agents/${agentId}/chat/stream`,
284
+ {
285
+ method: "POST",
286
+ body: {
287
+ message: params.message,
288
+ ...params.history !== void 0 ? { history: params.history } : {}
289
+ }
290
+ }
291
+ );
292
+ if (!response.ok) {
293
+ const payload = await parseMaybeJsonBody(response);
294
+ const message = extractErrorMessage(payload, response.statusText);
295
+ throw new RagableError(message, response.status, payload);
296
+ }
297
+ const body = response.body;
298
+ if (!body) {
299
+ return;
300
+ }
301
+ const reader = body.getReader();
302
+ const decoder = new TextDecoder();
303
+ let buffer = "";
304
+ try {
305
+ while (true) {
306
+ const { done, value } = await reader.read();
307
+ if (done) {
308
+ break;
309
+ }
310
+ buffer += decoder.decode(value, { stream: true });
311
+ let boundary = buffer.indexOf("\n\n");
312
+ while (boundary !== -1) {
313
+ const block = buffer.slice(0, boundary);
314
+ buffer = buffer.slice(boundary + 2);
315
+ for (const line of block.split("\n")) {
316
+ const evt = parseSseDataLine(line);
317
+ if (evt) {
318
+ yield evt;
319
+ }
320
+ }
321
+ boundary = buffer.indexOf("\n\n");
322
+ }
323
+ }
324
+ if (buffer.trim().length > 0) {
325
+ for (const line of buffer.split("\n")) {
326
+ const evt = parseSseDataLine(line);
327
+ if (evt) {
328
+ yield evt;
329
+ }
330
+ }
331
+ }
332
+ } finally {
333
+ reader.releaseLock();
334
+ }
55
335
  }
56
336
  };
57
- var index_default = {
58
- Agent,
59
- Tool
337
+ async function parseMaybeJsonBody(response) {
338
+ const contentType = response.headers.get("content-type") ?? "";
339
+ if (contentType.includes("application/json")) {
340
+ try {
341
+ return await response.json();
342
+ } catch {
343
+ return null;
344
+ }
345
+ }
346
+ try {
347
+ return await response.text();
348
+ } catch {
349
+ return null;
350
+ }
351
+ }
352
+ function parseSseDataLine(line) {
353
+ const dataPrefix = "data: ";
354
+ if (!line.startsWith(dataPrefix)) {
355
+ return null;
356
+ }
357
+ const json = line.slice(dataPrefix.length).trim();
358
+ if (json.length === 0 || json === "[DONE]") {
359
+ return null;
360
+ }
361
+ try {
362
+ return JSON.parse(json);
363
+ } catch {
364
+ return null;
365
+ }
366
+ }
367
+
368
+ // src/rag.ts
369
+ function formatRetrievalContext(results, options = {}) {
370
+ const header = options.header ?? "Relevant passages:\n";
371
+ const separator = options.separator ?? "\n\n";
372
+ const minScore = options.minScore;
373
+ let filtered = results;
374
+ if (typeof minScore === "number") {
375
+ filtered = results.filter((r) => r.score >= minScore);
376
+ }
377
+ const blocks = filtered.map((r, i) => {
378
+ const scoreSuffix = options.includeScores === true ? ` (score: ${r.score.toFixed(4)})` : "";
379
+ return `[${i + 1}]${scoreSuffix}
380
+ ${r.content.trim()}`;
381
+ });
382
+ let text = (blocks.length > 0 ? header : "") + blocks.join(separator);
383
+ if (typeof options.maxChars === "number" && text.length > options.maxChars) {
384
+ text = text.slice(0, options.maxChars).trimEnd() + "\n\u2026";
385
+ }
386
+ return text;
387
+ }
388
+ function createRagPipeline(client, options) {
389
+ const { indexId } = options;
390
+ return {
391
+ indexId,
392
+ ingestText(params) {
393
+ return client.shift.documents.create(indexId, params);
394
+ },
395
+ ingestFile(params) {
396
+ return client.shift.documents.upload(indexId, params);
397
+ },
398
+ search(params) {
399
+ return client.shift.search(indexId, params);
400
+ },
401
+ async retrieve(params) {
402
+ const { format: formatOpts, ...searchParams } = params;
403
+ const { results } = await client.shift.search(indexId, searchParams);
404
+ const context = formatRetrievalContext(results, formatOpts ?? {});
405
+ return { results, context };
406
+ }
407
+ };
408
+ }
409
+
410
+ // src/index.ts
411
+ var Ragable = class {
412
+ constructor(options) {
413
+ __publicField(this, "shift");
414
+ __publicField(this, "agents");
415
+ __publicField(this, "infrastructure");
416
+ const client = new RagableRequestClient(options);
417
+ this.shift = new ShiftClient(client);
418
+ this.agents = new AgentsClient(client);
419
+ this.infrastructure = {
420
+ shift: this.shift
421
+ };
422
+ }
60
423
  };
424
+ function createClient(options) {
425
+ return new Ragable(options);
426
+ }
61
427
  // Annotate the CommonJS export names for ESM import in node:
62
428
  0 && (module.exports = {
63
- Agent,
64
- Tool
429
+ AgentsClient,
430
+ Ragable,
431
+ RagableError,
432
+ RagableRequestClient,
433
+ ShiftClient,
434
+ createClient,
435
+ createRagPipeline,
436
+ extractErrorMessage,
437
+ formatRetrievalContext
65
438
  });
66
439
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["export interface AgentConfig {\n name: string;\n model?: string;\n memory?: boolean;\n tools?: any[];\n knowledge?: string[];\n}\n\nexport class Agent {\n private config: AgentConfig;\n\n constructor(config: AgentConfig) {\n this.config = config;\n }\n\n public async deploy() {\n console.log(`Deploying agent: ${this.config.name}...`);\n return {\n status: \"deployed\",\n agentId: \"ag_\" + Math.random().toString(36).substr(2, 9),\n url: `https://api.ragable.com/v1/agents/${this.config.name}`,\n };\n }\n\n public async run(input: string) {\n console.log(`Agent ${this.config.name} processing: ${input}`);\n return {\n response: \"This is a mock response from the SDK.\",\n traceId: \"tr_\" + Math.random().toString(36).substr(2, 9),\n };\n }\n}\n\nexport class Tool {\n static connect(apiKey: string) {\n void apiKey;\n return { type: \"tool\", connected: true };\n }\n}\n\nexport default {\n Agent,\n Tool,\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAQO,IAAM,QAAN,MAAY;AAAA,EAGjB,YAAY,QAAqB;AAFjC,wBAAQ;AAGN,SAAK,SAAS;AAAA,EAChB;AAAA,EAEA,MAAa,SAAS;AACpB,YAAQ,IAAI,oBAAoB,KAAK,OAAO,IAAI,KAAK;AACrD,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,SAAS,QAAQ,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,OAAO,GAAG,CAAC;AAAA,MACvD,KAAK,qCAAqC,KAAK,OAAO,IAAI;AAAA,IAC5D;AAAA,EACF;AAAA,EAEA,MAAa,IAAI,OAAe;AAC9B,YAAQ,IAAI,SAAS,KAAK,OAAO,IAAI,gBAAgB,KAAK,EAAE;AAC5D,WAAO;AAAA,MACL,UAAU;AAAA,MACV,SAAS,QAAQ,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,OAAO,GAAG,CAAC;AAAA,IACzD;AAAA,EACF;AACF;AAEO,IAAM,OAAN,MAAW;AAAA,EAChB,OAAO,QAAQ,QAAgB;AAC7B,SAAK;AACL,WAAO,EAAE,MAAM,QAAQ,WAAW,KAAK;AAAA,EACzC;AACF;AAEA,IAAO,gBAAQ;AAAA,EACb;AAAA,EACA;AACF;","names":[]}
1
+ {"version":3,"sources":["../src/index.ts","../src/request-client.ts","../src/shift.ts","../src/agents.ts","../src/rag.ts"],"sourcesContent":["export type { RagableClientOptions, RequestOptions } from \"./request-client\";\nexport {\n extractErrorMessage,\n RagableError,\n RagableRequestClient,\n} from \"./request-client\";\n\nexport type {\n ShiftAddDocumentParams,\n ShiftCreateIndexParams,\n ShiftEntry,\n ShiftIndex,\n ShiftIngestResponse,\n ShiftListEntriesParams,\n ShiftListEntriesResponse,\n ShiftSearchParams,\n ShiftSearchResult,\n ShiftUpdateIndexParams,\n ShiftUploadableFile,\n ShiftUploadFileParams,\n} from \"./shift\";\nexport { ShiftClient } from \"./shift\";\n\nexport type {\n AgentChatMessage,\n AgentChatParams,\n AgentChatResult,\n AgentStreamEvent,\n AgentSummary,\n} from \"./agents\";\nexport { AgentsClient } from \"./agents\";\n\nexport type {\n FormatContextOptions,\n RagClientForPipeline,\n RagPipeline,\n RagPipelineOptions,\n RetrieveParams,\n} from \"./rag\";\nexport { createRagPipeline, formatRetrievalContext } from \"./rag\";\n\nimport { AgentsClient } from \"./agents\";\nimport {\n RagableRequestClient,\n type RagableClientOptions,\n} from \"./request-client\";\nimport { ShiftClient } from \"./shift\";\n\nexport class Ragable {\n readonly shift: ShiftClient;\n readonly agents: AgentsClient;\n readonly infrastructure: {\n shift: ShiftClient;\n };\n\n constructor(options: RagableClientOptions) {\n const client = new RagableRequestClient(options);\n this.shift = new ShiftClient(client);\n this.agents = new AgentsClient(client);\n this.infrastructure = {\n shift: this.shift,\n };\n }\n}\n\nexport function createClient(options: RagableClientOptions) {\n return new Ragable(options);\n}\n","export interface RagableClientOptions {\n apiKey: string;\n baseUrl?: string;\n fetch?: typeof fetch;\n headers?: HeadersInit;\n}\n\nexport type RequestOptions = Omit<RequestInit, \"body\"> & {\n body?: unknown;\n};\n\nexport class RagableError extends Error {\n readonly status: number;\n readonly body: unknown;\n\n constructor(message: string, status: number, body: unknown) {\n super(message);\n this.name = \"RagableError\";\n this.status = status;\n this.body = body;\n }\n}\n\nexport function extractErrorMessage(payload: unknown, fallback: string) {\n if (payload && typeof payload === \"object\") {\n if (\"error\" in payload && typeof payload.error === \"string\") {\n return payload.error;\n }\n if (\"message\" in payload && typeof payload.message === \"string\") {\n return payload.message;\n }\n }\n\n if (typeof payload === \"string\" && payload.length > 0) {\n return payload;\n }\n\n return fallback || \"Request failed\";\n}\n\nexport class RagableRequestClient {\n private readonly apiKey: string;\n private readonly baseUrl: string;\n private readonly fetchImpl: typeof fetch;\n private readonly defaultHeaders: HeadersInit | undefined;\n\n constructor(options: RagableClientOptions) {\n this.apiKey = options.apiKey;\n this.baseUrl = options.baseUrl ?? \"http://localhost:8080/api\";\n this.fetchImpl = options.fetch ?? fetch;\n this.defaultHeaders = options.headers;\n }\n\n toUrl(path: string) {\n const normalizedBase = this.baseUrl.replace(/\\/+$/, \"\");\n const normalizedPath = path.startsWith(\"/\") ? path : `/${path}`;\n return `${normalizedBase}${normalizedPath}`;\n }\n\n async request<T>(path: string, options: RequestOptions = {}): Promise<T> {\n const response = await this.rawFetch(path, options);\n const payload = await this.parseResponseBody(response);\n if (!response.ok) {\n const message = extractErrorMessage(payload, response.statusText);\n throw new RagableError(message, response.status, payload);\n }\n\n return payload as T;\n }\n\n /**\n * Low-level fetch with API key and JSON body encoding. Caller handles status and body.\n */\n async rawFetch(path: string, options: RequestOptions = {}): Promise<Response> {\n const headers = new Headers(this.defaultHeaders);\n headers.set(\"Authorization\", `Bearer ${this.apiKey}`);\n\n let body = options.body;\n if (body !== undefined && !isBodyInit(body)) {\n headers.set(\"Content-Type\", \"application/json\");\n body = JSON.stringify(body);\n }\n\n return this.fetchImpl(this.toUrl(path), {\n ...options,\n headers,\n body: body as BodyInit | undefined,\n });\n }\n\n private async parseResponseBody(response: Response): Promise<unknown> {\n if (response.status === 204) {\n return null;\n }\n\n const contentType = response.headers.get(\"content-type\") ?? \"\";\n if (contentType.includes(\"application/json\")) {\n return response.json();\n }\n\n return response.text();\n }\n}\n\nexport function isBodyInit(value: unknown): value is BodyInit {\n return (\n typeof value === \"string\" ||\n value instanceof Blob ||\n value instanceof FormData ||\n value instanceof URLSearchParams ||\n value instanceof ArrayBuffer ||\n ArrayBuffer.isView(value)\n );\n}\n","import { RagableRequestClient } from \"./request-client\";\n\nexport interface ShiftIndex {\n id: string;\n name: string;\n description: string | null;\n dimensions: number;\n embeddingModel: string;\n status: string;\n entryCount?: number;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface ShiftEntry {\n id: string;\n content: string;\n metadata: unknown;\n chunkIndex: number;\n createdAt: string;\n}\n\nexport interface ShiftSearchResult {\n content: string;\n score: number;\n metadata: unknown;\n}\n\nexport interface ShiftCreateIndexParams {\n name: string;\n description?: string;\n dimensions?: number;\n embeddingModel?: string;\n}\n\nexport interface ShiftUpdateIndexParams {\n name?: string;\n description?: string;\n}\n\nexport interface ShiftAddDocumentParams {\n content: string;\n metadata?: Record<string, unknown>;\n chunkSize?: number;\n chunkOverlap?: number;\n}\n\nexport type ShiftUploadableFile = Blob | ArrayBuffer | Uint8Array;\n\nexport interface ShiftUploadFileParams {\n file: ShiftUploadableFile;\n fileName?: string;\n contentType?: string;\n metadata?: Record<string, unknown>;\n chunkSize?: number;\n chunkOverlap?: number;\n}\n\nexport interface ShiftListEntriesParams {\n take?: number;\n skip?: number;\n}\n\nexport interface ShiftSearchParams {\n query: string;\n topK?: number;\n}\n\nexport interface ShiftIngestResponse {\n chunksCreated: number;\n entries: string[];\n extractedText?: string;\n message?: string;\n}\n\nexport interface ShiftListEntriesResponse {\n entries: ShiftEntry[];\n total: number;\n}\n\nexport class ShiftClient {\n readonly indexes: {\n list: () => Promise<{ indexes: ShiftIndex[] }>;\n create: (params: ShiftCreateIndexParams) => Promise<ShiftIndex>;\n get: (indexId: string) => Promise<ShiftIndex>;\n update: (indexId: string, params: ShiftUpdateIndexParams) => Promise<ShiftIndex>;\n delete: (indexId: string) => Promise<{ success: true }>;\n };\n\n readonly documents: {\n create: (\n indexId: string,\n params: ShiftAddDocumentParams,\n ) => Promise<ShiftIngestResponse>;\n upload: (\n indexId: string,\n params: ShiftUploadFileParams,\n ) => Promise<ShiftIngestResponse>;\n };\n\n readonly entries: {\n list: (\n indexId: string,\n params?: ShiftListEntriesParams,\n ) => Promise<ShiftListEntriesResponse>;\n delete: (indexId: string, entryId: string) => Promise<{ success: true }>;\n };\n\n constructor(private readonly client: RagableRequestClient) {\n this.indexes = {\n list: async () => {\n return this.client.request<{ indexes: ShiftIndex[] }>(\"/v1/shift/indexes\");\n },\n create: async (params) => {\n return this.client.request<ShiftIndex>(\"/v1/shift/indexes\", {\n method: \"POST\",\n body: params,\n });\n },\n get: async (indexId) => {\n return this.client.request<ShiftIndex>(`/v1/shift/indexes/${indexId}`);\n },\n update: async (indexId, params) => {\n return this.client.request<ShiftIndex>(`/v1/shift/indexes/${indexId}`, {\n method: \"PUT\",\n body: params,\n });\n },\n delete: async (indexId) => {\n return this.client.request<{ success: true }>(\n `/v1/shift/indexes/${indexId}`,\n {\n method: \"DELETE\",\n },\n );\n },\n };\n\n this.documents = {\n create: async (indexId, params) => {\n return this.client.request<ShiftIngestResponse>(\n `/v1/shift/indexes/${indexId}/documents`,\n {\n method: \"POST\",\n body: params,\n },\n );\n },\n upload: async (indexId, params) => {\n const formData = new FormData();\n const fileName = resolveUploadFileName(params);\n const contentType = resolveUploadContentType(params);\n const file = normalizeUploadFile(params.file, contentType);\n\n formData.set(\"file\", file, fileName);\n\n if (params.metadata) {\n formData.set(\"metadata\", JSON.stringify(params.metadata));\n }\n if (typeof params.chunkSize === \"number\") {\n formData.set(\"chunkSize\", String(params.chunkSize));\n }\n if (typeof params.chunkOverlap === \"number\") {\n formData.set(\"chunkOverlap\", String(params.chunkOverlap));\n }\n\n return this.client.request<ShiftIngestResponse>(\n `/v1/shift/indexes/${indexId}/files`,\n {\n method: \"POST\",\n body: formData,\n },\n );\n },\n };\n\n this.entries = {\n list: async (indexId, params = {}) => {\n const search = new URLSearchParams();\n if (typeof params.take === \"number\") {\n search.set(\"take\", String(params.take));\n }\n if (typeof params.skip === \"number\") {\n search.set(\"skip\", String(params.skip));\n }\n\n const suffix = search.size > 0 ? `?${search.toString()}` : \"\";\n return this.client.request<ShiftListEntriesResponse>(\n `/v1/shift/indexes/${indexId}/entries${suffix}`,\n );\n },\n delete: async (indexId, entryId) => {\n return this.client.request<{ success: true }>(\n `/v1/shift/indexes/${indexId}/entries/${entryId}`,\n {\n method: \"DELETE\",\n },\n );\n },\n };\n }\n\n async search(indexId: string, params: ShiftSearchParams) {\n return this.client.request<{ results: ShiftSearchResult[] }>(\n `/v1/shift/indexes/${indexId}/search`,\n {\n method: \"POST\",\n body: params,\n },\n );\n }\n}\n\nfunction resolveUploadFileName(params: ShiftUploadFileParams) {\n if (params.fileName) {\n return params.fileName;\n }\n\n if (isNamedBlob(params.file)) {\n return params.file.name;\n }\n\n return \"upload.bin\";\n}\n\nfunction resolveUploadContentType(params: ShiftUploadFileParams) {\n if (params.contentType) {\n return params.contentType;\n }\n\n if (params.file instanceof Blob && params.file.type) {\n return params.file.type;\n }\n\n return \"application/octet-stream\";\n}\n\nfunction normalizeUploadFile(file: ShiftUploadableFile, contentType: string) {\n if (file instanceof Blob) {\n return file;\n }\n\n if (file instanceof Uint8Array) {\n return new Blob([toArrayBuffer(file)], { type: contentType });\n }\n\n return new Blob([file], { type: contentType });\n}\n\nfunction isNamedBlob(value: ShiftUploadableFile): value is Blob & { name: string } {\n return value instanceof Blob && \"name\" in value && typeof value.name === \"string\";\n}\n\nfunction toArrayBuffer(value: Uint8Array) {\n const copy = new Uint8Array(value.byteLength);\n copy.set(value);\n return copy.buffer;\n}\n","import {\n extractErrorMessage,\n RagableError,\n RagableRequestClient,\n} from \"./request-client\";\n\nexport interface AgentSummary {\n id: string;\n name: string;\n description: string | null;\n active: boolean;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface AgentChatMessage {\n role: \"user\" | \"assistant\";\n content: string;\n}\n\nexport interface AgentChatParams {\n message: string;\n history?: AgentChatMessage[];\n}\n\n/** Mirrors backend ExecutionResult JSON shape (traces are opaque in the SDK). */\nexport interface AgentChatResult {\n response: string;\n traces: unknown[];\n totalDurationMs: number;\n httpResponse?: unknown;\n}\n\n/**\n * Loose SSE event from POST /v1/agents/:id/chat/stream — narrows with `type` at runtime.\n */\nexport type AgentStreamEvent = Record<string, unknown> & { type: string };\n\nexport class AgentsClient {\n constructor(private readonly client: RagableRequestClient) {}\n\n async list(): Promise<{ agents: AgentSummary[] }> {\n return this.client.request(\"/v1/agents\");\n }\n\n async get(agentId: string): Promise<AgentSummary> {\n return this.client.request(`/v1/agents/${agentId}`);\n }\n\n async chat(\n agentId: string,\n params: AgentChatParams,\n ): Promise<AgentChatResult> {\n return this.client.request<AgentChatResult>(`/v1/agents/${agentId}/chat`, {\n method: \"POST\",\n body: {\n message: params.message,\n ...(params.history !== undefined ? { history: params.history } : {}),\n },\n });\n }\n\n /**\n * Stream agent execution as SSE (`data: {json}` lines). Yields parsed JSON objects.\n */\n async *chatStream(\n agentId: string,\n params: AgentChatParams,\n ): AsyncGenerator<AgentStreamEvent, void, undefined> {\n const response = await this.client.rawFetch(\n `/v1/agents/${agentId}/chat/stream`,\n {\n method: \"POST\",\n body: {\n message: params.message,\n ...(params.history !== undefined ? { history: params.history } : {}),\n },\n },\n );\n\n if (!response.ok) {\n const payload = await parseMaybeJsonBody(response);\n const message = extractErrorMessage(payload, response.statusText);\n throw new RagableError(message, response.status, payload);\n }\n\n const body = response.body;\n if (!body) {\n return;\n }\n\n const reader = body.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) {\n break;\n }\n buffer += decoder.decode(value, { stream: true });\n\n let boundary = buffer.indexOf(\"\\n\\n\");\n while (boundary !== -1) {\n const block = buffer.slice(0, boundary);\n buffer = buffer.slice(boundary + 2);\n for (const line of block.split(\"\\n\")) {\n const evt = parseSseDataLine(line);\n if (evt) {\n yield evt;\n }\n }\n boundary = buffer.indexOf(\"\\n\\n\");\n }\n }\n\n if (buffer.trim().length > 0) {\n for (const line of buffer.split(\"\\n\")) {\n const evt = parseSseDataLine(line);\n if (evt) {\n yield evt;\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n }\n}\n\nasync function parseMaybeJsonBody(response: Response): Promise<unknown> {\n const contentType = response.headers.get(\"content-type\") ?? \"\";\n if (contentType.includes(\"application/json\")) {\n try {\n return await response.json();\n } catch {\n return null;\n }\n }\n try {\n return await response.text();\n } catch {\n return null;\n }\n}\n\nfunction parseSseDataLine(line: string): AgentStreamEvent | null {\n const dataPrefix = \"data: \";\n if (!line.startsWith(dataPrefix)) {\n return null;\n }\n const json = line.slice(dataPrefix.length).trim();\n if (json.length === 0 || json === \"[DONE]\") {\n return null;\n }\n try {\n return JSON.parse(json) as AgentStreamEvent;\n } catch {\n return null;\n }\n}\n","import type {\n ShiftAddDocumentParams,\n ShiftIngestResponse,\n ShiftSearchParams,\n ShiftSearchResult,\n ShiftUploadFileParams,\n} from \"./shift\";\n\n/** Minimal client surface for {@link createRagPipeline} (implemented by {@link Ragable}). */\nexport interface RagClientForPipeline {\n shift: {\n documents: {\n create: (\n indexId: string,\n params: ShiftAddDocumentParams,\n ) => Promise<ShiftIngestResponse>;\n upload: (\n indexId: string,\n params: ShiftUploadFileParams,\n ) => Promise<ShiftIngestResponse>;\n };\n search: (\n indexId: string,\n params: ShiftSearchParams,\n ) => Promise<{ results: ShiftSearchResult[] }>;\n };\n}\n\nexport interface FormatContextOptions {\n /** Prepended before numbered passages (default: \"Relevant passages:\\\\n\") */\n header?: string;\n /** Joiner between passages (default: \"\\\\n\\\\n\") */\n separator?: string;\n /** Omit results with similarity score below this (default: no filter) */\n minScore?: number;\n /** Truncate total context string to this UTF-16 length (default: no limit) */\n maxChars?: number;\n /** Include similarity score in each block (default: false) */\n includeScores?: boolean;\n}\n\nexport interface RagPipelineOptions {\n indexId: string;\n}\n\nexport type RetrieveParams = ShiftSearchParams & {\n format?: FormatContextOptions;\n};\n\nexport interface RagPipeline {\n readonly indexId: string;\n ingestText(params: ShiftAddDocumentParams): Promise<ShiftIngestResponse>;\n ingestFile(params: ShiftUploadFileParams): Promise<ShiftIngestResponse>;\n search(params: ShiftSearchParams): Promise<{ results: ShiftSearchResult[] }>;\n retrieve(params: RetrieveParams): Promise<{\n results: ShiftSearchResult[];\n context: string;\n }>;\n}\n\n/**\n * Turn vector search hits into a single block of text for system prompts or RAG user messages.\n */\nexport function formatRetrievalContext(\n results: ShiftSearchResult[],\n options: FormatContextOptions = {},\n): string {\n const header = options.header ?? \"Relevant passages:\\n\";\n const separator = options.separator ?? \"\\n\\n\";\n const minScore = options.minScore;\n\n let filtered = results;\n if (typeof minScore === \"number\") {\n filtered = results.filter((r) => r.score >= minScore);\n }\n\n const blocks = filtered.map((r, i) => {\n const scoreSuffix =\n options.includeScores === true ? ` (score: ${r.score.toFixed(4)})` : \"\";\n return `[${i + 1}]${scoreSuffix}\\n${r.content.trim()}`;\n });\n\n let text = (blocks.length > 0 ? header : \"\") + blocks.join(separator);\n\n if (typeof options.maxChars === \"number\" && text.length > options.maxChars) {\n text = text.slice(0, options.maxChars).trimEnd() + \"\\n…\";\n }\n\n return text;\n}\n\n/**\n * High-level RAG helpers bound to one Shift index: ingest, search, retrieve with prompt-ready context.\n */\nexport function createRagPipeline(\n client: RagClientForPipeline,\n options: RagPipelineOptions,\n): RagPipeline {\n const { indexId } = options;\n\n return {\n indexId,\n\n ingestText(params) {\n return client.shift.documents.create(indexId, params);\n },\n\n ingestFile(params) {\n return client.shift.documents.upload(indexId, params);\n },\n\n search(params) {\n return client.shift.search(indexId, params);\n },\n\n async retrieve(params) {\n const { format: formatOpts, ...searchParams } = params;\n const { results } = await client.shift.search(indexId, searchParams);\n const context = formatRetrievalContext(results, formatOpts ?? {});\n return { results, context };\n },\n };\n}\n"],"mappings":"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","names":[]}