@starcite/sdk 0.0.1 → 0.0.2

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
@@ -33,10 +33,17 @@ var StarciteConnectionError = class extends StarciteError {
33
33
  // src/types.ts
34
34
  import { z } from "zod";
35
35
  var ArbitraryObjectSchema = z.record(z.unknown());
36
+ var CreatorTypeSchema = z.union([z.literal("user"), z.literal("agent")]);
37
+ var SessionCreatorPrincipalSchema = z.object({
38
+ tenant_id: z.string().min(1),
39
+ id: z.string().min(1),
40
+ type: CreatorTypeSchema
41
+ });
36
42
  var CreateSessionInputSchema = z.object({
37
43
  id: z.string().optional(),
38
44
  title: z.string().optional(),
39
- metadata: ArbitraryObjectSchema.optional()
45
+ metadata: ArbitraryObjectSchema.optional(),
46
+ creator_principal: SessionCreatorPrincipalSchema.optional()
40
47
  });
41
48
  var SessionRecordSchema = z.object({
42
49
  id: z.string(),
@@ -114,6 +121,11 @@ var StarciteErrorPayloadSchema = z.object({
114
121
  var DEFAULT_BASE_URL = typeof process !== "undefined" && process.env.STARCITE_BASE_URL ? process.env.STARCITE_BASE_URL : "http://localhost:4000";
115
122
  var TRAILING_SLASHES_REGEX = /\/+$/;
116
123
  var BEARER_PREFIX_REGEX = /^bearer\s+/i;
124
+ var DEFAULT_TAIL_RECONNECT_DELAY_MS = 3e3;
125
+ var NORMAL_WEBSOCKET_CLOSE_CODE = 1e3;
126
+ var SERVICE_TOKEN_SUB_ORG_PREFIX = "org:";
127
+ var SERVICE_TOKEN_SUB_AGENT_PREFIX = "agent:";
128
+ var SERVICE_TOKEN_SUB_USER_PREFIX = "user:";
117
129
  var TailFrameSchema = z2.string().transform((frame, context) => {
118
130
  try {
119
131
  return JSON.parse(frame);
@@ -234,6 +246,105 @@ function formatAuthorizationHeader(apiKey) {
234
246
  }
235
247
  return `Bearer ${normalized}`;
236
248
  }
249
+ function firstNonEmptyString(value) {
250
+ return typeof value === "string" && value.trim().length > 0 ? value.trim() : void 0;
251
+ }
252
+ function parseJwtSegment(segment) {
253
+ const base64 = segment.replace(/-/g, "+").replace(/_/g, "/").padEnd(segment.length + (4 - segment.length % 4) % 4, "=");
254
+ try {
255
+ if (typeof atob === "function") {
256
+ return atob(base64);
257
+ }
258
+ if (typeof Buffer !== "undefined") {
259
+ return Buffer.from(base64, "base64").toString("utf8");
260
+ }
261
+ } catch {
262
+ return void 0;
263
+ }
264
+ return void 0;
265
+ }
266
+ function parseJwtClaims(apiKey) {
267
+ const token = apiKey.replace(BEARER_PREFIX_REGEX, "").trim();
268
+ const parts = token.split(".");
269
+ if (parts.length !== 3) {
270
+ return void 0;
271
+ }
272
+ const [, payloadSegment] = parts;
273
+ if (payloadSegment === void 0) {
274
+ return void 0;
275
+ }
276
+ const payload = parseJwtSegment(payloadSegment);
277
+ if (payload === void 0) {
278
+ return void 0;
279
+ }
280
+ try {
281
+ const decoded = JSON.parse(payload);
282
+ return decoded !== null && typeof decoded === "object" ? decoded : void 0;
283
+ } catch {
284
+ return void 0;
285
+ }
286
+ }
287
+ function parseClaimStrings(source, keys) {
288
+ for (const key of keys) {
289
+ const value = firstNonEmptyString(source[key]);
290
+ if (value) {
291
+ return value;
292
+ }
293
+ }
294
+ return void 0;
295
+ }
296
+ function parseActorIdentityFromSubject(subject) {
297
+ if (subject.startsWith(SERVICE_TOKEN_SUB_AGENT_PREFIX)) {
298
+ return { id: subject, type: "agent" };
299
+ }
300
+ if (subject.startsWith(SERVICE_TOKEN_SUB_USER_PREFIX)) {
301
+ return { id: subject, type: "user" };
302
+ }
303
+ return void 0;
304
+ }
305
+ function parseTenantIdFromSubject(subject) {
306
+ const actorIdentity = parseActorIdentityFromSubject(subject);
307
+ if (actorIdentity !== void 0) {
308
+ return "";
309
+ }
310
+ if (subject.startsWith(SERVICE_TOKEN_SUB_ORG_PREFIX)) {
311
+ return subject.slice(SERVICE_TOKEN_SUB_ORG_PREFIX.length).trim();
312
+ }
313
+ return subject;
314
+ }
315
+ function parseCreatorPrincipalFromClaims(claims) {
316
+ const subject = firstNonEmptyString(claims.sub);
317
+ const explicitPrincipal = claims.principal && typeof claims.principal === "object" ? claims.principal : void 0;
318
+ const mergedClaims = explicitPrincipal ? { ...claims, ...explicitPrincipal } : claims;
319
+ const actorFromSubject = subject ? parseActorIdentityFromSubject(subject) : void 0;
320
+ const principalTypeFromClaims = parseClaimStrings(mergedClaims, [
321
+ "principal_type",
322
+ "principalType",
323
+ "type"
324
+ ]);
325
+ const tenantId = parseClaimStrings(mergedClaims, ["tenant_id", "tenantId"]);
326
+ const rawPrincipalId = parseClaimStrings(mergedClaims, [
327
+ "principal_id",
328
+ "principalId",
329
+ "id",
330
+ "sub"
331
+ ]);
332
+ const actorFromRawId = rawPrincipalId ? parseActorIdentityFromSubject(rawPrincipalId) : void 0;
333
+ const principal = {
334
+ tenant_id: tenantId ?? (subject ? parseTenantIdFromSubject(subject) : ""),
335
+ id: rawPrincipalId ?? actorFromSubject?.id ?? "",
336
+ type: principalTypeFromClaims === "agent" || principalTypeFromClaims === "user" ? principalTypeFromClaims : actorFromSubject?.type ?? actorFromRawId?.type ?? "user"
337
+ };
338
+ if (principal.tenant_id.length === 0 || principal.id.length === 0 || principal.type.length === 0) {
339
+ return void 0;
340
+ }
341
+ const result = SessionCreatorPrincipalSchema.safeParse(principal);
342
+ return result.success ? result.data : void 0;
343
+ }
344
+ function parseCreatorPrincipalFromClaimsSafe(apiKey) {
345
+ const claims = parseJwtClaims(apiKey);
346
+ return claims ? parseCreatorPrincipalFromClaims(claims) : void 0;
347
+ }
237
348
  function parseEventFrame(data) {
238
349
  const result = TailFrameSchema.safeParse(data);
239
350
  if (!result.success) {
@@ -248,6 +359,58 @@ function getEventData(event) {
248
359
  }
249
360
  return void 0;
250
361
  }
362
+ function getCloseCode(event) {
363
+ if (event && typeof event === "object" && "code" in event) {
364
+ const code = event.code;
365
+ return typeof code === "number" ? code : void 0;
366
+ }
367
+ return void 0;
368
+ }
369
+ function getCloseReason(event) {
370
+ if (event && typeof event === "object" && "reason" in event) {
371
+ const reason = event.reason;
372
+ return typeof reason === "string" && reason.length > 0 ? reason : void 0;
373
+ }
374
+ return void 0;
375
+ }
376
+ function describeClose(code, reason) {
377
+ const codeText = `code ${typeof code === "number" ? code : "unknown"}`;
378
+ return reason ? `${codeText}, reason '${reason}'` : codeText;
379
+ }
380
+ async function waitForDelay(ms, signal) {
381
+ if (ms <= 0) {
382
+ return;
383
+ }
384
+ await new Promise((resolve) => {
385
+ let settled = false;
386
+ const timeout = setTimeout(() => {
387
+ if (settled) {
388
+ return;
389
+ }
390
+ settled = true;
391
+ if (signal) {
392
+ signal.removeEventListener("abort", onAbort);
393
+ }
394
+ resolve();
395
+ }, ms);
396
+ const onAbort = () => {
397
+ if (settled) {
398
+ return;
399
+ }
400
+ settled = true;
401
+ clearTimeout(timeout);
402
+ signal?.removeEventListener("abort", onAbort);
403
+ resolve();
404
+ };
405
+ if (signal) {
406
+ if (signal.aborted) {
407
+ onAbort();
408
+ return;
409
+ }
410
+ signal.addEventListener("abort", onAbort, { once: true });
411
+ }
412
+ });
413
+ }
251
414
  function agentFromActor(actor) {
252
415
  if (actor.startsWith("agent:")) {
253
416
  return actor.slice("agent:".length);
@@ -317,6 +480,7 @@ var StarciteSession = class {
317
480
  var StarciteClient = class {
318
481
  /** Normalized API base URL ending with `/v1`. */
319
482
  baseUrl;
483
+ inferredCreatorPrincipal;
320
484
  websocketBaseUrl;
321
485
  fetchFn;
322
486
  headers;
@@ -330,10 +494,9 @@ var StarciteClient = class {
330
494
  this.fetchFn = options.fetch ?? defaultFetch;
331
495
  this.headers = new Headers(options.headers);
332
496
  if (options.apiKey !== void 0) {
333
- this.headers.set(
334
- "authorization",
335
- formatAuthorizationHeader(options.apiKey)
336
- );
497
+ const authorization = formatAuthorizationHeader(options.apiKey);
498
+ this.headers.set("authorization", authorization);
499
+ this.inferredCreatorPrincipal = parseCreatorPrincipalFromClaimsSafe(authorization);
337
500
  }
338
501
  this.websocketFactory = options.websocketFactory ?? defaultWebSocketFactory;
339
502
  }
@@ -354,7 +517,10 @@ var StarciteClient = class {
354
517
  * Creates a new session and returns the raw session record.
355
518
  */
356
519
  createSession(input = {}) {
357
- const payload = CreateSessionInputSchema.parse(input);
520
+ const payload = CreateSessionInputSchema.parse({
521
+ ...input,
522
+ creator_principal: input.creator_principal ?? this.inferredCreatorPrincipal
523
+ });
358
524
  return this.request(
359
525
  "/sessions",
360
526
  {
@@ -419,77 +585,130 @@ var StarciteClient = class {
419
585
  /**
420
586
  * Opens a WebSocket tail stream and yields raw events.
421
587
  */
588
+ // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: single-loop reconnect state machine is intentionally explicit for stream correctness.
422
589
  async *tailRawEvents(sessionId, options = {}) {
423
- const queue = new AsyncQueue();
424
- const cursor = options.cursor ?? 0;
425
- if (!Number.isInteger(cursor) || cursor < 0) {
590
+ const initialCursor = options.cursor ?? 0;
591
+ const reconnectEnabled = options.reconnect ?? true;
592
+ const reconnectDelayMs = options.reconnectDelayMs ?? DEFAULT_TAIL_RECONNECT_DELAY_MS;
593
+ if (!Number.isInteger(initialCursor) || initialCursor < 0) {
426
594
  throw new StarciteError("tail() cursor must be a non-negative integer");
427
595
  }
428
- const wsUrl = `${this.websocketBaseUrl}/sessions/${encodeURIComponent(
429
- sessionId
430
- )}/tail?cursor=${cursor}`;
431
- const websocketHeaders = new Headers();
432
- const authorization = this.headers.get("authorization");
433
- if (authorization) {
434
- websocketHeaders.set("authorization", authorization);
596
+ if (!Number.isFinite(reconnectDelayMs) || reconnectDelayMs < 0) {
597
+ throw new StarciteError(
598
+ "tail() reconnectDelayMs must be a non-negative number"
599
+ );
435
600
  }
436
- const socket = this.websocketFactory(
437
- wsUrl,
438
- hasAnyHeaders(websocketHeaders) ? {
439
- headers: websocketHeaders
440
- } : void 0
441
- );
442
- const onMessage = (event) => {
601
+ let cursor = initialCursor;
602
+ while (true) {
603
+ if (options.signal?.aborted) {
604
+ return;
605
+ }
606
+ const wsUrl = `${this.websocketBaseUrl}/sessions/${encodeURIComponent(
607
+ sessionId
608
+ )}/tail?cursor=${cursor}`;
609
+ const websocketHeaders = new Headers();
610
+ const authorization = this.headers.get("authorization");
611
+ if (authorization) {
612
+ websocketHeaders.set("authorization", authorization);
613
+ }
614
+ let socket;
443
615
  try {
444
- const parsed = parseEventFrame(getEventData(event));
445
- if (options.agent && agentFromActor(parsed.actor) !== options.agent) {
446
- return;
447
- }
448
- queue.push(parsed);
616
+ socket = this.websocketFactory(
617
+ wsUrl,
618
+ hasAnyHeaders(websocketHeaders) ? {
619
+ headers: websocketHeaders
620
+ } : void 0
621
+ );
449
622
  } catch (error) {
450
- queue.fail(error);
623
+ const rootCause = toError(error).message;
624
+ if (!reconnectEnabled || options.signal?.aborted) {
625
+ throw new StarciteConnectionError(
626
+ `Tail connection failed for session '${sessionId}': ${rootCause}`
627
+ );
628
+ }
629
+ await waitForDelay(reconnectDelayMs, options.signal);
630
+ continue;
451
631
  }
452
- };
453
- const onError = () => {
454
- queue.fail(
455
- new StarciteConnectionError(
456
- `Tail connection failed for session '${sessionId}'`
457
- )
458
- );
459
- };
460
- const onClose = () => {
461
- queue.close();
462
- };
463
- socket.addEventListener("message", onMessage);
464
- socket.addEventListener("error", onError);
465
- socket.addEventListener("close", onClose);
466
- const onAbort = () => {
467
- queue.close();
468
- socket.close(1e3, "aborted");
469
- };
470
- if (options.signal) {
471
- if (options.signal.aborted) {
472
- onAbort();
473
- } else {
474
- options.signal.addEventListener("abort", onAbort, { once: true });
632
+ const queue = new AsyncQueue();
633
+ let sawTransportError = false;
634
+ let closeCode;
635
+ let closeReason;
636
+ let abortRequested = false;
637
+ const onMessage = (event) => {
638
+ try {
639
+ const parsed = parseEventFrame(getEventData(event));
640
+ cursor = Math.max(cursor, parsed.seq);
641
+ if (options.agent && agentFromActor(parsed.actor) !== options.agent) {
642
+ return;
643
+ }
644
+ queue.push(parsed);
645
+ } catch (error) {
646
+ queue.fail(error);
647
+ }
648
+ };
649
+ const onError = () => {
650
+ sawTransportError = true;
651
+ queue.close();
652
+ };
653
+ const onClose = (event) => {
654
+ closeCode = getCloseCode(event);
655
+ closeReason = getCloseReason(event);
656
+ queue.close();
657
+ };
658
+ const onAbort = () => {
659
+ abortRequested = true;
660
+ queue.close();
661
+ socket.close(NORMAL_WEBSOCKET_CLOSE_CODE, "aborted");
662
+ };
663
+ socket.addEventListener("message", onMessage);
664
+ socket.addEventListener("error", onError);
665
+ socket.addEventListener("close", onClose);
666
+ if (options.signal) {
667
+ if (options.signal.aborted) {
668
+ onAbort();
669
+ } else {
670
+ options.signal.addEventListener("abort", onAbort, { once: true });
671
+ }
475
672
  }
476
- }
477
- try {
478
- while (true) {
479
- const next = await queue.next();
480
- if (next.done) {
481
- break;
673
+ let iterationError = null;
674
+ try {
675
+ while (true) {
676
+ const next = await queue.next();
677
+ if (next.done) {
678
+ break;
679
+ }
680
+ yield next.value;
482
681
  }
483
- yield next.value;
682
+ } catch (error) {
683
+ iterationError = toError(error);
684
+ } finally {
685
+ socket.removeEventListener("message", onMessage);
686
+ socket.removeEventListener("error", onError);
687
+ socket.removeEventListener("close", onClose);
688
+ if (options.signal) {
689
+ options.signal.removeEventListener("abort", onAbort);
690
+ }
691
+ socket.close(NORMAL_WEBSOCKET_CLOSE_CODE, "finished");
484
692
  }
485
- } finally {
486
- socket.removeEventListener("message", onMessage);
487
- socket.removeEventListener("error", onError);
488
- socket.removeEventListener("close", onClose);
489
- if (options.signal) {
490
- options.signal.removeEventListener("abort", onAbort);
693
+ if (iterationError) {
694
+ throw iterationError;
695
+ }
696
+ if (abortRequested || options.signal?.aborted) {
697
+ return;
698
+ }
699
+ const gracefullyClosed = !sawTransportError && closeCode === NORMAL_WEBSOCKET_CLOSE_CODE;
700
+ if (gracefullyClosed) {
701
+ return;
702
+ }
703
+ if (!reconnectEnabled) {
704
+ throw new StarciteConnectionError(
705
+ `Tail connection dropped for session '${sessionId}' (${describeClose(
706
+ closeCode,
707
+ closeReason
708
+ )})`
709
+ );
491
710
  }
492
- socket.close(1e3, "finished");
711
+ await waitForDelay(reconnectDelayMs, options.signal);
493
712
  }
494
713
  }
495
714
  /**
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/client.ts","../src/errors.ts","../src/types.ts","../src/index.ts"],"sourcesContent":["import { z } from \"zod\";\nimport {\n StarciteApiError,\n StarciteConnectionError,\n StarciteError,\n} from \"./errors\";\nimport type {\n AppendEventRequest,\n AppendEventResponse,\n CreateSessionInput,\n SessionAppendInput,\n SessionEvent,\n SessionListOptions,\n SessionListPage,\n SessionRecord,\n SessionTailOptions,\n StarciteClientOptions,\n StarciteErrorPayload,\n StarciteWebSocket,\n StarciteWebSocketConnectOptions,\n TailEvent,\n} from \"./types\";\nimport {\n AppendEventRequestSchema,\n AppendEventResponseSchema,\n CreateSessionInputSchema,\n SessionAppendInputSchema,\n SessionListPageSchema,\n SessionRecordSchema,\n StarciteErrorPayloadSchema,\n TailEventSchema,\n} from \"./types\";\n\nconst DEFAULT_BASE_URL =\n typeof process !== \"undefined\" && process.env.STARCITE_BASE_URL\n ? process.env.STARCITE_BASE_URL\n : \"http://localhost:4000\";\nconst TRAILING_SLASHES_REGEX = /\\/+$/;\nconst BEARER_PREFIX_REGEX = /^bearer\\s+/i;\n\nconst TailFrameSchema = z\n .string()\n .transform((frame, context): unknown => {\n try {\n return JSON.parse(frame) as unknown;\n } catch {\n context.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"Tail frame was not valid JSON\",\n });\n return z.NEVER;\n }\n })\n .pipe(TailEventSchema);\n\nclass AsyncQueue<T> {\n private readonly items: Array<\n | { type: \"value\"; value: T }\n | { type: \"done\" }\n | { type: \"error\"; error: Error }\n > = [];\n private readonly waiters: Array<\n (\n item:\n | { type: \"value\"; value: T }\n | { type: \"done\" }\n | { type: \"error\"; error: Error }\n ) => void\n > = [];\n private settled = false;\n\n push(value: T): void {\n if (this.settled) {\n return;\n }\n\n this.enqueue({ type: \"value\", value });\n }\n\n close(): void {\n if (this.settled) {\n return;\n }\n\n this.settled = true;\n this.enqueue({ type: \"done\" });\n }\n\n fail(error: unknown): void {\n if (this.settled) {\n return;\n }\n\n this.settled = true;\n this.enqueue({ type: \"error\", error: toError(error) });\n }\n\n async next(): Promise<IteratorResult<T>> {\n const item =\n this.items.shift() ??\n (await new Promise<(typeof this.items)[number]>((resolve) => {\n this.waiters.push(resolve);\n }));\n\n if (item.type === \"value\") {\n return { value: item.value, done: false };\n }\n\n if (item.type === \"done\") {\n return { value: undefined, done: true };\n }\n\n throw item.error;\n }\n\n private enqueue(item: (typeof this.items)[number]): void {\n const waiter = this.waiters.shift();\n\n if (waiter) {\n waiter(item);\n return;\n }\n\n this.items.push(item);\n }\n}\n\n/**\n * Normalizes a Starcite base URL to the `/v1` API root used by this SDK.\n */\nexport function normalizeBaseUrl(baseUrl: string): string {\n const trimmed = baseUrl.trim().replace(TRAILING_SLASHES_REGEX, \"\");\n return trimmed.endsWith(\"/v1\") ? trimmed : `${trimmed}/v1`;\n}\n\nfunction toWebSocketBaseUrl(apiBaseUrl: string): string {\n if (apiBaseUrl.startsWith(\"https://\")) {\n return `wss://${apiBaseUrl.slice(\"https://\".length)}`;\n }\n\n if (apiBaseUrl.startsWith(\"http://\")) {\n return `ws://${apiBaseUrl.slice(\"http://\".length)}`;\n }\n\n throw new StarciteError(\n `Invalid Starcite base URL '${apiBaseUrl}'. Use http:// or https://.`\n );\n}\n\nfunction defaultWebSocketFactory(\n url: string,\n options: StarciteWebSocketConnectOptions = {}\n): StarciteWebSocket {\n if (typeof WebSocket === \"undefined\") {\n throw new StarciteError(\n \"WebSocket is not available in this runtime. Provide websocketFactory in StarciteClientOptions.\"\n );\n }\n\n const headers = new Headers(options.headers);\n\n if (!hasAnyHeaders(headers)) {\n return new WebSocket(url) as unknown as StarciteWebSocket;\n }\n\n const headerObject = Object.fromEntries(headers.entries());\n\n try {\n return new (\n WebSocket as unknown as {\n new (\n websocketUrl: string,\n options: { headers: Record<string, string> }\n ): StarciteWebSocket;\n }\n )(url, { headers: headerObject });\n } catch {\n throw new StarciteError(\n \"This runtime cannot set WebSocket upgrade headers with the default factory. Provide websocketFactory in StarciteClientOptions.\"\n );\n }\n}\n\nfunction defaultFetch(\n input: RequestInfo | URL,\n init?: RequestInit\n): Promise<Response> {\n if (typeof fetch === \"undefined\") {\n throw new StarciteError(\n \"fetch is not available in this runtime. Provide fetch in StarciteClientOptions.\"\n );\n }\n\n return fetch(input, init);\n}\n\nfunction toError(error: unknown): Error {\n if (error instanceof Error) {\n return error;\n }\n\n return new Error(typeof error === \"string\" ? error : \"Unknown error\");\n}\n\nfunction hasAnyHeaders(headers: Headers): boolean {\n for (const _ of headers.keys()) {\n return true;\n }\n\n return false;\n}\n\nfunction formatAuthorizationHeader(apiKey: string): string {\n const normalized = apiKey.trim();\n\n if (normalized.length === 0) {\n throw new StarciteError(\"apiKey cannot be empty\");\n }\n\n if (BEARER_PREFIX_REGEX.test(normalized)) {\n return normalized;\n }\n\n return `Bearer ${normalized}`;\n}\n\nfunction parseEventFrame(data: unknown): TailEvent {\n const result = TailFrameSchema.safeParse(data);\n\n if (!result.success) {\n const reason =\n result.error.issues[0]?.message ?? \"Tail frame did not match schema\";\n throw new StarciteConnectionError(reason);\n }\n\n return result.data;\n}\n\nfunction getEventData(event: unknown): unknown {\n if (event && typeof event === \"object\" && \"data\" in event) {\n return (event as { data?: unknown }).data;\n }\n\n return undefined;\n}\n\nfunction agentFromActor(actor: string): string | undefined {\n if (actor.startsWith(\"agent:\")) {\n return actor.slice(\"agent:\".length);\n }\n\n return undefined;\n}\n\nfunction toSessionEvent(event: TailEvent): SessionEvent {\n const agent = agentFromActor(event.actor);\n const text =\n typeof event.payload.text === \"string\" ? event.payload.text : undefined;\n\n return {\n ...event,\n agent,\n text,\n };\n}\n\n/**\n * Session-scoped helper for append and tail operations.\n */\nexport class StarciteSession {\n /** Session identifier. */\n readonly id: string;\n /** Optional session record captured at creation time. */\n readonly record?: SessionRecord;\n\n private readonly client: StarciteClient;\n\n constructor(client: StarciteClient, id: string, record?: SessionRecord) {\n this.client = client;\n this.id = id;\n this.record = record;\n }\n\n /**\n * Appends a high-level agent event to this session.\n *\n * Automatically prefixes `agent` as `agent:<name>` when needed.\n */\n append(input: SessionAppendInput): Promise<AppendEventResponse> {\n const parsed = SessionAppendInputSchema.parse(input);\n const actor = parsed.agent.startsWith(\"agent:\")\n ? parsed.agent\n : `agent:${parsed.agent}`;\n\n return this.client.appendEvent(this.id, {\n type: parsed.type ?? \"content\",\n payload: parsed.payload ?? { text: parsed.text },\n actor,\n producer_id: parsed.producerId,\n producer_seq: parsed.producerSeq,\n source: parsed.source ?? \"agent\",\n metadata: parsed.metadata,\n refs: parsed.refs,\n idempotency_key: parsed.idempotencyKey,\n expected_seq: parsed.expectedSeq,\n });\n }\n\n /**\n * Appends a raw event payload as-is.\n */\n appendRaw(input: AppendEventRequest): Promise<AppendEventResponse> {\n return this.client.appendEvent(this.id, input);\n }\n\n /**\n * Streams transformed session events with SDK convenience fields (`agent`, `text`).\n */\n tail(options: SessionTailOptions = {}): AsyncIterable<SessionEvent> {\n return this.client.tailEvents(this.id, options);\n }\n\n /**\n * Streams raw tail events returned by the API.\n */\n tailRaw(options: SessionTailOptions = {}): AsyncIterable<TailEvent> {\n return this.client.tailRawEvents(this.id, options);\n }\n}\n\n/**\n * Starcite API client for HTTP and WebSocket session operations.\n */\nexport class StarciteClient {\n /** Normalized API base URL ending with `/v1`. */\n readonly baseUrl: string;\n\n private readonly websocketBaseUrl: string;\n private readonly fetchFn: typeof fetch;\n private readonly headers: Headers;\n private readonly websocketFactory: (\n url: string,\n options?: StarciteWebSocketConnectOptions\n ) => StarciteWebSocket;\n\n /**\n * Creates a new client instance.\n */\n constructor(options: StarciteClientOptions = {}) {\n this.baseUrl = normalizeBaseUrl(options.baseUrl ?? DEFAULT_BASE_URL);\n this.websocketBaseUrl = toWebSocketBaseUrl(this.baseUrl);\n this.fetchFn = options.fetch ?? defaultFetch;\n this.headers = new Headers(options.headers);\n\n if (options.apiKey !== undefined) {\n this.headers.set(\n \"authorization\",\n formatAuthorizationHeader(options.apiKey)\n );\n }\n\n this.websocketFactory = options.websocketFactory ?? defaultWebSocketFactory;\n }\n\n /**\n * Returns a session helper bound to an existing session id.\n */\n session(sessionId: string, record?: SessionRecord): StarciteSession {\n return new StarciteSession(this, sessionId, record);\n }\n\n /**\n * Creates a new session and returns a bound `StarciteSession` helper.\n */\n async create(input: CreateSessionInput = {}): Promise<StarciteSession> {\n const record = await this.createSession(input);\n return this.session(record.id, record);\n }\n\n /**\n * Creates a new session and returns the raw session record.\n */\n createSession(input: CreateSessionInput = {}): Promise<SessionRecord> {\n const payload = CreateSessionInputSchema.parse(input);\n\n return this.request(\n \"/sessions\",\n {\n method: \"POST\",\n body: JSON.stringify(payload),\n },\n SessionRecordSchema\n );\n }\n\n /**\n * Lists sessions from the archive-backed catalog.\n */\n listSessions(options: SessionListOptions = {}): Promise<SessionListPage> {\n const query = new URLSearchParams();\n\n if (options.limit !== undefined) {\n if (!Number.isInteger(options.limit) || options.limit <= 0) {\n throw new StarciteError(\n \"listSessions() limit must be a positive integer\"\n );\n }\n\n query.set(\"limit\", `${options.limit}`);\n }\n\n if (options.cursor !== undefined) {\n if (options.cursor.trim().length === 0) {\n throw new StarciteError(\"listSessions() cursor cannot be empty\");\n }\n\n query.set(\"cursor\", options.cursor);\n }\n\n if (options.metadata !== undefined) {\n for (const [key, value] of Object.entries(options.metadata)) {\n if (key.trim().length === 0 || value.trim().length === 0) {\n throw new StarciteError(\n \"listSessions() metadata filters must be non-empty strings\"\n );\n }\n\n query.set(`metadata.${key}`, value);\n }\n }\n\n const suffix = query.size > 0 ? `?${query.toString()}` : \"\";\n\n return this.request(\n `/sessions${suffix}`,\n {\n method: \"GET\",\n },\n SessionListPageSchema\n );\n }\n\n /**\n * Appends a raw event payload to a specific session.\n */\n appendEvent(\n sessionId: string,\n input: AppendEventRequest\n ): Promise<AppendEventResponse> {\n const payload = AppendEventRequestSchema.parse(input);\n\n return this.request(\n `/sessions/${encodeURIComponent(sessionId)}/append`,\n {\n method: \"POST\",\n body: JSON.stringify(payload),\n },\n AppendEventResponseSchema\n );\n }\n\n /**\n * Opens a WebSocket tail stream and yields raw events.\n */\n async *tailRawEvents(\n sessionId: string,\n options: SessionTailOptions = {}\n ): AsyncGenerator<TailEvent> {\n const queue = new AsyncQueue<TailEvent>();\n const cursor = options.cursor ?? 0;\n\n if (!Number.isInteger(cursor) || cursor < 0) {\n throw new StarciteError(\"tail() cursor must be a non-negative integer\");\n }\n\n const wsUrl = `${this.websocketBaseUrl}/sessions/${encodeURIComponent(\n sessionId\n )}/tail?cursor=${cursor}`;\n\n const websocketHeaders = new Headers();\n const authorization = this.headers.get(\"authorization\");\n\n if (authorization) {\n websocketHeaders.set(\"authorization\", authorization);\n }\n\n const socket = this.websocketFactory(\n wsUrl,\n hasAnyHeaders(websocketHeaders)\n ? {\n headers: websocketHeaders,\n }\n : undefined\n );\n\n const onMessage = (event: unknown): void => {\n try {\n const parsed = parseEventFrame(getEventData(event));\n\n if (options.agent && agentFromActor(parsed.actor) !== options.agent) {\n return;\n }\n\n queue.push(parsed);\n } catch (error) {\n queue.fail(error);\n }\n };\n\n const onError = (): void => {\n queue.fail(\n new StarciteConnectionError(\n `Tail connection failed for session '${sessionId}'`\n )\n );\n };\n\n const onClose = (): void => {\n queue.close();\n };\n\n socket.addEventListener(\"message\", onMessage);\n socket.addEventListener(\"error\", onError);\n socket.addEventListener(\"close\", onClose);\n\n const onAbort = (): void => {\n queue.close();\n socket.close(1000, \"aborted\");\n };\n\n if (options.signal) {\n if (options.signal.aborted) {\n onAbort();\n } else {\n options.signal.addEventListener(\"abort\", onAbort, { once: true });\n }\n }\n\n try {\n while (true) {\n const next = await queue.next();\n\n if (next.done) {\n break;\n }\n\n yield next.value;\n }\n } finally {\n socket.removeEventListener(\"message\", onMessage);\n socket.removeEventListener(\"error\", onError);\n socket.removeEventListener(\"close\", onClose);\n\n if (options.signal) {\n options.signal.removeEventListener(\"abort\", onAbort);\n }\n\n socket.close(1000, \"finished\");\n }\n }\n\n /**\n * Opens a WebSocket tail stream and yields transformed session events.\n */\n async *tailEvents(\n sessionId: string,\n options: SessionTailOptions = {}\n ): AsyncGenerator<SessionEvent> {\n for await (const rawEvent of this.tailRawEvents(sessionId, options)) {\n yield toSessionEvent(rawEvent);\n }\n }\n\n private async request<T>(\n path: string,\n init: RequestInit,\n schema?: z.ZodType<T>\n ): Promise<T> {\n const headers = new Headers(this.headers);\n\n if (!headers.has(\"content-type\")) {\n headers.set(\"content-type\", \"application/json\");\n }\n\n if (init.headers) {\n const perRequestHeaders = new Headers(init.headers);\n for (const [key, value] of perRequestHeaders.entries()) {\n headers.set(key, value);\n }\n }\n\n let response: Response;\n\n try {\n response = await this.fetchFn(`${this.baseUrl}${path}`, {\n ...init,\n headers,\n });\n } catch (error) {\n const rootCause = toError(error).message;\n throw new StarciteConnectionError(\n `Failed to connect to Starcite at ${this.baseUrl}: ${rootCause}`\n );\n }\n\n if (!response.ok) {\n const payload = await tryParseJson(response);\n const code =\n typeof payload?.error === \"string\"\n ? payload.error\n : `http_${response.status}`;\n const message =\n typeof payload?.message === \"string\"\n ? payload.message\n : response.statusText;\n\n throw new StarciteApiError(message, response.status, code, payload);\n }\n\n if (response.status === 204) {\n return undefined as T;\n }\n\n const responseBody = (await response.json()) as unknown;\n\n if (!schema) {\n return responseBody as T;\n }\n\n const parsed = schema.safeParse(responseBody);\n if (!parsed.success) {\n const issue = parsed.error.issues[0]?.message ?? \"invalid response\";\n throw new StarciteConnectionError(\n `Received unexpected response payload from Starcite: ${issue}`\n );\n }\n\n return parsed.data;\n }\n}\n\nasync function tryParseJson(\n response: Response\n): Promise<StarciteErrorPayload | null> {\n try {\n const parsed = (await response.json()) as unknown;\n const result = StarciteErrorPayloadSchema.safeParse(parsed);\n return result.success ? result.data : null;\n } catch {\n return null;\n }\n}\n","import type { StarciteErrorPayload } from \"./types\";\n\n/**\n * Base error type for SDK-level failures.\n */\nexport class StarciteError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"StarciteError\";\n }\n}\n\n/**\n * Thrown when the Starcite API responds with a non-2xx status code.\n */\nexport class StarciteApiError extends StarciteError {\n /** HTTP status code returned by the API. */\n readonly status: number;\n /** Stable API error code (or synthesized `http_<status>` fallback). */\n readonly code: string;\n /** Parsed API error payload when available. */\n readonly payload: StarciteErrorPayload | null;\n\n constructor(\n message: string,\n status: number,\n code: string,\n payload: StarciteErrorPayload | null\n ) {\n super(message);\n this.name = \"StarciteApiError\";\n this.status = status;\n this.code = code;\n this.payload = payload;\n }\n}\n\n/**\n * Thrown when the SDK cannot reach Starcite or receives invalid transport payloads.\n */\nexport class StarciteConnectionError extends StarciteError {\n constructor(message: string) {\n super(message);\n this.name = \"StarciteConnectionError\";\n }\n}\n","import { z } from \"zod\";\n\nconst ArbitraryObjectSchema = z.record(z.unknown());\n\n/**\n * Request payload for creating a session.\n */\nexport const CreateSessionInputSchema = z.object({\n id: z.string().optional(),\n title: z.string().optional(),\n metadata: ArbitraryObjectSchema.optional(),\n});\n\n/**\n * Inferred TypeScript type for {@link CreateSessionInputSchema}.\n */\nexport type CreateSessionInput = z.infer<typeof CreateSessionInputSchema>;\n\n/**\n * Session record returned by the Starcite API.\n */\nexport const SessionRecordSchema = z.object({\n id: z.string(),\n title: z.string().nullable().optional(),\n metadata: ArbitraryObjectSchema,\n last_seq: z.number().int().nonnegative(),\n created_at: z.string(),\n updated_at: z.string(),\n});\n\n/**\n * Inferred TypeScript type for {@link SessionRecordSchema}.\n */\nexport type SessionRecord = z.infer<typeof SessionRecordSchema>;\n\n/**\n * Session item returned by the list endpoint.\n */\nexport const SessionListItemSchema = z.object({\n id: z.string(),\n title: z.string().nullable().optional(),\n metadata: ArbitraryObjectSchema,\n created_at: z.string(),\n});\n\n/**\n * Inferred TypeScript type for {@link SessionListItemSchema}.\n */\nexport type SessionListItem = z.infer<typeof SessionListItemSchema>;\n\n/**\n * Paginated session list response.\n */\nexport const SessionListPageSchema = z.object({\n sessions: z.array(SessionListItemSchema),\n next_cursor: z.string().nullable(),\n});\n\n/**\n * Inferred TypeScript type for {@link SessionListPageSchema}.\n */\nexport type SessionListPage = z.infer<typeof SessionListPageSchema>;\n\n/**\n * Low-level request payload for appending an event to a session.\n */\nexport const AppendEventRequestSchema = z.object({\n type: z.string().min(1),\n payload: ArbitraryObjectSchema,\n actor: z.string().min(1),\n producer_id: z.string().min(1),\n producer_seq: z.number().int().positive(),\n source: z.string().optional(),\n metadata: ArbitraryObjectSchema.optional(),\n refs: ArbitraryObjectSchema.optional(),\n idempotency_key: z.string().optional(),\n expected_seq: z.number().int().nonnegative().optional(),\n});\n\n/**\n * Inferred TypeScript type for {@link AppendEventRequestSchema}.\n */\nexport type AppendEventRequest = z.infer<typeof AppendEventRequestSchema>;\n\n/**\n * API response returned after appending an event.\n */\nexport const AppendEventResponseSchema = z.object({\n seq: z.number().int().nonnegative(),\n last_seq: z.number().int().nonnegative(),\n deduped: z.boolean(),\n});\n\n/**\n * Inferred TypeScript type for {@link AppendEventResponseSchema}.\n */\nexport type AppendEventResponse = z.infer<typeof AppendEventResponseSchema>;\n\n/**\n * Raw event frame shape emitted by the Starcite tail stream.\n */\nexport const TailEventSchema = z.object({\n seq: z.number().int().nonnegative(),\n type: z.string().min(1),\n payload: ArbitraryObjectSchema,\n actor: z.string().min(1),\n producer_id: z.string().min(1),\n producer_seq: z.number().int().positive(),\n source: z.string().optional(),\n metadata: ArbitraryObjectSchema.optional(),\n refs: ArbitraryObjectSchema.optional(),\n idempotency_key: z.string().nullable().optional(),\n inserted_at: z.string().optional(),\n});\n\n/**\n * Inferred TypeScript type for {@link TailEventSchema}.\n */\nexport type TailEvent = z.infer<typeof TailEventSchema>;\n\n/**\n * Convenience tail event shape with SDK-derived fields (`agent`, `text`).\n */\nconst SessionEventInternalSchema = TailEventSchema.extend({\n agent: z.string().optional(),\n text: z.string().optional(),\n});\n\n/**\n * Inferred TypeScript type for the SDK-level enriched tail event.\n */\nexport type SessionEvent = z.infer<typeof SessionEventInternalSchema>;\n\n/**\n * High-level `session.append()` input.\n *\n * You must provide producer identity (`producerId`, `producerSeq`) and either\n * `text` or `payload`.\n */\nexport const SessionAppendInputSchema = z\n .object({\n agent: z.string().trim().min(1),\n producerId: z.string().trim().min(1),\n producerSeq: z.number().int().positive(),\n text: z.string().optional(),\n payload: ArbitraryObjectSchema.optional(),\n type: z.string().optional(),\n source: z.string().optional(),\n metadata: ArbitraryObjectSchema.optional(),\n refs: ArbitraryObjectSchema.optional(),\n idempotencyKey: z.string().optional(),\n expectedSeq: z.number().int().nonnegative().optional(),\n })\n .refine((value) => !!(value.text || value.payload), {\n message: \"append() requires either 'text' or an object 'payload'\",\n });\n\n/**\n * Inferred TypeScript type for {@link SessionAppendInputSchema}.\n */\nexport type SessionAppendInput = z.infer<typeof SessionAppendInputSchema>;\n\n/**\n * Options for streaming events from a session.\n */\nexport interface SessionTailOptions {\n /**\n * Starting cursor (inclusive) in the event stream.\n */\n cursor?: number;\n /**\n * Optional filter for `agent:<name>` events.\n */\n agent?: string;\n /**\n * Optional abort signal to close the stream.\n */\n signal?: AbortSignal;\n}\n\n/**\n * Options for listing sessions.\n */\nexport interface SessionListOptions {\n /**\n * Maximum rows to return. Must be a positive integer.\n */\n limit?: number;\n /**\n * Optional cursor from the previous response.\n */\n cursor?: string;\n /**\n * Optional flat metadata exact-match filters.\n */\n metadata?: Record<string, string>;\n}\n\n/**\n * Minimal WebSocket contract required by the SDK.\n */\nexport interface StarciteWebSocket {\n addEventListener(type: string, listener: (event: unknown) => void): void;\n removeEventListener(type: string, listener: (event: unknown) => void): void;\n close(code?: number, reason?: string): void;\n}\n\n/**\n * Factory used to create the WebSocket connection for `tail`.\n */\nexport interface StarciteWebSocketConnectOptions {\n /**\n * Headers to include with the WebSocket handshake request.\n */\n headers?: HeadersInit;\n}\n\n/**\n * Factory used to create the WebSocket connection for `tail`.\n */\nexport type StarciteWebSocketFactory = (\n url: string,\n options?: StarciteWebSocketConnectOptions\n) => StarciteWebSocket;\n\n/**\n * Client construction options.\n */\nexport interface StarciteClientOptions {\n /**\n * Base API URL. Defaults to `process.env.STARCITE_BASE_URL` or `http://localhost:4000`.\n */\n baseUrl?: string;\n /**\n * Custom fetch implementation for non-standard runtimes.\n */\n fetch?: typeof fetch;\n /**\n * Headers applied to every HTTP request.\n */\n headers?: HeadersInit;\n /**\n * Service key / JWT token. When set, the SDK automatically sends\n * `Authorization: Bearer <token>` for HTTP requests and WebSocket upgrades.\n */\n apiKey?: string;\n /**\n * Custom WebSocket factory for non-browser runtimes.\n */\n websocketFactory?: StarciteWebSocketFactory;\n}\n\n/**\n * Error payload shape returned by non-2xx API responses.\n */\nexport const StarciteErrorPayloadSchema = z\n .object({\n error: z.string().optional(),\n message: z.string().optional(),\n })\n .catchall(z.unknown());\n\n/**\n * Inferred TypeScript type for {@link StarciteErrorPayloadSchema}.\n */\nexport type StarciteErrorPayload = z.infer<typeof StarciteErrorPayloadSchema>;\n","import { StarciteClient } from \"./client\";\nimport type { StarciteClientOptions } from \"./types\";\n\n// biome-ignore lint/performance/noBarrelFile: package entrypoint intentionally re-exports public API.\nexport { normalizeBaseUrl, StarciteClient, StarciteSession } from \"./client\";\nexport {\n StarciteApiError,\n StarciteConnectionError,\n StarciteError,\n} from \"./errors\";\nexport type {\n AppendEventRequest,\n AppendEventResponse,\n CreateSessionInput,\n SessionAppendInput,\n SessionEvent,\n SessionListItem,\n SessionListOptions,\n SessionListPage,\n SessionRecord,\n SessionTailOptions,\n StarciteClientOptions,\n StarciteErrorPayload,\n StarciteWebSocket,\n StarciteWebSocketConnectOptions,\n StarciteWebSocketFactory,\n TailEvent,\n} from \"./types\";\n/**\n * Creates a new {@link StarciteClient} instance.\n */\nexport function createStarciteClient(\n options: StarciteClientOptions = {}\n): StarciteClient {\n return new StarciteClient(options);\n}\n\n/**\n * Default singleton client using environment/default configuration.\n */\nexport const starcite = createStarciteClient();\n"],"mappings":"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","names":["z","z"]}
1
+ {"version":3,"sources":["../src/client.ts","../src/errors.ts","../src/types.ts","../src/index.ts"],"sourcesContent":["import { z } from \"zod\";\nimport {\n StarciteApiError,\n StarciteConnectionError,\n StarciteError,\n} from \"./errors\";\nimport type {\n AppendEventRequest,\n AppendEventResponse,\n CreateSessionInput,\n SessionAppendInput,\n SessionCreatorPrincipal,\n SessionEvent,\n SessionListOptions,\n SessionListPage,\n SessionRecord,\n SessionTailOptions,\n StarciteClientOptions,\n StarciteErrorPayload,\n StarciteWebSocket,\n StarciteWebSocketConnectOptions,\n TailEvent,\n} from \"./types\";\nimport {\n AppendEventRequestSchema,\n AppendEventResponseSchema,\n CreateSessionInputSchema,\n SessionAppendInputSchema,\n SessionCreatorPrincipalSchema,\n SessionListPageSchema,\n SessionRecordSchema,\n StarciteErrorPayloadSchema,\n TailEventSchema,\n} from \"./types\";\n\nconst DEFAULT_BASE_URL =\n typeof process !== \"undefined\" && process.env.STARCITE_BASE_URL\n ? process.env.STARCITE_BASE_URL\n : \"http://localhost:4000\";\nconst TRAILING_SLASHES_REGEX = /\\/+$/;\nconst BEARER_PREFIX_REGEX = /^bearer\\s+/i;\nconst DEFAULT_TAIL_RECONNECT_DELAY_MS = 3000;\nconst NORMAL_WEBSOCKET_CLOSE_CODE = 1000;\nconst SERVICE_TOKEN_SUB_ORG_PREFIX = \"org:\";\nconst SERVICE_TOKEN_SUB_AGENT_PREFIX = \"agent:\";\nconst SERVICE_TOKEN_SUB_USER_PREFIX = \"user:\";\n\nconst TailFrameSchema = z\n .string()\n .transform((frame, context): unknown => {\n try {\n return JSON.parse(frame) as unknown;\n } catch {\n context.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"Tail frame was not valid JSON\",\n });\n return z.NEVER;\n }\n })\n .pipe(TailEventSchema);\n\nclass AsyncQueue<T> {\n private readonly items: Array<\n | { type: \"value\"; value: T }\n | { type: \"done\" }\n | { type: \"error\"; error: Error }\n > = [];\n private readonly waiters: Array<\n (\n item:\n | { type: \"value\"; value: T }\n | { type: \"done\" }\n | { type: \"error\"; error: Error }\n ) => void\n > = [];\n private settled = false;\n\n push(value: T): void {\n if (this.settled) {\n return;\n }\n\n this.enqueue({ type: \"value\", value });\n }\n\n close(): void {\n if (this.settled) {\n return;\n }\n\n this.settled = true;\n this.enqueue({ type: \"done\" });\n }\n\n fail(error: unknown): void {\n if (this.settled) {\n return;\n }\n\n this.settled = true;\n this.enqueue({ type: \"error\", error: toError(error) });\n }\n\n async next(): Promise<IteratorResult<T>> {\n const item =\n this.items.shift() ??\n (await new Promise<(typeof this.items)[number]>((resolve) => {\n this.waiters.push(resolve);\n }));\n\n if (item.type === \"value\") {\n return { value: item.value, done: false };\n }\n\n if (item.type === \"done\") {\n return { value: undefined, done: true };\n }\n\n throw item.error;\n }\n\n private enqueue(item: (typeof this.items)[number]): void {\n const waiter = this.waiters.shift();\n\n if (waiter) {\n waiter(item);\n return;\n }\n\n this.items.push(item);\n }\n}\n\n/**\n * Normalizes a Starcite base URL to the `/v1` API root used by this SDK.\n */\nexport function normalizeBaseUrl(baseUrl: string): string {\n const trimmed = baseUrl.trim().replace(TRAILING_SLASHES_REGEX, \"\");\n return trimmed.endsWith(\"/v1\") ? trimmed : `${trimmed}/v1`;\n}\n\nfunction toWebSocketBaseUrl(apiBaseUrl: string): string {\n if (apiBaseUrl.startsWith(\"https://\")) {\n return `wss://${apiBaseUrl.slice(\"https://\".length)}`;\n }\n\n if (apiBaseUrl.startsWith(\"http://\")) {\n return `ws://${apiBaseUrl.slice(\"http://\".length)}`;\n }\n\n throw new StarciteError(\n `Invalid Starcite base URL '${apiBaseUrl}'. Use http:// or https://.`\n );\n}\n\nfunction defaultWebSocketFactory(\n url: string,\n options: StarciteWebSocketConnectOptions = {}\n): StarciteWebSocket {\n if (typeof WebSocket === \"undefined\") {\n throw new StarciteError(\n \"WebSocket is not available in this runtime. Provide websocketFactory in StarciteClientOptions.\"\n );\n }\n\n const headers = new Headers(options.headers);\n\n if (!hasAnyHeaders(headers)) {\n return new WebSocket(url) as unknown as StarciteWebSocket;\n }\n\n const headerObject = Object.fromEntries(headers.entries());\n\n try {\n return new (\n WebSocket as unknown as {\n new (\n websocketUrl: string,\n options: { headers: Record<string, string> }\n ): StarciteWebSocket;\n }\n )(url, { headers: headerObject });\n } catch {\n throw new StarciteError(\n \"This runtime cannot set WebSocket upgrade headers with the default factory. Provide websocketFactory in StarciteClientOptions.\"\n );\n }\n}\n\nfunction defaultFetch(\n input: RequestInfo | URL,\n init?: RequestInit\n): Promise<Response> {\n if (typeof fetch === \"undefined\") {\n throw new StarciteError(\n \"fetch is not available in this runtime. Provide fetch in StarciteClientOptions.\"\n );\n }\n\n return fetch(input, init);\n}\n\nfunction toError(error: unknown): Error {\n if (error instanceof Error) {\n return error;\n }\n\n return new Error(typeof error === \"string\" ? error : \"Unknown error\");\n}\n\nfunction hasAnyHeaders(headers: Headers): boolean {\n for (const _ of headers.keys()) {\n return true;\n }\n\n return false;\n}\n\nfunction formatAuthorizationHeader(apiKey: string): string {\n const normalized = apiKey.trim();\n\n if (normalized.length === 0) {\n throw new StarciteError(\"apiKey cannot be empty\");\n }\n\n if (BEARER_PREFIX_REGEX.test(normalized)) {\n return normalized;\n }\n\n return `Bearer ${normalized}`;\n}\n\nfunction firstNonEmptyString(value: unknown): string | undefined {\n return typeof value === \"string\" && value.trim().length > 0\n ? value.trim()\n : undefined;\n}\n\nfunction parseJwtSegment(segment: string): string | undefined {\n const base64 = segment\n .replace(/-/g, \"+\")\n .replace(/_/g, \"/\")\n .padEnd(segment.length + ((4 - (segment.length % 4)) % 4), \"=\");\n\n try {\n if (typeof atob === \"function\") {\n return atob(base64);\n }\n\n if (typeof Buffer !== \"undefined\") {\n return Buffer.from(base64, \"base64\").toString(\"utf8\");\n }\n } catch {\n return undefined;\n }\n\n return undefined;\n}\n\nfunction parseJwtClaims(apiKey: string): Record<string, unknown> | undefined {\n const token = apiKey.replace(BEARER_PREFIX_REGEX, \"\").trim();\n const parts = token.split(\".\");\n\n if (parts.length !== 3) {\n return undefined;\n }\n\n const [, payloadSegment] = parts;\n\n if (payloadSegment === undefined) {\n return undefined;\n }\n\n const payload = parseJwtSegment(payloadSegment);\n\n if (payload === undefined) {\n return undefined;\n }\n\n try {\n const decoded = JSON.parse(payload) as unknown;\n return decoded !== null && typeof decoded === \"object\"\n ? (decoded as Record<string, unknown>)\n : undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction parseClaimStrings(\n source: Record<string, unknown>,\n keys: string[]\n): string | undefined {\n for (const key of keys) {\n const value = firstNonEmptyString(source[key]);\n if (value) {\n return value;\n }\n }\n\n return undefined;\n}\n\nfunction parseActorIdentityFromSubject(\n subject: string\n): { id: string; type: \"agent\" | \"user\" } | undefined {\n if (subject.startsWith(SERVICE_TOKEN_SUB_AGENT_PREFIX)) {\n return { id: subject, type: \"agent\" };\n }\n\n if (subject.startsWith(SERVICE_TOKEN_SUB_USER_PREFIX)) {\n return { id: subject, type: \"user\" };\n }\n\n return undefined;\n}\n\nfunction parseTenantIdFromSubject(subject: string): string {\n const actorIdentity = parseActorIdentityFromSubject(subject);\n if (actorIdentity !== undefined) {\n return \"\";\n }\n\n if (subject.startsWith(SERVICE_TOKEN_SUB_ORG_PREFIX)) {\n return subject.slice(SERVICE_TOKEN_SUB_ORG_PREFIX.length).trim();\n }\n\n return subject;\n}\n\nfunction parseCreatorPrincipalFromClaims(\n claims: Record<string, unknown>\n): SessionCreatorPrincipal | undefined {\n const subject = firstNonEmptyString(claims.sub);\n const explicitPrincipal =\n claims.principal && typeof claims.principal === \"object\"\n ? (claims.principal as Record<string, unknown>)\n : undefined;\n const mergedClaims = explicitPrincipal\n ? { ...claims, ...explicitPrincipal }\n : claims;\n const actorFromSubject = subject\n ? parseActorIdentityFromSubject(subject)\n : undefined;\n const principalTypeFromClaims = parseClaimStrings(mergedClaims, [\n \"principal_type\",\n \"principalType\",\n \"type\",\n ]);\n const tenantId = parseClaimStrings(mergedClaims, [\"tenant_id\", \"tenantId\"]);\n const rawPrincipalId = parseClaimStrings(mergedClaims, [\n \"principal_id\",\n \"principalId\",\n \"id\",\n \"sub\",\n ]);\n const actorFromRawId = rawPrincipalId\n ? parseActorIdentityFromSubject(rawPrincipalId)\n : undefined;\n\n const principal = {\n tenant_id: tenantId ?? (subject ? parseTenantIdFromSubject(subject) : \"\"),\n id: rawPrincipalId ?? actorFromSubject?.id ?? \"\",\n type:\n principalTypeFromClaims === \"agent\" || principalTypeFromClaims === \"user\"\n ? principalTypeFromClaims\n : (actorFromSubject?.type ?? actorFromRawId?.type ?? \"user\"),\n };\n\n if (\n principal.tenant_id.length === 0 ||\n principal.id.length === 0 ||\n principal.type.length === 0\n ) {\n return undefined;\n }\n\n const result = SessionCreatorPrincipalSchema.safeParse(principal);\n\n return result.success ? result.data : undefined;\n}\n\nfunction parseCreatorPrincipalFromClaimsSafe(\n apiKey: string\n): SessionCreatorPrincipal | undefined {\n const claims = parseJwtClaims(apiKey);\n return claims ? parseCreatorPrincipalFromClaims(claims) : undefined;\n}\n\nfunction parseEventFrame(data: unknown): TailEvent {\n const result = TailFrameSchema.safeParse(data);\n\n if (!result.success) {\n const reason =\n result.error.issues[0]?.message ?? \"Tail frame did not match schema\";\n throw new StarciteConnectionError(reason);\n }\n\n return result.data;\n}\n\nfunction getEventData(event: unknown): unknown {\n if (event && typeof event === \"object\" && \"data\" in event) {\n return (event as { data?: unknown }).data;\n }\n\n return undefined;\n}\n\nfunction getCloseCode(event: unknown): number | undefined {\n if (event && typeof event === \"object\" && \"code\" in event) {\n const code = (event as { code?: unknown }).code;\n return typeof code === \"number\" ? code : undefined;\n }\n\n return undefined;\n}\n\nfunction getCloseReason(event: unknown): string | undefined {\n if (event && typeof event === \"object\" && \"reason\" in event) {\n const reason = (event as { reason?: unknown }).reason;\n return typeof reason === \"string\" && reason.length > 0 ? reason : undefined;\n }\n\n return undefined;\n}\n\nfunction describeClose(\n code: number | undefined,\n reason: string | undefined\n): string {\n const codeText = `code ${typeof code === \"number\" ? code : \"unknown\"}`;\n return reason ? `${codeText}, reason '${reason}'` : codeText;\n}\n\nasync function waitForDelay(ms: number, signal?: AbortSignal): Promise<void> {\n if (ms <= 0) {\n return;\n }\n\n await new Promise<void>((resolve) => {\n let settled = false;\n const timeout = setTimeout(() => {\n if (settled) {\n return;\n }\n\n settled = true;\n if (signal) {\n signal.removeEventListener(\"abort\", onAbort);\n }\n resolve();\n }, ms);\n\n const onAbort = (): void => {\n if (settled) {\n return;\n }\n\n settled = true;\n clearTimeout(timeout);\n signal?.removeEventListener(\"abort\", onAbort);\n resolve();\n };\n\n if (signal) {\n if (signal.aborted) {\n onAbort();\n return;\n }\n\n signal.addEventListener(\"abort\", onAbort, { once: true });\n }\n });\n}\n\nfunction agentFromActor(actor: string): string | undefined {\n if (actor.startsWith(\"agent:\")) {\n return actor.slice(\"agent:\".length);\n }\n\n return undefined;\n}\n\nfunction toSessionEvent(event: TailEvent): SessionEvent {\n const agent = agentFromActor(event.actor);\n const text =\n typeof event.payload.text === \"string\" ? event.payload.text : undefined;\n\n return {\n ...event,\n agent,\n text,\n };\n}\n\n/**\n * Session-scoped helper for append and tail operations.\n */\nexport class StarciteSession {\n /** Session identifier. */\n readonly id: string;\n /** Optional session record captured at creation time. */\n readonly record?: SessionRecord;\n\n private readonly client: StarciteClient;\n\n constructor(client: StarciteClient, id: string, record?: SessionRecord) {\n this.client = client;\n this.id = id;\n this.record = record;\n }\n\n /**\n * Appends a high-level agent event to this session.\n *\n * Automatically prefixes `agent` as `agent:<name>` when needed.\n */\n append(input: SessionAppendInput): Promise<AppendEventResponse> {\n const parsed = SessionAppendInputSchema.parse(input);\n const actor = parsed.agent.startsWith(\"agent:\")\n ? parsed.agent\n : `agent:${parsed.agent}`;\n\n return this.client.appendEvent(this.id, {\n type: parsed.type ?? \"content\",\n payload: parsed.payload ?? { text: parsed.text },\n actor,\n producer_id: parsed.producerId,\n producer_seq: parsed.producerSeq,\n source: parsed.source ?? \"agent\",\n metadata: parsed.metadata,\n refs: parsed.refs,\n idempotency_key: parsed.idempotencyKey,\n expected_seq: parsed.expectedSeq,\n });\n }\n\n /**\n * Appends a raw event payload as-is.\n */\n appendRaw(input: AppendEventRequest): Promise<AppendEventResponse> {\n return this.client.appendEvent(this.id, input);\n }\n\n /**\n * Streams transformed session events with SDK convenience fields (`agent`, `text`).\n */\n tail(options: SessionTailOptions = {}): AsyncIterable<SessionEvent> {\n return this.client.tailEvents(this.id, options);\n }\n\n /**\n * Streams raw tail events returned by the API.\n */\n tailRaw(options: SessionTailOptions = {}): AsyncIterable<TailEvent> {\n return this.client.tailRawEvents(this.id, options);\n }\n}\n\n/**\n * Starcite API client for HTTP and WebSocket session operations.\n */\nexport class StarciteClient {\n /** Normalized API base URL ending with `/v1`. */\n readonly baseUrl: string;\n\n private readonly inferredCreatorPrincipal?: SessionCreatorPrincipal;\n private readonly websocketBaseUrl: string;\n private readonly fetchFn: typeof fetch;\n private readonly headers: Headers;\n private readonly websocketFactory: (\n url: string,\n options?: StarciteWebSocketConnectOptions\n ) => StarciteWebSocket;\n\n /**\n * Creates a new client instance.\n */\n constructor(options: StarciteClientOptions = {}) {\n this.baseUrl = normalizeBaseUrl(options.baseUrl ?? DEFAULT_BASE_URL);\n this.websocketBaseUrl = toWebSocketBaseUrl(this.baseUrl);\n this.fetchFn = options.fetch ?? defaultFetch;\n this.headers = new Headers(options.headers);\n\n if (options.apiKey !== undefined) {\n const authorization = formatAuthorizationHeader(options.apiKey);\n this.headers.set(\"authorization\", authorization);\n this.inferredCreatorPrincipal =\n parseCreatorPrincipalFromClaimsSafe(authorization);\n }\n\n this.websocketFactory = options.websocketFactory ?? defaultWebSocketFactory;\n }\n\n /**\n * Returns a session helper bound to an existing session id.\n */\n session(sessionId: string, record?: SessionRecord): StarciteSession {\n return new StarciteSession(this, sessionId, record);\n }\n\n /**\n * Creates a new session and returns a bound `StarciteSession` helper.\n */\n async create(input: CreateSessionInput = {}): Promise<StarciteSession> {\n const record = await this.createSession(input);\n return this.session(record.id, record);\n }\n\n /**\n * Creates a new session and returns the raw session record.\n */\n createSession(input: CreateSessionInput = {}): Promise<SessionRecord> {\n const payload = CreateSessionInputSchema.parse({\n ...input,\n creator_principal:\n input.creator_principal ?? this.inferredCreatorPrincipal,\n });\n\n return this.request(\n \"/sessions\",\n {\n method: \"POST\",\n body: JSON.stringify(payload),\n },\n SessionRecordSchema\n );\n }\n\n /**\n * Lists sessions from the archive-backed catalog.\n */\n listSessions(options: SessionListOptions = {}): Promise<SessionListPage> {\n const query = new URLSearchParams();\n\n if (options.limit !== undefined) {\n if (!Number.isInteger(options.limit) || options.limit <= 0) {\n throw new StarciteError(\n \"listSessions() limit must be a positive integer\"\n );\n }\n\n query.set(\"limit\", `${options.limit}`);\n }\n\n if (options.cursor !== undefined) {\n if (options.cursor.trim().length === 0) {\n throw new StarciteError(\"listSessions() cursor cannot be empty\");\n }\n\n query.set(\"cursor\", options.cursor);\n }\n\n if (options.metadata !== undefined) {\n for (const [key, value] of Object.entries(options.metadata)) {\n if (key.trim().length === 0 || value.trim().length === 0) {\n throw new StarciteError(\n \"listSessions() metadata filters must be non-empty strings\"\n );\n }\n\n query.set(`metadata.${key}`, value);\n }\n }\n\n const suffix = query.size > 0 ? `?${query.toString()}` : \"\";\n\n return this.request(\n `/sessions${suffix}`,\n {\n method: \"GET\",\n },\n SessionListPageSchema\n );\n }\n\n /**\n * Appends a raw event payload to a specific session.\n */\n appendEvent(\n sessionId: string,\n input: AppendEventRequest\n ): Promise<AppendEventResponse> {\n const payload = AppendEventRequestSchema.parse(input);\n\n return this.request(\n `/sessions/${encodeURIComponent(sessionId)}/append`,\n {\n method: \"POST\",\n body: JSON.stringify(payload),\n },\n AppendEventResponseSchema\n );\n }\n\n /**\n * Opens a WebSocket tail stream and yields raw events.\n */\n // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: single-loop reconnect state machine is intentionally explicit for stream correctness.\n async *tailRawEvents(\n sessionId: string,\n options: SessionTailOptions = {}\n ): AsyncGenerator<TailEvent> {\n const initialCursor = options.cursor ?? 0;\n const reconnectEnabled = options.reconnect ?? true;\n const reconnectDelayMs =\n options.reconnectDelayMs ?? DEFAULT_TAIL_RECONNECT_DELAY_MS;\n\n if (!Number.isInteger(initialCursor) || initialCursor < 0) {\n throw new StarciteError(\"tail() cursor must be a non-negative integer\");\n }\n\n if (!Number.isFinite(reconnectDelayMs) || reconnectDelayMs < 0) {\n throw new StarciteError(\n \"tail() reconnectDelayMs must be a non-negative number\"\n );\n }\n\n let cursor = initialCursor;\n\n while (true) {\n if (options.signal?.aborted) {\n return;\n }\n\n const wsUrl = `${this.websocketBaseUrl}/sessions/${encodeURIComponent(\n sessionId\n )}/tail?cursor=${cursor}`;\n\n const websocketHeaders = new Headers();\n const authorization = this.headers.get(\"authorization\");\n\n if (authorization) {\n websocketHeaders.set(\"authorization\", authorization);\n }\n\n let socket: StarciteWebSocket;\n\n try {\n socket = this.websocketFactory(\n wsUrl,\n hasAnyHeaders(websocketHeaders)\n ? {\n headers: websocketHeaders,\n }\n : undefined\n );\n } catch (error) {\n const rootCause = toError(error).message;\n\n if (!reconnectEnabled || options.signal?.aborted) {\n throw new StarciteConnectionError(\n `Tail connection failed for session '${sessionId}': ${rootCause}`\n );\n }\n\n await waitForDelay(reconnectDelayMs, options.signal);\n continue;\n }\n\n const queue = new AsyncQueue<TailEvent>();\n let sawTransportError = false;\n let closeCode: number | undefined;\n let closeReason: string | undefined;\n let abortRequested = false;\n\n const onMessage = (event: unknown): void => {\n try {\n const parsed = parseEventFrame(getEventData(event));\n cursor = Math.max(cursor, parsed.seq);\n\n if (options.agent && agentFromActor(parsed.actor) !== options.agent) {\n return;\n }\n\n queue.push(parsed);\n } catch (error) {\n queue.fail(error);\n }\n };\n\n const onError = (): void => {\n sawTransportError = true;\n queue.close();\n };\n\n const onClose = (event: unknown): void => {\n closeCode = getCloseCode(event);\n closeReason = getCloseReason(event);\n queue.close();\n };\n\n const onAbort = (): void => {\n abortRequested = true;\n queue.close();\n socket.close(NORMAL_WEBSOCKET_CLOSE_CODE, \"aborted\");\n };\n\n socket.addEventListener(\"message\", onMessage);\n socket.addEventListener(\"error\", onError);\n socket.addEventListener(\"close\", onClose);\n\n if (options.signal) {\n if (options.signal.aborted) {\n onAbort();\n } else {\n options.signal.addEventListener(\"abort\", onAbort, { once: true });\n }\n }\n\n let iterationError: Error | null = null;\n\n try {\n while (true) {\n const next = await queue.next();\n\n if (next.done) {\n break;\n }\n\n yield next.value;\n }\n } catch (error) {\n iterationError = toError(error);\n } finally {\n socket.removeEventListener(\"message\", onMessage);\n socket.removeEventListener(\"error\", onError);\n socket.removeEventListener(\"close\", onClose);\n\n if (options.signal) {\n options.signal.removeEventListener(\"abort\", onAbort);\n }\n\n socket.close(NORMAL_WEBSOCKET_CLOSE_CODE, \"finished\");\n }\n\n if (iterationError) {\n throw iterationError;\n }\n\n if (abortRequested || options.signal?.aborted) {\n return;\n }\n\n const gracefullyClosed =\n !sawTransportError && closeCode === NORMAL_WEBSOCKET_CLOSE_CODE;\n\n if (gracefullyClosed) {\n return;\n }\n\n if (!reconnectEnabled) {\n throw new StarciteConnectionError(\n `Tail connection dropped for session '${sessionId}' (${describeClose(\n closeCode,\n closeReason\n )})`\n );\n }\n\n await waitForDelay(reconnectDelayMs, options.signal);\n }\n }\n\n /**\n * Opens a WebSocket tail stream and yields transformed session events.\n */\n async *tailEvents(\n sessionId: string,\n options: SessionTailOptions = {}\n ): AsyncGenerator<SessionEvent> {\n for await (const rawEvent of this.tailRawEvents(sessionId, options)) {\n yield toSessionEvent(rawEvent);\n }\n }\n\n private async request<T>(\n path: string,\n init: RequestInit,\n schema?: z.ZodType<T>\n ): Promise<T> {\n const headers = new Headers(this.headers);\n\n if (!headers.has(\"content-type\")) {\n headers.set(\"content-type\", \"application/json\");\n }\n\n if (init.headers) {\n const perRequestHeaders = new Headers(init.headers);\n for (const [key, value] of perRequestHeaders.entries()) {\n headers.set(key, value);\n }\n }\n\n let response: Response;\n\n try {\n response = await this.fetchFn(`${this.baseUrl}${path}`, {\n ...init,\n headers,\n });\n } catch (error) {\n const rootCause = toError(error).message;\n throw new StarciteConnectionError(\n `Failed to connect to Starcite at ${this.baseUrl}: ${rootCause}`\n );\n }\n\n if (!response.ok) {\n const payload = await tryParseJson(response);\n const code =\n typeof payload?.error === \"string\"\n ? payload.error\n : `http_${response.status}`;\n const message =\n typeof payload?.message === \"string\"\n ? payload.message\n : response.statusText;\n\n throw new StarciteApiError(message, response.status, code, payload);\n }\n\n if (response.status === 204) {\n return undefined as T;\n }\n\n const responseBody = (await response.json()) as unknown;\n\n if (!schema) {\n return responseBody as T;\n }\n\n const parsed = schema.safeParse(responseBody);\n if (!parsed.success) {\n const issue = parsed.error.issues[0]?.message ?? \"invalid response\";\n throw new StarciteConnectionError(\n `Received unexpected response payload from Starcite: ${issue}`\n );\n }\n\n return parsed.data;\n }\n}\n\nasync function tryParseJson(\n response: Response\n): Promise<StarciteErrorPayload | null> {\n try {\n const parsed = (await response.json()) as unknown;\n const result = StarciteErrorPayloadSchema.safeParse(parsed);\n return result.success ? result.data : null;\n } catch {\n return null;\n }\n}\n","import type { StarciteErrorPayload } from \"./types\";\n\n/**\n * Base error type for SDK-level failures.\n */\nexport class StarciteError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"StarciteError\";\n }\n}\n\n/**\n * Thrown when the Starcite API responds with a non-2xx status code.\n */\nexport class StarciteApiError extends StarciteError {\n /** HTTP status code returned by the API. */\n readonly status: number;\n /** Stable API error code (or synthesized `http_<status>` fallback). */\n readonly code: string;\n /** Parsed API error payload when available. */\n readonly payload: StarciteErrorPayload | null;\n\n constructor(\n message: string,\n status: number,\n code: string,\n payload: StarciteErrorPayload | null\n ) {\n super(message);\n this.name = \"StarciteApiError\";\n this.status = status;\n this.code = code;\n this.payload = payload;\n }\n}\n\n/**\n * Thrown when the SDK cannot reach Starcite or receives invalid transport payloads.\n */\nexport class StarciteConnectionError extends StarciteError {\n constructor(message: string) {\n super(message);\n this.name = \"StarciteConnectionError\";\n }\n}\n","import { z } from \"zod\";\n\nconst ArbitraryObjectSchema = z.record(z.unknown());\n\nconst CreatorTypeSchema = z.union([z.literal(\"user\"), z.literal(\"agent\")]);\n\nexport const SessionCreatorPrincipalSchema = z.object({\n tenant_id: z.string().min(1),\n id: z.string().min(1),\n type: CreatorTypeSchema,\n});\n\nexport type SessionCreatorPrincipal = z.infer<\n typeof SessionCreatorPrincipalSchema\n>;\n\n/**\n * Request payload for creating a session.\n */\nexport const CreateSessionInputSchema = z.object({\n id: z.string().optional(),\n title: z.string().optional(),\n metadata: ArbitraryObjectSchema.optional(),\n creator_principal: SessionCreatorPrincipalSchema.optional(),\n});\n\n/**\n * Inferred TypeScript type for {@link CreateSessionInputSchema}.\n */\nexport type CreateSessionInput = z.infer<typeof CreateSessionInputSchema>;\n\n/**\n * Session record returned by the Starcite API.\n */\nexport const SessionRecordSchema = z.object({\n id: z.string(),\n title: z.string().nullable().optional(),\n metadata: ArbitraryObjectSchema,\n last_seq: z.number().int().nonnegative(),\n created_at: z.string(),\n updated_at: z.string(),\n});\n\n/**\n * Inferred TypeScript type for {@link SessionRecordSchema}.\n */\nexport type SessionRecord = z.infer<typeof SessionRecordSchema>;\n\n/**\n * Session item returned by the list endpoint.\n */\nexport const SessionListItemSchema = z.object({\n id: z.string(),\n title: z.string().nullable().optional(),\n metadata: ArbitraryObjectSchema,\n created_at: z.string(),\n});\n\n/**\n * Inferred TypeScript type for {@link SessionListItemSchema}.\n */\nexport type SessionListItem = z.infer<typeof SessionListItemSchema>;\n\n/**\n * Paginated session list response.\n */\nexport const SessionListPageSchema = z.object({\n sessions: z.array(SessionListItemSchema),\n next_cursor: z.string().nullable(),\n});\n\n/**\n * Inferred TypeScript type for {@link SessionListPageSchema}.\n */\nexport type SessionListPage = z.infer<typeof SessionListPageSchema>;\n\n/**\n * Low-level request payload for appending an event to a session.\n */\nexport const AppendEventRequestSchema = z.object({\n type: z.string().min(1),\n payload: ArbitraryObjectSchema,\n actor: z.string().min(1),\n producer_id: z.string().min(1),\n producer_seq: z.number().int().positive(),\n source: z.string().optional(),\n metadata: ArbitraryObjectSchema.optional(),\n refs: ArbitraryObjectSchema.optional(),\n idempotency_key: z.string().optional(),\n expected_seq: z.number().int().nonnegative().optional(),\n});\n\n/**\n * Inferred TypeScript type for {@link AppendEventRequestSchema}.\n */\nexport type AppendEventRequest = z.infer<typeof AppendEventRequestSchema>;\n\n/**\n * API response returned after appending an event.\n */\nexport const AppendEventResponseSchema = z.object({\n seq: z.number().int().nonnegative(),\n last_seq: z.number().int().nonnegative(),\n deduped: z.boolean(),\n});\n\n/**\n * Inferred TypeScript type for {@link AppendEventResponseSchema}.\n */\nexport type AppendEventResponse = z.infer<typeof AppendEventResponseSchema>;\n\n/**\n * Raw event frame shape emitted by the Starcite tail stream.\n */\nexport const TailEventSchema = z.object({\n seq: z.number().int().nonnegative(),\n type: z.string().min(1),\n payload: ArbitraryObjectSchema,\n actor: z.string().min(1),\n producer_id: z.string().min(1),\n producer_seq: z.number().int().positive(),\n source: z.string().optional(),\n metadata: ArbitraryObjectSchema.optional(),\n refs: ArbitraryObjectSchema.optional(),\n idempotency_key: z.string().nullable().optional(),\n inserted_at: z.string().optional(),\n});\n\n/**\n * Inferred TypeScript type for {@link TailEventSchema}.\n */\nexport type TailEvent = z.infer<typeof TailEventSchema>;\n\n/**\n * Convenience tail event shape with SDK-derived fields (`agent`, `text`).\n */\nconst SessionEventInternalSchema = TailEventSchema.extend({\n agent: z.string().optional(),\n text: z.string().optional(),\n});\n\n/**\n * Inferred TypeScript type for the SDK-level enriched tail event.\n */\nexport type SessionEvent = z.infer<typeof SessionEventInternalSchema>;\n\n/**\n * High-level `session.append()` input.\n *\n * You must provide producer identity (`producerId`, `producerSeq`) and either\n * `text` or `payload`.\n */\nexport const SessionAppendInputSchema = z\n .object({\n agent: z.string().trim().min(1),\n producerId: z.string().trim().min(1),\n producerSeq: z.number().int().positive(),\n text: z.string().optional(),\n payload: ArbitraryObjectSchema.optional(),\n type: z.string().optional(),\n source: z.string().optional(),\n metadata: ArbitraryObjectSchema.optional(),\n refs: ArbitraryObjectSchema.optional(),\n idempotencyKey: z.string().optional(),\n expectedSeq: z.number().int().nonnegative().optional(),\n })\n .refine((value) => !!(value.text || value.payload), {\n message: \"append() requires either 'text' or an object 'payload'\",\n });\n\n/**\n * Inferred TypeScript type for {@link SessionAppendInputSchema}.\n */\nexport type SessionAppendInput = z.infer<typeof SessionAppendInputSchema>;\n\n/**\n * Options for streaming events from a session.\n */\nexport interface SessionTailOptions {\n /**\n * Starting cursor (inclusive) in the event stream.\n */\n cursor?: number;\n /**\n * Optional filter for `agent:<name>` events.\n */\n agent?: string;\n /**\n * Automatically reconnect on transport failures and continue from the last observed sequence.\n *\n * Defaults to `true`.\n */\n reconnect?: boolean;\n /**\n * Delay between reconnect attempts in milliseconds.\n *\n * Defaults to `3000`.\n */\n reconnectDelayMs?: number;\n /**\n * Optional abort signal to close the stream.\n */\n signal?: AbortSignal;\n}\n\n/**\n * Options for listing sessions.\n */\nexport interface SessionListOptions {\n /**\n * Maximum rows to return. Must be a positive integer.\n */\n limit?: number;\n /**\n * Optional cursor from the previous response.\n */\n cursor?: string;\n /**\n * Optional flat metadata exact-match filters.\n */\n metadata?: Record<string, string>;\n}\n\n/**\n * Minimal WebSocket contract required by the SDK.\n */\nexport interface StarciteWebSocket {\n addEventListener(type: string, listener: (event: unknown) => void): void;\n removeEventListener(type: string, listener: (event: unknown) => void): void;\n close(code?: number, reason?: string): void;\n}\n\n/**\n * Factory used to create the WebSocket connection for `tail`.\n */\nexport interface StarciteWebSocketConnectOptions {\n /**\n * Headers to include with the WebSocket handshake request.\n */\n headers?: HeadersInit;\n}\n\n/**\n * Factory used to create the WebSocket connection for `tail`.\n */\nexport type StarciteWebSocketFactory = (\n url: string,\n options?: StarciteWebSocketConnectOptions\n) => StarciteWebSocket;\n\n/**\n * Client construction options.\n */\nexport interface StarciteClientOptions {\n /**\n * Base API URL. Defaults to `process.env.STARCITE_BASE_URL` or `http://localhost:4000`.\n */\n baseUrl?: string;\n /**\n * Custom fetch implementation for non-standard runtimes.\n */\n fetch?: typeof fetch;\n /**\n * Headers applied to every HTTP request.\n */\n headers?: HeadersInit;\n /**\n * Service key / JWT token. When set, the SDK automatically sends\n * `Authorization: Bearer <token>` for HTTP requests and WebSocket upgrades.\n */\n apiKey?: string;\n /**\n * Custom WebSocket factory for non-browser runtimes.\n */\n websocketFactory?: StarciteWebSocketFactory;\n}\n\n/**\n * Error payload shape returned by non-2xx API responses.\n */\nexport const StarciteErrorPayloadSchema = z\n .object({\n error: z.string().optional(),\n message: z.string().optional(),\n })\n .catchall(z.unknown());\n\n/**\n * Inferred TypeScript type for {@link StarciteErrorPayloadSchema}.\n */\nexport type StarciteErrorPayload = z.infer<typeof StarciteErrorPayloadSchema>;\n","import { StarciteClient } from \"./client\";\nimport type { StarciteClientOptions } from \"./types\";\n\n// biome-ignore lint/performance/noBarrelFile: package entrypoint intentionally re-exports public API.\nexport { normalizeBaseUrl, StarciteClient, StarciteSession } from \"./client\";\nexport {\n StarciteApiError,\n StarciteConnectionError,\n StarciteError,\n} from \"./errors\";\nexport type {\n AppendEventRequest,\n AppendEventResponse,\n CreateSessionInput,\n SessionAppendInput,\n SessionEvent,\n SessionListItem,\n SessionListOptions,\n SessionListPage,\n SessionRecord,\n SessionTailOptions,\n StarciteClientOptions,\n StarciteErrorPayload,\n StarciteWebSocket,\n StarciteWebSocketConnectOptions,\n StarciteWebSocketFactory,\n TailEvent,\n} from \"./types\";\n/**\n * Creates a new {@link StarciteClient} instance.\n */\nexport function createStarciteClient(\n options: StarciteClientOptions = {}\n): StarciteClient {\n return new StarciteClient(options);\n}\n\n/**\n * Default singleton client using environment/default configuration.\n */\nexport const starcite = createStarciteClient();\n"],"mappings":"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","names":["z","z"]}