chatkit-bun 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (52) hide show
  1. package/README.md +202 -0
  2. package/package.json +40 -0
  3. package/src/actions.ts +39 -0
  4. package/src/agents/accumulate.ts +43 -0
  5. package/src/agents/annotations.ts +157 -0
  6. package/src/agents/context.ts +190 -0
  7. package/src/agents/converter.ts +290 -0
  8. package/src/agents/index.ts +25 -0
  9. package/src/agents/stream.ts +1053 -0
  10. package/src/agents/types.ts +30 -0
  11. package/src/agents/workflows.ts +220 -0
  12. package/src/errors.ts +19 -0
  13. package/src/http.ts +60 -0
  14. package/src/index.ts +11 -0
  15. package/src/serialization.ts +75 -0
  16. package/src/server.ts +874 -0
  17. package/src/sqlite-store.ts +400 -0
  18. package/src/store.ts +98 -0
  19. package/src/types/core.ts +322 -0
  20. package/src/types/server.ts +396 -0
  21. package/src/widgets/components.ts +188 -0
  22. package/src/widgets/diff.ts +151 -0
  23. package/src/widgets/index.ts +6 -0
  24. package/src/widgets/serialization.ts +46 -0
  25. package/src/widgets/stream.ts +104 -0
  26. package/src/widgets/template.ts +180 -0
  27. package/src/widgets/types.ts +52 -0
  28. package/types/actions.d.ts +19 -0
  29. package/types/agents/accumulate.d.ts +4 -0
  30. package/types/agents/annotations.d.ts +21 -0
  31. package/types/agents/context.d.ts +35 -0
  32. package/types/agents/converter.d.ts +60 -0
  33. package/types/agents/index.d.ts +9 -0
  34. package/types/agents/stream.d.ts +4 -0
  35. package/types/agents/types.d.ts +26 -0
  36. package/types/agents/workflows.d.ts +34 -0
  37. package/types/errors.d.ts +11 -0
  38. package/types/http.d.ts +6 -0
  39. package/types/index.d.ts +11 -0
  40. package/types/serialization.d.ts +8 -0
  41. package/types/server.d.ts +73 -0
  42. package/types/sqlite-store.d.ts +43 -0
  43. package/types/store.d.ts +45 -0
  44. package/types/types/core.d.ts +1220 -0
  45. package/types/types/server.d.ts +5841 -0
  46. package/types/widgets/components.d.ts +144 -0
  47. package/types/widgets/diff.d.ts +7 -0
  48. package/types/widgets/index.d.ts +6 -0
  49. package/types/widgets/serialization.d.ts +2 -0
  50. package/types/widgets/stream.d.ts +10 -0
  51. package/types/widgets/template.d.ts +19 -0
  52. package/types/widgets/types.d.ts +24 -0
@@ -0,0 +1,52 @@
1
+ import { z } from "zod";
2
+
3
+ export type WidgetPrimitive = string | number | boolean | null;
4
+ export type WidgetJson = WidgetPrimitive | WidgetJson[] | { [key: string]: WidgetJson | undefined };
5
+
6
+ export type DynamicWidgetComponent = {
7
+ type: string;
8
+ key?: string;
9
+ id?: string;
10
+ children?: DynamicWidgetComponent | DynamicWidgetComponent[];
11
+ [key: string]: WidgetJson | DynamicWidgetComponent | DynamicWidgetComponent[] | undefined;
12
+ };
13
+
14
+ export type BasicRoot = DynamicWidgetComponent & { type: "Basic" };
15
+ export type DynamicWidgetRoot = DynamicWidgetComponent & { type: "Card" | "ListView" | "Basic" };
16
+
17
+ export const WidgetJsonSchema: z.ZodType<WidgetJson> = z.lazy(() =>
18
+ z.union([
19
+ z.string(),
20
+ z.number(),
21
+ z.boolean(),
22
+ z.null(),
23
+ z.array(WidgetJsonSchema),
24
+ z.record(z.string(), z.union([WidgetJsonSchema, z.undefined()])),
25
+ ]),
26
+ );
27
+
28
+ export const DynamicWidgetComponentSchema: z.ZodType<DynamicWidgetComponent> = z.lazy(() =>
29
+ z
30
+ .object({
31
+ type: z.string(),
32
+ key: z.string().optional(),
33
+ id: z.string().optional(),
34
+ children: z
35
+ .union([DynamicWidgetComponentSchema, z.array(DynamicWidgetComponentSchema)])
36
+ .optional(),
37
+ })
38
+ .catchall(WidgetJsonSchema.optional()) as z.ZodType<DynamicWidgetComponent>,
39
+ );
40
+
41
+ export const BasicRootSchema: z.ZodType<BasicRoot> = DynamicWidgetComponentSchema.refine(
42
+ (value): value is BasicRoot => value.type === "Basic",
43
+ );
44
+
45
+ export const DynamicWidgetRootSchema: z.ZodType<DynamicWidgetRoot> =
46
+ DynamicWidgetComponentSchema.refine(
47
+ (value): value is DynamicWidgetRoot =>
48
+ value.type === "Card" || value.type === "ListView" || value.type === "Basic",
49
+ );
50
+
51
+ export type WidgetComponent = DynamicWidgetComponent;
52
+ export type WidgetRoot = DynamicWidgetRoot;
@@ -0,0 +1,19 @@
1
+ import { z } from "zod";
2
+ export declare const HandlerSchema: z.ZodUnion<readonly [z.ZodLiteral<"client">, z.ZodLiteral<"server">]>;
3
+ export type Handler = z.infer<typeof HandlerSchema>;
4
+ export declare const LoadingBehaviorSchema: z.ZodUnion<readonly [z.ZodLiteral<"auto">, z.ZodLiteral<"none">, z.ZodLiteral<"self">, z.ZodLiteral<"container">]>;
5
+ export type LoadingBehavior = z.infer<typeof LoadingBehaviorSchema>;
6
+ export declare const ActionConfigSchema: z.ZodObject<{
7
+ type: z.ZodString;
8
+ payload: z.ZodOptional<z.ZodUnknown>;
9
+ handler: z.ZodDefault<z.ZodUnion<readonly [z.ZodLiteral<"client">, z.ZodLiteral<"server">]>>;
10
+ loadingBehavior: z.ZodDefault<z.ZodUnion<readonly [z.ZodLiteral<"auto">, z.ZodLiteral<"none">, z.ZodLiteral<"self">, z.ZodLiteral<"container">]>>;
11
+ streaming: z.ZodDefault<z.ZodBoolean>;
12
+ }, z.core.$strip>;
13
+ export type ActionConfig = z.infer<typeof ActionConfigSchema>;
14
+ export interface CreateActionOptions {
15
+ handler?: Handler;
16
+ loadingBehavior?: LoadingBehavior;
17
+ streaming?: boolean;
18
+ }
19
+ export declare function createActionConfig(type: string, payload?: unknown, options?: CreateActionOptions): ActionConfig;
@@ -0,0 +1,4 @@
1
+ import type { MarkdownWidget, TextWidget } from "../widgets";
2
+ type AccumulatableTextWidget = TextWidget | MarkdownWidget;
3
+ export type { AccumulatableTextWidget };
4
+ export declare function accumulateText<TWidget extends AccumulatableTextWidget>(events: AsyncIterable<unknown>, baseWidget: TWidget): AsyncGenerator<TWidget, void, unknown>;
@@ -0,0 +1,21 @@
1
+ import type { Annotation } from "../types/core";
2
+ export interface ResponseStreamConverterOptions {
3
+ partialImages?: number | null;
4
+ }
5
+ export declare class ResponseStreamConverter {
6
+ private readonly partialImages;
7
+ constructor(options?: ResponseStreamConverterOptions);
8
+ base64ImageToUrl(_imageId: string, base64Image: string, _partialImageIndex?: number | null): string | Promise<string>;
9
+ partialImageIndexToProgress(partialImageIndex: number): number;
10
+ convertAnnotation(annotation: unknown): Annotation | null;
11
+ fileCitationToAnnotation(annotation: unknown): Annotation | null;
12
+ containerFileCitationToAnnotation(annotation: unknown): Annotation | null;
13
+ urlCitationToAnnotation(annotation: unknown): Annotation | null;
14
+ }
15
+ export interface ConvertedTextContent {
16
+ type: "output_text";
17
+ text: string;
18
+ annotations: Annotation[];
19
+ }
20
+ export declare function convertTextContentPart(part: unknown, converter: ResponseStreamConverter): ConvertedTextContent | null;
21
+ export declare const defaultResponseStreamConverter: ResponseStreamConverter;
@@ -0,0 +1,35 @@
1
+ import type { Task, ThreadItem, Workflow, WorkflowSummary } from "../types/core";
2
+ import { type ThreadStreamEvent } from "../types/server";
3
+ import { type WidgetRoot } from "../widgets";
4
+ import type { AgentContextOptions, JsonObject } from "./types";
5
+ export declare class ClientToolCall {
6
+ readonly name: string;
7
+ readonly arguments: JsonObject;
8
+ constructor(name: string, args?: JsonObject);
9
+ }
10
+ type WorkflowItem = Extract<ThreadItem, {
11
+ type: "workflow";
12
+ }>;
13
+ export declare class AgentContext<TContext> {
14
+ readonly thread: AgentContextOptions<TContext>["thread"];
15
+ readonly store: AgentContextOptions<TContext>["store"];
16
+ readonly context: TContext;
17
+ readonly previousResponseId: string | null;
18
+ workflowItem: WorkflowItem | null;
19
+ private readonly now;
20
+ private readonly queue;
21
+ private clientToolCall;
22
+ constructor(options: AgentContextOptions<TContext>);
23
+ stream(event: ThreadStreamEvent): void;
24
+ streamWidget(widget: WidgetRoot | AsyncIterable<WidgetRoot>, copyText?: string | null): Promise<void>;
25
+ events(): AsyncIterable<ThreadStreamEvent>;
26
+ closeEvents(): void;
27
+ startWorkflow(workflow: Workflow): void;
28
+ addWorkflowTask(task: Task): void;
29
+ updateWorkflowTask(task: Task, taskIndex: number): void;
30
+ endWorkflow(summary?: WorkflowSummary, expanded?: boolean): void;
31
+ setClientToolCall(toolCall: ClientToolCall): void;
32
+ getClientToolCall(): ClientToolCall | null;
33
+ createdAt(): string;
34
+ }
35
+ export {};
@@ -0,0 +1,60 @@
1
+ import type { AgentInputItem } from "@openai/agents";
2
+ import type { Attachment, ThreadItem, UserMessageContent } from "../types/core";
3
+ export type UserMessageItem = Extract<ThreadItem, {
4
+ type: "user_message";
5
+ }>;
6
+ export type AssistantMessageItem = Extract<ThreadItem, {
7
+ type: "assistant_message";
8
+ }>;
9
+ export type ClientToolCallItem = Extract<ThreadItem, {
10
+ type: "client_tool_call";
11
+ }>;
12
+ export type WidgetItem = Extract<ThreadItem, {
13
+ type: "widget";
14
+ }>;
15
+ export type GeneratedImageItem = Extract<ThreadItem, {
16
+ type: "generated_image";
17
+ }>;
18
+ export type StructuredInputItem = Extract<ThreadItem, {
19
+ type: "structured_input";
20
+ }>;
21
+ export type TaskItem = Extract<ThreadItem, {
22
+ type: "task";
23
+ }>;
24
+ export type WorkflowItem = Extract<ThreadItem, {
25
+ type: "workflow";
26
+ }>;
27
+ export type HiddenContextItem = Extract<ThreadItem, {
28
+ type: "hidden_context_item";
29
+ }>;
30
+ export type SDKHiddenContextItem = Extract<ThreadItem, {
31
+ type: "sdk_hidden_context";
32
+ }>;
33
+ export type EndOfTurnItem = Extract<ThreadItem, {
34
+ type: "end_of_turn";
35
+ }>;
36
+ export type UserMessageTagContent = Extract<UserMessageContent, {
37
+ type: "input_tag";
38
+ }>;
39
+ export type AgentUserMessageItem = Extract<AgentInputItem, {
40
+ role: "user";
41
+ }>;
42
+ export type AgentMessageContentPart = Exclude<AgentUserMessageItem["content"], string>[number];
43
+ export type ThreadItemConverterResult = AgentInputItem | AgentInputItem[] | null | undefined;
44
+ export declare class ThreadItemConverter {
45
+ attachmentToMessageContent(_attachment: Attachment): AgentMessageContentPart | Promise<AgentMessageContentPart>;
46
+ tagToMessageContent(_tag: UserMessageTagContent): AgentMessageContentPart | Promise<AgentMessageContentPart>;
47
+ generatedImageToInput(item: GeneratedImageItem): ThreadItemConverterResult | Promise<ThreadItemConverterResult>;
48
+ hiddenContextToInput(item: HiddenContextItem): ThreadItemConverterResult | Promise<ThreadItemConverterResult>;
49
+ sdkHiddenContextToInput(item: SDKHiddenContextItem): ThreadItemConverterResult | Promise<ThreadItemConverterResult>;
50
+ taskToInput(item: TaskItem): ThreadItemConverterResult | Promise<ThreadItemConverterResult>;
51
+ workflowToInput(item: WorkflowItem): ThreadItemConverterResult | Promise<ThreadItemConverterResult>;
52
+ widgetToInput(item: WidgetItem): Promise<ThreadItemConverterResult>;
53
+ structuredInputToInput(item: StructuredInputItem): ThreadItemConverterResult | Promise<ThreadItemConverterResult>;
54
+ userMessageToInput(item: UserMessageItem, isLastMessage?: boolean): Promise<ThreadItemConverterResult>;
55
+ assistantMessageToInput(item: AssistantMessageItem): ThreadItemConverterResult | Promise<ThreadItemConverterResult>;
56
+ clientToolCallToInput(item: ClientToolCallItem): ThreadItemConverterResult | Promise<ThreadItemConverterResult>;
57
+ endOfTurnToInput(_item: EndOfTurnItem): ThreadItemConverterResult | Promise<ThreadItemConverterResult>;
58
+ toAgentInput(threadItems: ThreadItem | readonly ThreadItem[]): Promise<AgentInputItem[]>;
59
+ }
60
+ export declare function simpleToAgentInput(threadItems: ThreadItem | readonly ThreadItem[]): Promise<AgentInputItem[]>;
@@ -0,0 +1,9 @@
1
+ export { ResponseStreamConverter, defaultResponseStreamConverter } from "./annotations";
2
+ export type { ResponseStreamConverterOptions } from "./annotations";
3
+ export { accumulateText } from "./accumulate";
4
+ export type { AccumulatableTextWidget } from "./accumulate";
5
+ export { ThreadItemConverter, simpleToAgentInput } from "./converter";
6
+ export type { AgentMessageContentPart, AgentUserMessageItem, AssistantMessageItem, ClientToolCallItem, EndOfTurnItem, GeneratedImageItem, HiddenContextItem, SDKHiddenContextItem, StructuredInputItem, TaskItem, ThreadItemConverterResult, UserMessageItem, UserMessageTagContent, WidgetItem, WorkflowItem, } from "./converter";
7
+ export { AgentContext, ClientToolCall } from "./context";
8
+ export { streamAgentResponse } from "./stream";
9
+ export type { AgentContextOptions, AgentStreamInput, StreamAgentResponseOptions } from "./types";
@@ -0,0 +1,4 @@
1
+ import { type ThreadStreamEvent } from "../types/server";
2
+ import type { AgentContext } from "./context";
3
+ import type { AgentStreamInput, StreamAgentResponseOptions } from "./types";
4
+ export declare function streamAgentResponse<TContext>(context: AgentContext<TContext>, streamedRun: AgentStreamInput | AsyncIterable<unknown>, options?: StreamAgentResponseOptions): AsyncIterable<ThreadStreamEvent>;
@@ -0,0 +1,26 @@
1
+ import type { Store } from "../store";
2
+ import type { JsonValue } from "../serialization";
3
+ import type { ThreadMetadata } from "../types/core";
4
+ import type { ResponseStreamConverter } from "./annotations";
5
+ export interface AgentContextOptions<TContext> {
6
+ thread: ThreadMetadata;
7
+ store: Store<TContext>;
8
+ context: TContext;
9
+ previousResponseId?: string | null;
10
+ now?: () => Date | string;
11
+ }
12
+ export interface AgentStreamInput {
13
+ [Symbol.asyncIterator]?: () => AsyncIterator<unknown>;
14
+ toStream?: () => AsyncIterable<unknown>;
15
+ }
16
+ export interface StreamAgentResponseOptions {
17
+ converter?: ResponseStreamConverter;
18
+ }
19
+ export interface ToolCallMetadata {
20
+ itemId: string | null;
21
+ callId: string | null;
22
+ }
23
+ export type { JsonValue } from "../serialization";
24
+ export type JsonObject = {
25
+ [key: string]: JsonValue;
26
+ };
@@ -0,0 +1,34 @@
1
+ import { type Task, type ThreadItem, type Workflow, type WorkflowSummary } from "../types/core";
2
+ import type { ThreadStreamEvent } from "../types/server";
3
+ import type { AgentContext } from "./context";
4
+ export type WorkflowItem = Extract<ThreadItem, {
5
+ type: "workflow";
6
+ }>;
7
+ export type ThoughtTask = Extract<WorkflowItem["workflow"]["tasks"][number], {
8
+ type: "thought";
9
+ }>;
10
+ export type ThreadItemAddedEvent = Extract<ThreadStreamEvent, {
11
+ type: "thread.item.added";
12
+ }>;
13
+ export type ThreadItemDoneEvent = Extract<ThreadStreamEvent, {
14
+ type: "thread.item.done";
15
+ }>;
16
+ export type ThreadItemUpdatedEvent = Extract<ThreadStreamEvent, {
17
+ type: "thread.item.updated";
18
+ }>;
19
+ export declare function isWorkflowItem(item: ThreadItem | undefined): item is WorkflowItem;
20
+ export declare function createWorkflowItem<TContext>(context: AgentContext<TContext>, workflow: Workflow): WorkflowItem;
21
+ export declare function createReasoningWorkflowItem<TContext>(context: AgentContext<TContext>): WorkflowItem;
22
+ export declare function shouldEmitWorkflowAdded(workflow: Workflow): boolean;
23
+ export declare function workflowAddedEvent(workflow: WorkflowItem): ThreadItemAddedEvent;
24
+ export declare function resumeWorkflowFromThreadItems<TContext>(context: AgentContext<TContext>, items: readonly ThreadItem[]): void;
25
+ export declare function shouldAutoEndWorkflowForItem<TContext>(context: AgentContext<TContext>, item: ThreadItem): boolean;
26
+ export declare function createThoughtTask(content: string): ThoughtTask;
27
+ export declare function workflowTaskAddedEvent(workflow: WorkflowItem, task: Task, taskIndex: number): ThreadItemUpdatedEvent;
28
+ export declare function workflowTaskUpdatedEvent(workflow: WorkflowItem, task: Task, taskIndex: number): ThreadItemUpdatedEvent;
29
+ export declare function normalizeWorkflowTask(task: Task): Task;
30
+ export declare function appendWorkflowTask(workflow: WorkflowItem, task: Task): ThreadItemUpdatedEvent;
31
+ export declare function updateWorkflowTaskEvent(workflow: WorkflowItem, task: Task, taskIndex: number): ThreadItemUpdatedEvent;
32
+ export declare function durationSeconds(startedAt: string, endedAt: string): number;
33
+ export declare function finishWorkflow<TContext>(context: AgentContext<TContext>, summary?: WorkflowSummary, expanded?: boolean): ThreadItemDoneEvent | null;
34
+ export declare function persistOpenWorkflow<TContext>(context: AgentContext<TContext>): Promise<void>;
@@ -0,0 +1,11 @@
1
+ export declare class ChatKitError extends Error {
2
+ constructor(message: string);
3
+ }
4
+ export declare class NotFoundError extends ChatKitError {
5
+ }
6
+ export declare class UnsupportedOperationError extends ChatKitError {
7
+ }
8
+ export declare class ValidationError extends ChatKitError {
9
+ readonly cause?: unknown | undefined;
10
+ constructor(message: string, cause?: unknown | undefined);
11
+ }
@@ -0,0 +1,6 @@
1
+ import { type ChatKitServer } from "./server";
2
+ export interface ChatKitHandlerOptions<TContext> {
3
+ getContext?: (request: Request) => TContext | Promise<TContext>;
4
+ }
5
+ export type ChatKitHandler = (request: Request) => Promise<Response>;
6
+ export declare function createChatKitHandler<TContext = undefined>(server: ChatKitServer<TContext>, options?: ChatKitHandlerOptions<TContext>): ChatKitHandler;
@@ -0,0 +1,11 @@
1
+ export * from "./actions";
2
+ export * from "./agents";
3
+ export * from "./errors";
4
+ export * from "./http";
5
+ export * from "./serialization";
6
+ export * from "./server";
7
+ export * from "./sqlite-store";
8
+ export * from "./store";
9
+ export * from "./types/core";
10
+ export * from "./types/server";
11
+ export * from "./widgets";
@@ -0,0 +1,8 @@
1
+ export type JsonValue = string | number | boolean | null | JsonValue[] | {
2
+ [key: string]: JsonValue;
3
+ };
4
+ export declare function encodeJsonBytes(value: unknown): Uint8Array;
5
+ export declare function decodeJsonBytes(input: string | Uint8Array | ArrayBuffer): unknown;
6
+ export declare function omitUndefinedDeep(value: unknown): unknown;
7
+ export declare function parseDate(value: string | Date): Date;
8
+ export declare function serializeDate(value: string | Date): string;
@@ -0,0 +1,73 @@
1
+ import type { AttachmentStore, Store } from "./store";
2
+ import { type ThreadItem, type ThreadMetadata } from "./types/core";
3
+ import { type AudioInput, type FeedbackKind, type NonStreamingRequest, type StreamOptions, type StreamingRequest, type StructuredInputSubmission, type SyncCustomActionResponse, type Thread, type ThreadCustomActionParams, type ThreadItemUpdate, type ThreadStreamEvent, type TranscriptionResult, type UserMessageInput } from "./types/server";
4
+ type UserMessageItem = Extract<ThreadItem, {
5
+ type: "user_message";
6
+ }>;
7
+ type AssistantMessageItem = Extract<ThreadItem, {
8
+ type: "assistant_message";
9
+ }>;
10
+ type StructuredInputItem = Extract<ThreadItem, {
11
+ type: "structured_input";
12
+ }>;
13
+ type WidgetItem = Extract<ThreadItem, {
14
+ type: "widget";
15
+ }>;
16
+ type ProcessRequestInput = string | Uint8Array | ArrayBuffer;
17
+ export declare class StreamingResult implements AsyncIterable<Uint8Array> {
18
+ readonly jsonEvents: AsyncIterable<Uint8Array>;
19
+ constructor(jsonEvents: AsyncIterable<Uint8Array>);
20
+ [Symbol.asyncIterator](): AsyncIterator<Uint8Array>;
21
+ }
22
+ export declare class NonStreamingResult {
23
+ readonly json: Uint8Array;
24
+ constructor(json: Uint8Array);
25
+ }
26
+ export declare class StreamCancelledError extends Error {
27
+ constructor(message?: string);
28
+ }
29
+ export declare abstract class ChatKitServer<TContext = unknown> {
30
+ readonly store: Store<TContext>;
31
+ readonly attachmentStore: AttachmentStore<TContext> | null;
32
+ constructor(store: Store<TContext>, attachmentStore?: AttachmentStore<TContext> | null);
33
+ abstract respond(thread: ThreadMetadata, inputUserMessage: UserMessageItem | null, context: TContext): AsyncIterable<ThreadStreamEvent>;
34
+ addFeedback(_threadId: string, _itemIds: string[], _kind: FeedbackKind, _context: TContext): Promise<void>;
35
+ transcribe(_audio: AudioInput, _context: TContext): Promise<TranscriptionResult>;
36
+ action(_thread: ThreadMetadata, _action: ThreadCustomActionParams["action"], _sender: WidgetItem | null, _context: TContext): AsyncIterable<ThreadStreamEvent>;
37
+ syncAction(_thread: ThreadMetadata, _action: ThreadCustomActionParams["action"], _sender: WidgetItem | null, _context: TContext): Promise<SyncCustomActionResponse>;
38
+ getStreamOptions(_thread: ThreadMetadata, _context: TContext): StreamOptions;
39
+ handleStreamCancelled(thread: ThreadMetadata, pendingItems: ThreadItem[], context: TContext): Promise<void>;
40
+ process(request: ProcessRequestInput, context: TContext): Promise<StreamingResult | NonStreamingResult>;
41
+ protected processNonStreaming(request: NonStreamingRequest, context: TContext): Promise<Uint8Array>;
42
+ protected processStreaming(request: StreamingRequest, context: TContext): AsyncIterable<Uint8Array>;
43
+ protected processStreamingImpl(request: StreamingRequest, context: TContext): AsyncIterable<ThreadStreamEvent>;
44
+ protected buildUserMessageItem(input: UserMessageInput, thread: ThreadMetadata, context: TContext): Promise<UserMessageItem>;
45
+ protected processNewThreadItemRespond(thread: ThreadMetadata, item: UserMessageItem, context: TContext): AsyncIterable<ThreadStreamEvent>;
46
+ protected persistUserMessageItem(thread: ThreadMetadata, item: UserMessageItem, context: TContext): Promise<void>;
47
+ protected processStreamingContinuation(request: Exclude<StreamingRequest, {
48
+ type: "threads.create" | "threads.add_user_message";
49
+ }>, context: TContext): AsyncIterable<ThreadStreamEvent>;
50
+ protected loadThreadItemsDescending(thread: ThreadMetadata, context: TContext): AsyncIterable<ThreadItem>;
51
+ protected cleanupPendingClientToolCall(thread: ThreadMetadata, context: TContext): Promise<void>;
52
+ protected applyStructuredInputSubmission(item: StructuredInputItem, submission: StructuredInputSubmission): StructuredInputItem;
53
+ protected removeItemsAfterUserMessage(thread: ThreadMetadata, itemId: string, context: TContext): Promise<UserMessageItem>;
54
+ protected processEvents(thread: ThreadMetadata, context: TContext, stream: () => AsyncIterable<ThreadStreamEvent>): AsyncIterable<ThreadStreamEvent>;
55
+ protected updatePendingItems(pendingItems: Map<string, ThreadItem>, itemId: string, update: ThreadItemUpdate): boolean;
56
+ protected mergePendingUpdatesIntoDoneItem(doneItem: ThreadItem, pendingItem: ThreadItem | undefined, hasPendingUpdates: boolean): ThreadItem;
57
+ private mergeAssistantMessageContent;
58
+ protected applyAssistantMessageUpdate(item: AssistantMessageItem, update: Extract<ThreadItemUpdate, {
59
+ type: `assistant_message.${string}`;
60
+ }>): AssistantMessageItem;
61
+ private hasThreadChanged;
62
+ protected serialize(value: unknown): Uint8Array;
63
+ private getAttachmentStore;
64
+ protected loadFullThread(threadId: string, context: TContext): Promise<Thread>;
65
+ protected toThreadResponse(thread: ThreadMetadata | Thread): Thread;
66
+ protected isHiddenItem(item: ThreadItem): boolean;
67
+ private isKnownHiddenItem;
68
+ private isStoredHiddenItem;
69
+ protected processSyncCustomAction(request: Extract<NonStreamingRequest, {
70
+ type: "threads.sync_custom_action";
71
+ }>, context: TContext): Promise<SyncCustomActionResponse>;
72
+ }
73
+ export {};
@@ -0,0 +1,43 @@
1
+ import { BaseStore } from "./store";
2
+ import { type Attachment, type Page, type ThreadItem, type ThreadMetadata } from "./types/core";
3
+ export interface SQLiteStoreOptions<TContext> {
4
+ path?: string;
5
+ getUserId(context: TContext): string;
6
+ }
7
+ export declare class SQLiteStore<TContext = unknown> extends BaseStore<TContext> {
8
+ private readonly db;
9
+ private readonly getUserId;
10
+ constructor(options: SQLiteStoreOptions<TContext>);
11
+ close(): void;
12
+ loadThread(threadId: string, context: TContext): Promise<ThreadMetadata>;
13
+ saveThread(thread: ThreadMetadata, context: TContext): Promise<void>;
14
+ loadThreads(limit: number, after: string | null, order: "asc" | "desc", context: TContext): Promise<Page<ThreadMetadata>>;
15
+ addThreadItem(threadId: string, item: ThreadItem, context: TContext): Promise<void>;
16
+ saveItem(threadId: string, item: ThreadItem, context: TContext): Promise<void>;
17
+ loadItem(threadId: string, itemId: string, context: TContext): Promise<ThreadItem>;
18
+ loadThreadItems(threadId: string, after: string | null, limit: number, order: "asc" | "desc", context: TContext): Promise<Page<ThreadItem>>;
19
+ deleteThread(threadId: string, context: TContext): Promise<void>;
20
+ deleteThreadItem(threadId: string, itemId: string, context: TContext): Promise<void>;
21
+ saveAttachment(attachment: Attachment, context: TContext): Promise<void>;
22
+ loadAttachment(attachmentId: string, context: TContext): Promise<Attachment>;
23
+ deleteAttachment(attachmentId: string, context: TContext): Promise<void>;
24
+ private createSchema;
25
+ private userId;
26
+ private threadRow;
27
+ private itemRow;
28
+ private attachmentRow;
29
+ private threadCursor;
30
+ private itemCursor;
31
+ private threadRows;
32
+ private threadRowsAfter;
33
+ private itemRows;
34
+ private itemRowsAfter;
35
+ private page;
36
+ private requestedLimit;
37
+ private assertPositiveLimit;
38
+ private queryLimit;
39
+ private orderSql;
40
+ private parseThread;
41
+ private parseItem;
42
+ private parseAttachment;
43
+ }
@@ -0,0 +1,45 @@
1
+ import type { Attachment, Page, ThreadItem, ThreadMetadata } from "./types/core";
2
+ export type StoreItemType = "thread" | "message" | "tool_call" | "task" | "workflow" | "attachment" | "sdk_hidden_context";
3
+ export declare function defaultGenerateId(itemType: StoreItemType): string;
4
+ export interface AttachmentCreateParams {
5
+ name: string;
6
+ size: number;
7
+ mime_type: string;
8
+ }
9
+ export interface AttachmentStore<TContext = unknown> {
10
+ deleteAttachment(attachmentId: string, context: TContext): Promise<void>;
11
+ createAttachment(input: AttachmentCreateParams, context: TContext): Promise<Attachment>;
12
+ generateAttachmentId?(mimeType: string, context: TContext): string;
13
+ }
14
+ export interface Store<TContext = unknown> {
15
+ generateThreadId(context: TContext): string;
16
+ generateItemId(itemType: StoreItemType, thread: ThreadMetadata, context: TContext): string;
17
+ loadThread(threadId: string, context: TContext): Promise<ThreadMetadata>;
18
+ saveThread(thread: ThreadMetadata, context: TContext): Promise<void>;
19
+ loadThreadItems(threadId: string, after: string | null, limit: number, order: "asc" | "desc", context: TContext): Promise<Page<ThreadItem>>;
20
+ saveAttachment(attachment: Attachment, context: TContext): Promise<void>;
21
+ loadAttachment(attachmentId: string, context: TContext): Promise<Attachment>;
22
+ deleteAttachment(attachmentId: string, context: TContext): Promise<void>;
23
+ loadThreads(limit: number, after: string | null, order: "asc" | "desc", context: TContext): Promise<Page<ThreadMetadata>>;
24
+ addThreadItem(threadId: string, item: ThreadItem, context: TContext): Promise<void>;
25
+ saveItem(threadId: string, item: ThreadItem, context: TContext): Promise<void>;
26
+ loadItem(threadId: string, itemId: string, context: TContext): Promise<ThreadItem>;
27
+ deleteThread(threadId: string, context: TContext): Promise<void>;
28
+ deleteThreadItem(threadId: string, itemId: string, context: TContext): Promise<void>;
29
+ }
30
+ export declare abstract class BaseStore<TContext = unknown> implements Store<TContext> {
31
+ generateThreadId(_context: TContext): string;
32
+ generateItemId(itemType: StoreItemType, _thread: ThreadMetadata, _context: TContext): string;
33
+ abstract loadThread(threadId: string, context: TContext): Promise<ThreadMetadata>;
34
+ abstract saveThread(thread: ThreadMetadata, context: TContext): Promise<void>;
35
+ abstract loadThreadItems(threadId: string, after: string | null, limit: number, order: "asc" | "desc", context: TContext): Promise<Page<ThreadItem>>;
36
+ abstract saveAttachment(attachment: Attachment, context: TContext): Promise<void>;
37
+ abstract loadAttachment(attachmentId: string, context: TContext): Promise<Attachment>;
38
+ abstract deleteAttachment(attachmentId: string, context: TContext): Promise<void>;
39
+ abstract loadThreads(limit: number, after: string | null, order: "asc" | "desc", context: TContext): Promise<Page<ThreadMetadata>>;
40
+ abstract addThreadItem(threadId: string, item: ThreadItem, context: TContext): Promise<void>;
41
+ abstract saveItem(threadId: string, item: ThreadItem, context: TContext): Promise<void>;
42
+ abstract loadItem(threadId: string, itemId: string, context: TContext): Promise<ThreadItem>;
43
+ abstract deleteThread(threadId: string, context: TContext): Promise<void>;
44
+ abstract deleteThreadItem(threadId: string, itemId: string, context: TContext): Promise<void>;
45
+ }