@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 +34 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +6 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.js +34 -2
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
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
|
|
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;
|
package/dist/index.cjs.map
CHANGED
|
@@ -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":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,IAAAA,cAAkB;;;ACKX,IAAM,gBAAN,cAA4B,MAAM;AAAA,EACvC,YAAY,SAAiB;AAC3B,UAAM,OAAO;AACb,SAAK,OAAO;AAAA,EACd;AACF;AAKO,IAAM,mBAAN,cAA+B,cAAc;AAAA;AAAA,EAEzC;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA,EAET,YACE,SACA,QACA,MACA,SACA;AACA,UAAM,OAAO;AACb,SAAK,OAAO;AACZ,SAAK,SAAS;AACd,SAAK,OAAO;AACZ,SAAK,UAAU;AAAA,EACjB;AACF;AAKO,IAAM,0BAAN,cAAsC,cAAc;AAAA,EACzD,YAAY,SAAiB;AAC3B,UAAM,OAAO;AACb,SAAK,OAAO;AAAA,EACd;AACF;;;AC7CA,iBAAkB;AAElB,IAAM,wBAAwB,aAAE,OAAO,aAAE,QAAQ,CAAC;AAElD,IAAM,oBAAoB,aAAE,MAAM,CAAC,aAAE,QAAQ,MAAM,GAAG,aAAE,QAAQ,OAAO,CAAC,CAAC;AAElE,IAAM,gCAAgC,aAAE,OAAO;AAAA,EACpD,WAAW,aAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EAC3B,IAAI,aAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACpB,MAAM;AACR,CAAC;AASM,IAAM,2BAA2B,aAAE,OAAO;AAAA,EAC/C,IAAI,aAAE,OAAO,EAAE,SAAS;AAAA,EACxB,OAAO,aAAE,OAAO,EAAE,SAAS;AAAA,EAC3B,UAAU,sBAAsB,SAAS;AAAA,EACzC,mBAAmB,8BAA8B,SAAS;AAC5D,CAAC;AAUM,IAAM,sBAAsB,aAAE,OAAO;AAAA,EAC1C,IAAI,aAAE,OAAO;AAAA,EACb,OAAO,aAAE,OAAO,EAAE,SAAS,EAAE,SAAS;AAAA,EACtC,UAAU;AAAA,EACV,UAAU,aAAE,OAAO,EAAE,IAAI,EAAE,YAAY;AAAA,EACvC,YAAY,aAAE,OAAO;AAAA,EACrB,YAAY,aAAE,OAAO;AACvB,CAAC;AAUM,IAAM,wBAAwB,aAAE,OAAO;AAAA,EAC5C,IAAI,aAAE,OAAO;AAAA,EACb,OAAO,aAAE,OAAO,EAAE,SAAS,EAAE,SAAS;AAAA,EACtC,UAAU;AAAA,EACV,YAAY,aAAE,OAAO;AACvB,CAAC;AAUM,IAAM,wBAAwB,aAAE,OAAO;AAAA,EAC5C,UAAU,aAAE,MAAM,qBAAqB;AAAA,EACvC,aAAa,aAAE,OAAO,EAAE,SAAS;AACnC,CAAC;AAUM,IAAM,2BAA2B,aAAE,OAAO;AAAA,EAC/C,MAAM,aAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACtB,SAAS;AAAA,EACT,OAAO,aAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACvB,aAAa,aAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EAC7B,cAAc,aAAE,OAAO,EAAE,IAAI,EAAE,SAAS;AAAA,EACxC,QAAQ,aAAE,OAAO,EAAE,SAAS;AAAA,EAC5B,UAAU,sBAAsB,SAAS;AAAA,EACzC,MAAM,sBAAsB,SAAS;AAAA,EACrC,iBAAiB,aAAE,OAAO,EAAE,SAAS;AAAA,EACrC,cAAc,aAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,SAAS;AACxD,CAAC;AAUM,IAAM,4BAA4B,aAAE,OAAO;AAAA,EAChD,KAAK,aAAE,OAAO,EAAE,IAAI,EAAE,YAAY;AAAA,EAClC,UAAU,aAAE,OAAO,EAAE,IAAI,EAAE,YAAY;AAAA,EACvC,SAAS,aAAE,QAAQ;AACrB,CAAC;AAUM,IAAM,kBAAkB,aAAE,OAAO;AAAA,EACtC,KAAK,aAAE,OAAO,EAAE,IAAI,EAAE,YAAY;AAAA,EAClC,MAAM,aAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACtB,SAAS;AAAA,EACT,OAAO,aAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACvB,aAAa,aAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EAC7B,cAAc,aAAE,OAAO,EAAE,IAAI,EAAE,SAAS;AAAA,EACxC,QAAQ,aAAE,OAAO,EAAE,SAAS;AAAA,EAC5B,UAAU,sBAAsB,SAAS;AAAA,EACzC,MAAM,sBAAsB,SAAS;AAAA,EACrC,iBAAiB,aAAE,OAAO,EAAE,SAAS,EAAE,SAAS;AAAA,EAChD,aAAa,aAAE,OAAO,EAAE,SAAS;AACnC,CAAC;AAUD,IAAM,6BAA6B,gBAAgB,OAAO;AAAA,EACxD,OAAO,aAAE,OAAO,EAAE,SAAS;AAAA,EAC3B,MAAM,aAAE,OAAO,EAAE,SAAS;AAC5B,CAAC;AAaM,IAAM,2BAA2B,aACrC,OAAO;AAAA,EACN,OAAO,aAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC;AAAA,EAC9B,YAAY,aAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC;AAAA,EACnC,aAAa,aAAE,OAAO,EAAE,IAAI,EAAE,SAAS;AAAA,EACvC,MAAM,aAAE,OAAO,EAAE,SAAS;AAAA,EAC1B,SAAS,sBAAsB,SAAS;AAAA,EACxC,MAAM,aAAE,OAAO,EAAE,SAAS;AAAA,EAC1B,QAAQ,aAAE,OAAO,EAAE,SAAS;AAAA,EAC5B,UAAU,sBAAsB,SAAS;AAAA,EACzC,MAAM,sBAAsB,SAAS;AAAA,EACrC,gBAAgB,aAAE,OAAO,EAAE,SAAS;AAAA,EACpC,aAAa,aAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,SAAS;AACvD,CAAC,EACA,OAAO,CAAC,UAAU,CAAC,EAAE,MAAM,QAAQ,MAAM,UAAU;AAAA,EAClD,SAAS;AACX,CAAC;AAgHI,IAAM,6BAA6B,aACvC,OAAO;AAAA,EACN,OAAO,aAAE,OAAO,EAAE,SAAS;AAAA,EAC3B,SAAS,aAAE,OAAO,EAAE,SAAS;AAC/B,CAAC,EACA,SAAS,aAAE,QAAQ,CAAC;;;AF1PvB,IAAM,mBACJ,OAAO,YAAY,eAAe,QAAQ,IAAI,oBAC1C,QAAQ,IAAI,oBACZ;AACN,IAAM,yBAAyB;AAC/B,IAAM,sBAAsB;AAC5B,IAAM,kCAAkC;AACxC,IAAM,8BAA8B;AACpC,IAAM,+BAA+B;AACrC,IAAM,iCAAiC;AACvC,IAAM,gCAAgC;AAEtC,IAAM,kBAAkB,cACrB,OAAO,EACP,UAAU,CAAC,OAAO,YAAqB;AACtC,MAAI;AACF,WAAO,KAAK,MAAM,KAAK;AAAA,EACzB,QAAQ;AACN,YAAQ,SAAS;AAAA,MACf,MAAM,cAAE,aAAa;AAAA,MACrB,SAAS;AAAA,IACX,CAAC;AACD,WAAO,cAAE;AAAA,EACX;AACF,CAAC,EACA,KAAK,eAAe;AAEvB,IAAM,aAAN,MAAoB;AAAA,EACD,QAIb,CAAC;AAAA,EACY,UAOb,CAAC;AAAA,EACG,UAAU;AAAA,EAElB,KAAK,OAAgB;AACnB,QAAI,KAAK,SAAS;AAChB;AAAA,IACF;AAEA,SAAK,QAAQ,EAAE,MAAM,SAAS,MAAM,CAAC;AAAA,EACvC;AAAA,EAEA,QAAc;AACZ,QAAI,KAAK,SAAS;AAChB;AAAA,IACF;AAEA,SAAK,UAAU;AACf,SAAK,QAAQ,EAAE,MAAM,OAAO,CAAC;AAAA,EAC/B;AAAA,EAEA,KAAK,OAAsB;AACzB,QAAI,KAAK,SAAS;AAChB;AAAA,IACF;AAEA,SAAK,UAAU;AACf,SAAK,QAAQ,EAAE,MAAM,SAAS,OAAO,QAAQ,KAAK,EAAE,CAAC;AAAA,EACvD;AAAA,EAEA,MAAM,OAAmC;AACvC,UAAM,OACJ,KAAK,MAAM,MAAM,KAChB,MAAM,IAAI,QAAqC,CAAC,YAAY;AAC3D,WAAK,QAAQ,KAAK,OAAO;AAAA,IAC3B,CAAC;AAEH,QAAI,KAAK,SAAS,SAAS;AACzB,aAAO,EAAE,OAAO,KAAK,OAAO,MAAM,MAAM;AAAA,IAC1C;AAEA,QAAI,KAAK,SAAS,QAAQ;AACxB,aAAO,EAAE,OAAO,QAAW,MAAM,KAAK;AAAA,IACxC;AAEA,UAAM,KAAK;AAAA,EACb;AAAA,EAEQ,QAAQ,MAAyC;AACvD,UAAM,SAAS,KAAK,QAAQ,MAAM;AAElC,QAAI,QAAQ;AACV,aAAO,IAAI;AACX;AAAA,IACF;AAEA,SAAK,MAAM,KAAK,IAAI;AAAA,EACtB;AACF;AAKO,SAAS,iBAAiB,SAAyB;AACxD,QAAM,UAAU,QAAQ,KAAK,EAAE,QAAQ,wBAAwB,EAAE;AACjE,SAAO,QAAQ,SAAS,KAAK,IAAI,UAAU,GAAG,OAAO;AACvD;AAEA,SAAS,mBAAmB,YAA4B;AACtD,MAAI,WAAW,WAAW,UAAU,GAAG;AACrC,WAAO,SAAS,WAAW,MAAM,WAAW,MAAM,CAAC;AAAA,EACrD;AAEA,MAAI,WAAW,WAAW,SAAS,GAAG;AACpC,WAAO,QAAQ,WAAW,MAAM,UAAU,MAAM,CAAC;AAAA,EACnD;AAEA,QAAM,IAAI;AAAA,IACR,8BAA8B,UAAU;AAAA,EAC1C;AACF;AAEA,SAAS,wBACP,KACA,UAA2C,CAAC,GACzB;AACnB,MAAI,OAAO,cAAc,aAAa;AACpC,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,QAAM,UAAU,IAAI,QAAQ,QAAQ,OAAO;AAE3C,MAAI,CAAC,cAAc,OAAO,GAAG;AAC3B,WAAO,IAAI,UAAU,GAAG;AAAA,EAC1B;AAEA,QAAM,eAAe,OAAO,YAAY,QAAQ,QAAQ,CAAC;AAEzD,MAAI;AACF,WAAO,IACL,UAMA,KAAK,EAAE,SAAS,aAAa,CAAC;AAAA,EAClC,QAAQ;AACN,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,aACP,OACA,MACmB;AACnB,MAAI,OAAO,UAAU,aAAa;AAChC,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,SAAO,MAAM,OAAO,IAAI;AAC1B;AAEA,SAAS,QAAQ,OAAuB;AACtC,MAAI,iBAAiB,OAAO;AAC1B,WAAO;AAAA,EACT;AAEA,SAAO,IAAI,MAAM,OAAO,UAAU,WAAW,QAAQ,eAAe;AACtE;AAEA,SAAS,cAAc,SAA2B;AAChD,aAAW,KAAK,QAAQ,KAAK,GAAG;AAC9B,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,SAAS,0BAA0B,QAAwB;AACzD,QAAM,aAAa,OAAO,KAAK;AAE/B,MAAI,WAAW,WAAW,GAAG;AAC3B,UAAM,IAAI,cAAc,wBAAwB;AAAA,EAClD;AAEA,MAAI,oBAAoB,KAAK,UAAU,GAAG;AACxC,WAAO;AAAA,EACT;AAEA,SAAO,UAAU,UAAU;AAC7B;AAEA,SAAS,oBAAoB,OAAoC;AAC/D,SAAO,OAAO,UAAU,YAAY,MAAM,KAAK,EAAE,SAAS,IACtD,MAAM,KAAK,IACX;AACN;AAEA,SAAS,gBAAgB,SAAqC;AAC5D,QAAM,SAAS,QACZ,QAAQ,MAAM,GAAG,EACjB,QAAQ,MAAM,GAAG,EACjB,OAAO,QAAQ,UAAW,IAAK,QAAQ,SAAS,KAAM,GAAI,GAAG;AAEhE,MAAI;AACF,QAAI,OAAO,SAAS,YAAY;AAC9B,aAAO,KAAK,MAAM;AAAA,IACpB;AAEA,QAAI,OAAO,WAAW,aAAa;AACjC,aAAO,OAAO,KAAK,QAAQ,QAAQ,EAAE,SAAS,MAAM;AAAA,IACtD;AAAA,EACF,QAAQ;AACN,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,SAAS,eAAe,QAAqD;AAC3E,QAAM,QAAQ,OAAO,QAAQ,qBAAqB,EAAE,EAAE,KAAK;AAC3D,QAAM,QAAQ,MAAM,MAAM,GAAG;AAE7B,MAAI,MAAM,WAAW,GAAG;AACtB,WAAO;AAAA,EACT;AAEA,QAAM,CAAC,EAAE,cAAc,IAAI;AAE3B,MAAI,mBAAmB,QAAW;AAChC,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,gBAAgB,cAAc;AAE9C,MAAI,YAAY,QAAW;AACzB,WAAO;AAAA,EACT;AAEA,MAAI;AACF,UAAM,UAAU,KAAK,MAAM,OAAO;AAClC,WAAO,YAAY,QAAQ,OAAO,YAAY,WACzC,UACD;AAAA,EACN,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,kBACP,QACA,MACoB;AACpB,aAAW,OAAO,MAAM;AACtB,UAAM,QAAQ,oBAAoB,OAAO,GAAG,CAAC;AAC7C,QAAI,OAAO;AACT,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,8BACP,SACoD;AACpD,MAAI,QAAQ,WAAW,8BAA8B,GAAG;AACtD,WAAO,EAAE,IAAI,SAAS,MAAM,QAAQ;AAAA,EACtC;AAEA,MAAI,QAAQ,WAAW,6BAA6B,GAAG;AACrD,WAAO,EAAE,IAAI,SAAS,MAAM,OAAO;AAAA,EACrC;AAEA,SAAO;AACT;AAEA,SAAS,yBAAyB,SAAyB;AACzD,QAAM,gBAAgB,8BAA8B,OAAO;AAC3D,MAAI,kBAAkB,QAAW;AAC/B,WAAO;AAAA,EACT;AAEA,MAAI,QAAQ,WAAW,4BAA4B,GAAG;AACpD,WAAO,QAAQ,MAAM,6BAA6B,MAAM,EAAE,KAAK;AAAA,EACjE;AAEA,SAAO;AACT;AAEA,SAAS,gCACP,QACqC;AACrC,QAAM,UAAU,oBAAoB,OAAO,GAAG;AAC9C,QAAM,oBACJ,OAAO,aAAa,OAAO,OAAO,cAAc,WAC3C,OAAO,YACR;AACN,QAAM,eAAe,oBACjB,EAAE,GAAG,QAAQ,GAAG,kBAAkB,IAClC;AACJ,QAAM,mBAAmB,UACrB,8BAA8B,OAAO,IACrC;AACJ,QAAM,0BAA0B,kBAAkB,cAAc;AAAA,IAC9D;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AACD,QAAM,WAAW,kBAAkB,cAAc,CAAC,aAAa,UAAU,CAAC;AAC1E,QAAM,iBAAiB,kBAAkB,cAAc;AAAA,IACrD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AACD,QAAM,iBAAiB,iBACnB,8BAA8B,cAAc,IAC5C;AAEJ,QAAM,YAAY;AAAA,IAChB,WAAW,aAAa,UAAU,yBAAyB,OAAO,IAAI;AAAA,IACtE,IAAI,kBAAkB,kBAAkB,MAAM;AAAA,IAC9C,MACE,4BAA4B,WAAW,4BAA4B,SAC/D,0BACC,kBAAkB,QAAQ,gBAAgB,QAAQ;AAAA,EAC3D;AAEA,MACE,UAAU,UAAU,WAAW,KAC/B,UAAU,GAAG,WAAW,KACxB,UAAU,KAAK,WAAW,GAC1B;AACA,WAAO;AAAA,EACT;AAEA,QAAM,SAAS,8BAA8B,UAAU,SAAS;AAEhE,SAAO,OAAO,UAAU,OAAO,OAAO;AACxC;AAEA,SAAS,oCACP,QACqC;AACrC,QAAM,SAAS,eAAe,MAAM;AACpC,SAAO,SAAS,gCAAgC,MAAM,IAAI;AAC5D;AAEA,SAAS,gBAAgB,MAA0B;AACjD,QAAM,SAAS,gBAAgB,UAAU,IAAI;AAE7C,MAAI,CAAC,OAAO,SAAS;AACnB,UAAM,SACJ,OAAO,MAAM,OAAO,CAAC,GAAG,WAAW;AACrC,UAAM,IAAI,wBAAwB,MAAM;AAAA,EAC1C;AAEA,SAAO,OAAO;AAChB;AAEA,SAAS,aAAa,OAAyB;AAC7C,MAAI,SAAS,OAAO,UAAU,YAAY,UAAU,OAAO;AACzD,WAAQ,MAA6B;AAAA,EACvC;AAEA,SAAO;AACT;AAEA,SAAS,aAAa,OAAoC;AACxD,MAAI,SAAS,OAAO,UAAU,YAAY,UAAU,OAAO;AACzD,UAAM,OAAQ,MAA6B;AAC3C,WAAO,OAAO,SAAS,WAAW,OAAO;AAAA,EAC3C;AAEA,SAAO;AACT;AAEA,SAAS,eAAe,OAAoC;AAC1D,MAAI,SAAS,OAAO,UAAU,YAAY,YAAY,OAAO;AAC3D,UAAM,SAAU,MAA+B;AAC/C,WAAO,OAAO,WAAW,YAAY,OAAO,SAAS,IAAI,SAAS;AAAA,EACpE;AAEA,SAAO;AACT;AAEA,SAAS,cACP,MACA,QACQ;AACR,QAAM,WAAW,QAAQ,OAAO,SAAS,WAAW,OAAO,SAAS;AACpE,SAAO,SAAS,GAAG,QAAQ,aAAa,MAAM,MAAM;AACtD;AAEA,eAAe,aAAa,IAAY,QAAqC;AAC3E,MAAI,MAAM,GAAG;AACX;AAAA,EACF;AAEA,QAAM,IAAI,QAAc,CAAC,YAAY;AACnC,QAAI,UAAU;AACd,UAAM,UAAU,WAAW,MAAM;AAC/B,UAAI,SAAS;AACX;AAAA,MACF;AAEA,gBAAU;AACV,UAAI,QAAQ;AACV,eAAO,oBAAoB,SAAS,OAAO;AAAA,MAC7C;AACA,cAAQ;AAAA,IACV,GAAG,EAAE;AAEL,UAAM,UAAU,MAAY;AAC1B,UAAI,SAAS;AACX;AAAA,MACF;AAEA,gBAAU;AACV,mBAAa,OAAO;AACpB,cAAQ,oBAAoB,SAAS,OAAO;AAC5C,cAAQ;AAAA,IACV;AAEA,QAAI,QAAQ;AACV,UAAI,OAAO,SAAS;AAClB,gBAAQ;AACR;AAAA,MACF;AAEA,aAAO,iBAAiB,SAAS,SAAS,EAAE,MAAM,KAAK,CAAC;AAAA,IAC1D;AAAA,EACF,CAAC;AACH;AAEA,SAAS,eAAe,OAAmC;AACzD,MAAI,MAAM,WAAW,QAAQ,GAAG;AAC9B,WAAO,MAAM,MAAM,SAAS,MAAM;AAAA,EACpC;AAEA,SAAO;AACT;AAEA,SAAS,eAAe,OAAgC;AACtD,QAAM,QAAQ,eAAe,MAAM,KAAK;AACxC,QAAM,OACJ,OAAO,MAAM,QAAQ,SAAS,WAAW,MAAM,QAAQ,OAAO;AAEhE,SAAO;AAAA,IACL,GAAG;AAAA,IACH;AAAA,IACA;AAAA,EACF;AACF;AAKO,IAAM,kBAAN,MAAsB;AAAA;AAAA,EAElB;AAAA;AAAA,EAEA;AAAA,EAEQ;AAAA,EAEjB,YAAY,QAAwB,IAAY,QAAwB;AACtE,SAAK,SAAS;AACd,SAAK,KAAK;AACV,SAAK,SAAS;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,OAAyD;AAC9D,UAAM,SAAS,yBAAyB,MAAM,KAAK;AACnD,UAAM,QAAQ,OAAO,MAAM,WAAW,QAAQ,IAC1C,OAAO,QACP,SAAS,OAAO,KAAK;AAEzB,WAAO,KAAK,OAAO,YAAY,KAAK,IAAI;AAAA,MACtC,MAAM,OAAO,QAAQ;AAAA,MACrB,SAAS,OAAO,WAAW,EAAE,MAAM,OAAO,KAAK;AAAA,MAC/C;AAAA,MACA,aAAa,OAAO;AAAA,MACpB,cAAc,OAAO;AAAA,MACrB,QAAQ,OAAO,UAAU;AAAA,MACzB,UAAU,OAAO;AAAA,MACjB,MAAM,OAAO;AAAA,MACb,iBAAiB,OAAO;AAAA,MACxB,cAAc,OAAO;AAAA,IACvB,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,UAAU,OAAyD;AACjE,WAAO,KAAK,OAAO,YAAY,KAAK,IAAI,KAAK;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA,EAKA,KAAK,UAA8B,CAAC,GAAgC;AAClE,WAAO,KAAK,OAAO,WAAW,KAAK,IAAI,OAAO;AAAA,EAChD;AAAA;AAAA;AAAA;AAAA,EAKA,QAAQ,UAA8B,CAAC,GAA6B;AAClE,WAAO,KAAK,OAAO,cAAc,KAAK,IAAI,OAAO;AAAA,EACnD;AACF;AAKO,IAAM,iBAAN,MAAqB;AAAA;AAAA,EAEjB;AAAA,EAEQ;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA;AAAA;AAAA,EAQjB,YAAY,UAAiC,CAAC,GAAG;AAC/C,SAAK,UAAU,iBAAiB,QAAQ,WAAW,gBAAgB;AACnE,SAAK,mBAAmB,mBAAmB,KAAK,OAAO;AACvD,SAAK,UAAU,QAAQ,SAAS;AAChC,SAAK,UAAU,IAAI,QAAQ,QAAQ,OAAO;AAE1C,QAAI,QAAQ,WAAW,QAAW;AAChC,YAAM,gBAAgB,0BAA0B,QAAQ,MAAM;AAC9D,WAAK,QAAQ,IAAI,iBAAiB,aAAa;AAC/C,WAAK,2BACH,oCAAoC,aAAa;AAAA,IACrD;AAEA,SAAK,mBAAmB,QAAQ,oBAAoB;AAAA,EACtD;AAAA;AAAA;AAAA;AAAA,EAKA,QAAQ,WAAmB,QAAyC;AAClE,WAAO,IAAI,gBAAgB,MAAM,WAAW,MAAM;AAAA,EACpD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAO,QAA4B,CAAC,GAA6B;AACrE,UAAM,SAAS,MAAM,KAAK,cAAc,KAAK;AAC7C,WAAO,KAAK,QAAQ,OAAO,IAAI,MAAM;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA,EAKA,cAAc,QAA4B,CAAC,GAA2B;AACpE,UAAM,UAAU,yBAAyB,MAAM;AAAA,MAC7C,GAAG;AAAA,MACH,mBACE,MAAM,qBAAqB,KAAK;AAAA,IACpC,CAAC;AAED,WAAO,KAAK;AAAA,MACV;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,MAAM,KAAK,UAAU,OAAO;AAAA,MAC9B;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,UAA8B,CAAC,GAA6B;AACvE,UAAM,QAAQ,IAAI,gBAAgB;AAElC,QAAI,QAAQ,UAAU,QAAW;AAC/B,UAAI,CAAC,OAAO,UAAU,QAAQ,KAAK,KAAK,QAAQ,SAAS,GAAG;AAC1D,cAAM,IAAI;AAAA,UACR;AAAA,QACF;AAAA,MACF;AAEA,YAAM,IAAI,SAAS,GAAG,QAAQ,KAAK,EAAE;AAAA,IACvC;AAEA,QAAI,QAAQ,WAAW,QAAW;AAChC,UAAI,QAAQ,OAAO,KAAK,EAAE,WAAW,GAAG;AACtC,cAAM,IAAI,cAAc,uCAAuC;AAAA,MACjE;AAEA,YAAM,IAAI,UAAU,QAAQ,MAAM;AAAA,IACpC;AAEA,QAAI,QAAQ,aAAa,QAAW;AAClC,iBAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,QAAQ,QAAQ,GAAG;AAC3D,YAAI,IAAI,KAAK,EAAE,WAAW,KAAK,MAAM,KAAK,EAAE,WAAW,GAAG;AACxD,gBAAM,IAAI;AAAA,YACR;AAAA,UACF;AAAA,QACF;AAEA,cAAM,IAAI,YAAY,GAAG,IAAI,KAAK;AAAA,MACpC;AAAA,IACF;AAEA,UAAM,SAAS,MAAM,OAAO,IAAI,IAAI,MAAM,SAAS,CAAC,KAAK;AAEzD,WAAO,KAAK;AAAA,MACV,YAAY,MAAM;AAAA,MAClB;AAAA,QACE,QAAQ;AAAA,MACV;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,YACE,WACA,OAC8B;AAC9B,UAAM,UAAU,yBAAyB,MAAM,KAAK;AAEpD,WAAO,KAAK;AAAA,MACV,aAAa,mBAAmB,SAAS,CAAC;AAAA,MAC1C;AAAA,QACE,QAAQ;AAAA,QACR,MAAM,KAAK,UAAU,OAAO;AAAA,MAC9B;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAO,cACL,WACA,UAA8B,CAAC,GACJ;AAC3B,UAAM,gBAAgB,QAAQ,UAAU;AACxC,UAAM,mBAAmB,QAAQ,aAAa;AAC9C,UAAM,mBACJ,QAAQ,oBAAoB;AAE9B,QAAI,CAAC,OAAO,UAAU,aAAa,KAAK,gBAAgB,GAAG;AACzD,YAAM,IAAI,cAAc,8CAA8C;AAAA,IACxE;AAEA,QAAI,CAAC,OAAO,SAAS,gBAAgB,KAAK,mBAAmB,GAAG;AAC9D,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAEA,QAAI,SAAS;AAEb,WAAO,MAAM;AACX,UAAI,QAAQ,QAAQ,SAAS;AAC3B;AAAA,MACF;AAEA,YAAM,QAAQ,GAAG,KAAK,gBAAgB,aAAa;AAAA,QACjD;AAAA,MACF,CAAC,gBAAgB,MAAM;AAEvB,YAAM,mBAAmB,IAAI,QAAQ;AACrC,YAAM,gBAAgB,KAAK,QAAQ,IAAI,eAAe;AAEtD,UAAI,eAAe;AACjB,yBAAiB,IAAI,iBAAiB,aAAa;AAAA,MACrD;AAEA,UAAI;AAEJ,UAAI;AACF,iBAAS,KAAK;AAAA,UACZ;AAAA,UACA,cAAc,gBAAgB,IAC1B;AAAA,YACE,SAAS;AAAA,UACX,IACA;AAAA,QACN;AAAA,MACF,SAAS,OAAO;AACd,cAAM,YAAY,QAAQ,KAAK,EAAE;AAEjC,YAAI,CAAC,oBAAoB,QAAQ,QAAQ,SAAS;AAChD,gBAAM,IAAI;AAAA,YACR,uCAAuC,SAAS,MAAM,SAAS;AAAA,UACjE;AAAA,QACF;AAEA,cAAM,aAAa,kBAAkB,QAAQ,MAAM;AACnD;AAAA,MACF;AAEA,YAAM,QAAQ,IAAI,WAAsB;AACxC,UAAI,oBAAoB;AACxB,UAAI;AACJ,UAAI;AACJ,UAAI,iBAAiB;AAErB,YAAM,YAAY,CAAC,UAAyB;AAC1C,YAAI;AACF,gBAAM,SAAS,gBAAgB,aAAa,KAAK,CAAC;AAClD,mBAAS,KAAK,IAAI,QAAQ,OAAO,GAAG;AAEpC,cAAI,QAAQ,SAAS,eAAe,OAAO,KAAK,MAAM,QAAQ,OAAO;AACnE;AAAA,UACF;AAEA,gBAAM,KAAK,MAAM;AAAA,QACnB,SAAS,OAAO;AACd,gBAAM,KAAK,KAAK;AAAA,QAClB;AAAA,MACF;AAEA,YAAM,UAAU,MAAY;AAC1B,4BAAoB;AACpB,cAAM,MAAM;AAAA,MACd;AAEA,YAAM,UAAU,CAAC,UAAyB;AACxC,oBAAY,aAAa,KAAK;AAC9B,sBAAc,eAAe,KAAK;AAClC,cAAM,MAAM;AAAA,MACd;AAEA,YAAM,UAAU,MAAY;AAC1B,yBAAiB;AACjB,cAAM,MAAM;AACZ,eAAO,MAAM,6BAA6B,SAAS;AAAA,MACrD;AAEA,aAAO,iBAAiB,WAAW,SAAS;AAC5C,aAAO,iBAAiB,SAAS,OAAO;AACxC,aAAO,iBAAiB,SAAS,OAAO;AAExC,UAAI,QAAQ,QAAQ;AAClB,YAAI,QAAQ,OAAO,SAAS;AAC1B,kBAAQ;AAAA,QACV,OAAO;AACL,kBAAQ,OAAO,iBAAiB,SAAS,SAAS,EAAE,MAAM,KAAK,CAAC;AAAA,QAClE;AAAA,MACF;AAEA,UAAI,iBAA+B;AAEnC,UAAI;AACF,eAAO,MAAM;AACX,gBAAM,OAAO,MAAM,MAAM,KAAK;AAE9B,cAAI,KAAK,MAAM;AACb;AAAA,UACF;AAEA,gBAAM,KAAK;AAAA,QACb;AAAA,MACF,SAAS,OAAO;AACd,yBAAiB,QAAQ,KAAK;AAAA,MAChC,UAAE;AACA,eAAO,oBAAoB,WAAW,SAAS;AAC/C,eAAO,oBAAoB,SAAS,OAAO;AAC3C,eAAO,oBAAoB,SAAS,OAAO;AAE3C,YAAI,QAAQ,QAAQ;AAClB,kBAAQ,OAAO,oBAAoB,SAAS,OAAO;AAAA,QACrD;AAEA,eAAO,MAAM,6BAA6B,UAAU;AAAA,MACtD;AAEA,UAAI,gBAAgB;AAClB,cAAM;AAAA,MACR;AAEA,UAAI,kBAAkB,QAAQ,QAAQ,SAAS;AAC7C;AAAA,MACF;AAEA,YAAM,mBACJ,CAAC,qBAAqB,cAAc;AAEtC,UAAI,kBAAkB;AACpB;AAAA,MACF;AAEA,UAAI,CAAC,kBAAkB;AACrB,cAAM,IAAI;AAAA,UACR,wCAAwC,SAAS,MAAM;AAAA,YACrD;AAAA,YACA;AAAA,UACF,CAAC;AAAA,QACH;AAAA,MACF;AAEA,YAAM,aAAa,kBAAkB,QAAQ,MAAM;AAAA,IACrD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,WACL,WACA,UAA8B,CAAC,GACD;AAC9B,qBAAiB,YAAY,KAAK,cAAc,WAAW,OAAO,GAAG;AACnE,YAAM,eAAe,QAAQ;AAAA,IAC/B;AAAA,EACF;AAAA,EAEA,MAAc,QACZ,MACA,MACA,QACY;AACZ,UAAM,UAAU,IAAI,QAAQ,KAAK,OAAO;AAExC,QAAI,CAAC,QAAQ,IAAI,cAAc,GAAG;AAChC,cAAQ,IAAI,gBAAgB,kBAAkB;AAAA,IAChD;AAEA,QAAI,KAAK,SAAS;AAChB,YAAM,oBAAoB,IAAI,QAAQ,KAAK,OAAO;AAClD,iBAAW,CAAC,KAAK,KAAK,KAAK,kBAAkB,QAAQ,GAAG;AACtD,gBAAQ,IAAI,KAAK,KAAK;AAAA,MACxB;AAAA,IACF;AAEA,QAAI;AAEJ,QAAI;AACF,iBAAW,MAAM,KAAK,QAAQ,GAAG,KAAK,OAAO,GAAG,IAAI,IAAI;AAAA,QACtD,GAAG;AAAA,QACH;AAAA,MACF,CAAC;AAAA,IACH,SAAS,OAAO;AACd,YAAM,YAAY,QAAQ,KAAK,EAAE;AACjC,YAAM,IAAI;AAAA,QACR,oCAAoC,KAAK,OAAO,KAAK,SAAS;AAAA,MAChE;AAAA,IACF;AAEA,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,UAAU,MAAM,aAAa,QAAQ;AAC3C,YAAM,OACJ,OAAO,SAAS,UAAU,WACtB,QAAQ,QACR,QAAQ,SAAS,MAAM;AAC7B,YAAM,UACJ,OAAO,SAAS,YAAY,WACxB,QAAQ,UACR,SAAS;AAEf,YAAM,IAAI,iBAAiB,SAAS,SAAS,QAAQ,MAAM,OAAO;AAAA,IACpE;AAEA,QAAI,SAAS,WAAW,KAAK;AAC3B,aAAO;AAAA,IACT;AAEA,UAAM,eAAgB,MAAM,SAAS,KAAK;AAE1C,QAAI,CAAC,QAAQ;AACX,aAAO;AAAA,IACT;AAEA,UAAM,SAAS,OAAO,UAAU,YAAY;AAC5C,QAAI,CAAC,OAAO,SAAS;AACnB,YAAM,QAAQ,OAAO,MAAM,OAAO,CAAC,GAAG,WAAW;AACjD,YAAM,IAAI;AAAA,QACR,uDAAuD,KAAK;AAAA,MAC9D;AAAA,IACF;AAEA,WAAO,OAAO;AAAA,EAChB;AACF;AAEA,eAAe,aACb,UACsC;AACtC,MAAI;AACF,UAAM,SAAU,MAAM,SAAS,KAAK;AACpC,UAAM,SAAS,2BAA2B,UAAU,MAAM;AAC1D,WAAO,OAAO,UAAU,OAAO,OAAO;AAAA,EACxC,QAAQ;AACN,WAAO;AAAA,EACT;AACF;;;AD75BO,SAAS,qBACd,UAAiC,CAAC,GAClB;AAChB,SAAO,IAAI,eAAe,OAAO;AACnC;AAKO,IAAM,WAAW,qBAAqB;","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
|
|
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"]}
|