@starcite/sdk 0.0.2 → 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.cjs CHANGED
@@ -155,6 +155,7 @@ var DEFAULT_BASE_URL = typeof process !== "undefined" && process.env.STARCITE_BA
155
155
  var TRAILING_SLASHES_REGEX = /\/+$/;
156
156
  var BEARER_PREFIX_REGEX = /^bearer\s+/i;
157
157
  var DEFAULT_TAIL_RECONNECT_DELAY_MS = 3e3;
158
+ var CATCH_UP_IDLE_MS = 1e3;
158
159
  var NORMAL_WEBSOCKET_CLOSE_CODE = 1e3;
159
160
  var SERVICE_TOKEN_SUB_ORG_PREFIX = "org:";
160
161
  var SERVICE_TOKEN_SUB_AGENT_PREFIX = "agent:";
@@ -621,7 +622,8 @@ var StarciteClient = class {
621
622
  // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: single-loop reconnect state machine is intentionally explicit for stream correctness.
622
623
  async *tailRawEvents(sessionId, options = {}) {
623
624
  const initialCursor = options.cursor ?? 0;
624
- const reconnectEnabled = options.reconnect ?? true;
625
+ const follow = options.follow ?? true;
626
+ const reconnectEnabled = follow ? options.reconnect ?? true : false;
625
627
  const reconnectDelayMs = options.reconnectDelayMs ?? DEFAULT_TAIL_RECONNECT_DELAY_MS;
626
628
  if (!Number.isInteger(initialCursor) || initialCursor < 0) {
627
629
  throw new StarciteError("tail() cursor must be a non-negative integer");
@@ -667,32 +669,58 @@ var StarciteClient = class {
667
669
  let closeCode;
668
670
  let closeReason;
669
671
  let abortRequested = false;
672
+ let catchUpTimer = null;
673
+ const resetCatchUpTimer = () => {
674
+ if (!follow) {
675
+ if (catchUpTimer) {
676
+ clearTimeout(catchUpTimer);
677
+ }
678
+ catchUpTimer = setTimeout(() => {
679
+ queue.close();
680
+ }, CATCH_UP_IDLE_MS);
681
+ }
682
+ };
670
683
  const onMessage = (event) => {
671
684
  try {
672
685
  const parsed = parseEventFrame(getEventData(event));
673
686
  cursor = Math.max(cursor, parsed.seq);
674
687
  if (options.agent && agentFromActor(parsed.actor) !== options.agent) {
688
+ resetCatchUpTimer();
675
689
  return;
676
690
  }
677
691
  queue.push(parsed);
692
+ resetCatchUpTimer();
678
693
  } catch (error) {
679
694
  queue.fail(error);
680
695
  }
681
696
  };
682
697
  const onError = () => {
683
698
  sawTransportError = true;
699
+ if (catchUpTimer) {
700
+ clearTimeout(catchUpTimer);
701
+ }
684
702
  queue.close();
685
703
  };
686
704
  const onClose = (event) => {
687
705
  closeCode = getCloseCode(event);
688
706
  closeReason = getCloseReason(event);
707
+ if (catchUpTimer) {
708
+ clearTimeout(catchUpTimer);
709
+ }
689
710
  queue.close();
690
711
  };
691
712
  const onAbort = () => {
692
713
  abortRequested = true;
714
+ if (catchUpTimer) {
715
+ clearTimeout(catchUpTimer);
716
+ }
693
717
  queue.close();
694
718
  socket.close(NORMAL_WEBSOCKET_CLOSE_CODE, "aborted");
695
719
  };
720
+ const onOpen = () => {
721
+ resetCatchUpTimer();
722
+ };
723
+ socket.addEventListener("open", onOpen);
696
724
  socket.addEventListener("message", onMessage);
697
725
  socket.addEventListener("error", onError);
698
726
  socket.addEventListener("close", onClose);
@@ -715,6 +743,10 @@ var StarciteClient = class {
715
743
  } catch (error) {
716
744
  iterationError = toError(error);
717
745
  } finally {
746
+ if (catchUpTimer) {
747
+ clearTimeout(catchUpTimer);
748
+ }
749
+ socket.removeEventListener("open", onOpen);
718
750
  socket.removeEventListener("message", onMessage);
719
751
  socket.removeEventListener("error", onError);
720
752
  socket.removeEventListener("close", onClose);
@@ -726,7 +758,7 @@ var StarciteClient = class {
726
758
  if (iterationError) {
727
759
  throw iterationError;
728
760
  }
729
- if (abortRequested || options.signal?.aborted) {
761
+ if (abortRequested || options.signal?.aborted || !follow) {
730
762
  return;
731
763
  }
732
764
  const gracefullyClosed = !sawTransportError && closeCode === NORMAL_WEBSOCKET_CLOSE_CODE;
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/client.ts","../src/errors.ts","../src/types.ts"],"sourcesContent":["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","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"],"mappings":"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","names":["import_zod"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/client.ts","../src/errors.ts","../src/types.ts"],"sourcesContent":["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","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 CATCH_UP_IDLE_MS = 1000;\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 follow = options.follow ?? true;\n const reconnectEnabled = follow ? (options.reconnect ?? true) : false;\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 let catchUpTimer: ReturnType<typeof setTimeout> | null = null;\n\n const resetCatchUpTimer = (): void => {\n if (!follow) {\n if (catchUpTimer) {\n clearTimeout(catchUpTimer);\n }\n catchUpTimer = setTimeout(() => {\n queue.close();\n }, CATCH_UP_IDLE_MS);\n }\n };\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 resetCatchUpTimer();\n return;\n }\n\n queue.push(parsed);\n resetCatchUpTimer();\n } catch (error) {\n queue.fail(error);\n }\n };\n\n const onError = (): void => {\n sawTransportError = true;\n if (catchUpTimer) {\n clearTimeout(catchUpTimer);\n }\n queue.close();\n };\n\n const onClose = (event: unknown): void => {\n closeCode = getCloseCode(event);\n closeReason = getCloseReason(event);\n if (catchUpTimer) {\n clearTimeout(catchUpTimer);\n }\n queue.close();\n };\n\n const onAbort = (): void => {\n abortRequested = true;\n if (catchUpTimer) {\n clearTimeout(catchUpTimer);\n }\n queue.close();\n socket.close(NORMAL_WEBSOCKET_CLOSE_CODE, \"aborted\");\n };\n\n const onOpen = (): void => {\n resetCatchUpTimer();\n };\n\n socket.addEventListener(\"open\", onOpen);\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 if (catchUpTimer) {\n clearTimeout(catchUpTimer);\n }\n socket.removeEventListener(\"open\", onOpen);\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 || !follow) {\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 * When `false`, exit after replaying stored events instead of streaming live.\n *\n * Defaults to `true`.\n */\n follow?: boolean;\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"],"mappings":"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","names":["import_zod"]}
package/dist/index.d.cts CHANGED
@@ -388,6 +388,12 @@ interface SessionTailOptions {
388
388
  * Defaults to `3000`.
389
389
  */
390
390
  reconnectDelayMs?: number;
391
+ /**
392
+ * When `false`, exit after replaying stored events instead of streaming live.
393
+ *
394
+ * Defaults to `true`.
395
+ */
396
+ follow?: boolean;
391
397
  /**
392
398
  * Optional abort signal to close the stream.
393
399
  */
package/dist/index.d.ts CHANGED
@@ -388,6 +388,12 @@ interface SessionTailOptions {
388
388
  * Defaults to `3000`.
389
389
  */
390
390
  reconnectDelayMs?: number;
391
+ /**
392
+ * When `false`, exit after replaying stored events instead of streaming live.
393
+ *
394
+ * Defaults to `true`.
395
+ */
396
+ follow?: boolean;
391
397
  /**
392
398
  * Optional abort signal to close the stream.
393
399
  */
package/dist/index.js CHANGED
@@ -122,6 +122,7 @@ var DEFAULT_BASE_URL = typeof process !== "undefined" && process.env.STARCITE_BA
122
122
  var TRAILING_SLASHES_REGEX = /\/+$/;
123
123
  var BEARER_PREFIX_REGEX = /^bearer\s+/i;
124
124
  var DEFAULT_TAIL_RECONNECT_DELAY_MS = 3e3;
125
+ var CATCH_UP_IDLE_MS = 1e3;
125
126
  var NORMAL_WEBSOCKET_CLOSE_CODE = 1e3;
126
127
  var SERVICE_TOKEN_SUB_ORG_PREFIX = "org:";
127
128
  var SERVICE_TOKEN_SUB_AGENT_PREFIX = "agent:";
@@ -588,7 +589,8 @@ var StarciteClient = class {
588
589
  // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: single-loop reconnect state machine is intentionally explicit for stream correctness.
589
590
  async *tailRawEvents(sessionId, options = {}) {
590
591
  const initialCursor = options.cursor ?? 0;
591
- const reconnectEnabled = options.reconnect ?? true;
592
+ const follow = options.follow ?? true;
593
+ const reconnectEnabled = follow ? options.reconnect ?? true : false;
592
594
  const reconnectDelayMs = options.reconnectDelayMs ?? DEFAULT_TAIL_RECONNECT_DELAY_MS;
593
595
  if (!Number.isInteger(initialCursor) || initialCursor < 0) {
594
596
  throw new StarciteError("tail() cursor must be a non-negative integer");
@@ -634,32 +636,58 @@ var StarciteClient = class {
634
636
  let closeCode;
635
637
  let closeReason;
636
638
  let abortRequested = false;
639
+ let catchUpTimer = null;
640
+ const resetCatchUpTimer = () => {
641
+ if (!follow) {
642
+ if (catchUpTimer) {
643
+ clearTimeout(catchUpTimer);
644
+ }
645
+ catchUpTimer = setTimeout(() => {
646
+ queue.close();
647
+ }, CATCH_UP_IDLE_MS);
648
+ }
649
+ };
637
650
  const onMessage = (event) => {
638
651
  try {
639
652
  const parsed = parseEventFrame(getEventData(event));
640
653
  cursor = Math.max(cursor, parsed.seq);
641
654
  if (options.agent && agentFromActor(parsed.actor) !== options.agent) {
655
+ resetCatchUpTimer();
642
656
  return;
643
657
  }
644
658
  queue.push(parsed);
659
+ resetCatchUpTimer();
645
660
  } catch (error) {
646
661
  queue.fail(error);
647
662
  }
648
663
  };
649
664
  const onError = () => {
650
665
  sawTransportError = true;
666
+ if (catchUpTimer) {
667
+ clearTimeout(catchUpTimer);
668
+ }
651
669
  queue.close();
652
670
  };
653
671
  const onClose = (event) => {
654
672
  closeCode = getCloseCode(event);
655
673
  closeReason = getCloseReason(event);
674
+ if (catchUpTimer) {
675
+ clearTimeout(catchUpTimer);
676
+ }
656
677
  queue.close();
657
678
  };
658
679
  const onAbort = () => {
659
680
  abortRequested = true;
681
+ if (catchUpTimer) {
682
+ clearTimeout(catchUpTimer);
683
+ }
660
684
  queue.close();
661
685
  socket.close(NORMAL_WEBSOCKET_CLOSE_CODE, "aborted");
662
686
  };
687
+ const onOpen = () => {
688
+ resetCatchUpTimer();
689
+ };
690
+ socket.addEventListener("open", onOpen);
663
691
  socket.addEventListener("message", onMessage);
664
692
  socket.addEventListener("error", onError);
665
693
  socket.addEventListener("close", onClose);
@@ -682,6 +710,10 @@ var StarciteClient = class {
682
710
  } catch (error) {
683
711
  iterationError = toError(error);
684
712
  } finally {
713
+ if (catchUpTimer) {
714
+ clearTimeout(catchUpTimer);
715
+ }
716
+ socket.removeEventListener("open", onOpen);
685
717
  socket.removeEventListener("message", onMessage);
686
718
  socket.removeEventListener("error", onError);
687
719
  socket.removeEventListener("close", onClose);
@@ -693,7 +725,7 @@ var StarciteClient = class {
693
725
  if (iterationError) {
694
726
  throw iterationError;
695
727
  }
696
- if (abortRequested || options.signal?.aborted) {
728
+ if (abortRequested || options.signal?.aborted || !follow) {
697
729
  return;
698
730
  }
699
731
  const gracefullyClosed = !sawTransportError && closeCode === NORMAL_WEBSOCKET_CLOSE_CODE;
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 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"]}
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 CATCH_UP_IDLE_MS = 1000;\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 follow = options.follow ?? true;\n const reconnectEnabled = follow ? (options.reconnect ?? true) : false;\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 let catchUpTimer: ReturnType<typeof setTimeout> | null = null;\n\n const resetCatchUpTimer = (): void => {\n if (!follow) {\n if (catchUpTimer) {\n clearTimeout(catchUpTimer);\n }\n catchUpTimer = setTimeout(() => {\n queue.close();\n }, CATCH_UP_IDLE_MS);\n }\n };\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 resetCatchUpTimer();\n return;\n }\n\n queue.push(parsed);\n resetCatchUpTimer();\n } catch (error) {\n queue.fail(error);\n }\n };\n\n const onError = (): void => {\n sawTransportError = true;\n if (catchUpTimer) {\n clearTimeout(catchUpTimer);\n }\n queue.close();\n };\n\n const onClose = (event: unknown): void => {\n closeCode = getCloseCode(event);\n closeReason = getCloseReason(event);\n if (catchUpTimer) {\n clearTimeout(catchUpTimer);\n }\n queue.close();\n };\n\n const onAbort = (): void => {\n abortRequested = true;\n if (catchUpTimer) {\n clearTimeout(catchUpTimer);\n }\n queue.close();\n socket.close(NORMAL_WEBSOCKET_CLOSE_CODE, \"aborted\");\n };\n\n const onOpen = (): void => {\n resetCatchUpTimer();\n };\n\n socket.addEventListener(\"open\", onOpen);\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 if (catchUpTimer) {\n clearTimeout(catchUpTimer);\n }\n socket.removeEventListener(\"open\", onOpen);\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 || !follow) {\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 * When `false`, exit after replaying stored events instead of streaming live.\n *\n * Defaults to `true`.\n */\n follow?: boolean;\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"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@starcite/sdk",
3
- "version": "0.0.2",
3
+ "version": "0.0.3",
4
4
  "description": "TypeScript SDK for Starcite",
5
5
  "license": "Apache-2.0",
6
6
  "homepage": "https://starcite.ai",