@undefineds.co/xpod 0.3.48 → 0.3.50
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/bin/xpod.js +0 -0
- package/dist/api/auth/MultiAuthenticator.js +2 -2
- package/dist/api/auth/MultiAuthenticator.js.map +1 -1
- package/dist/api/chatkit/pod-store.d.ts +16 -17
- package/dist/api/chatkit/pod-store.js +299 -231
- package/dist/api/chatkit/pod-store.js.map +1 -1
- package/dist/api/chatkit/schema.d.ts +1 -1
- package/dist/api/chatkit/service.js +13 -11
- package/dist/api/chatkit/service.js.map +1 -1
- package/dist/api/chatkit/store.d.ts +1 -0
- package/dist/api/chatkit/store.js +23 -11
- package/dist/api/chatkit/store.js.map +1 -1
- package/dist/api/chatkit/types.d.ts +17 -10
- package/dist/api/chatkit/types.js +97 -14
- package/dist/api/chatkit/types.js.map +1 -1
- package/dist/api/container/common.js +16 -2
- package/dist/api/container/common.js.map +1 -1
- package/dist/api/container/routes.js +3 -0
- package/dist/api/container/routes.js.map +1 -1
- package/dist/api/container/types.d.ts +3 -0
- package/dist/api/container/types.js.map +1 -1
- package/dist/api/handlers/ChatKitV1Handler.js +1 -2
- package/dist/api/handlers/ChatKitV1Handler.js.map +1 -1
- package/dist/api/handlers/CoordinationHandler.d.ts +6 -0
- package/dist/api/handlers/CoordinationHandler.js +115 -0
- package/dist/api/handlers/CoordinationHandler.js.map +1 -0
- package/dist/api/handlers/MatrixHandler.d.ts +11 -0
- package/dist/api/handlers/MatrixHandler.js +144 -2
- package/dist/api/handlers/MatrixHandler.js.map +1 -1
- package/dist/api/handlers/RunHandler.js +33 -15
- package/dist/api/handlers/RunHandler.js.map +1 -1
- package/dist/api/handlers/index.d.ts +1 -0
- package/dist/api/handlers/index.js +1 -0
- package/dist/api/handlers/index.js.map +1 -1
- package/dist/api/index.d.ts +1 -0
- package/dist/api/index.js +1 -0
- package/dist/api/index.js.map +1 -1
- package/dist/api/matrix/PodMatrixStore.d.ts +25 -1
- package/dist/api/matrix/PodMatrixStore.js +253 -41
- package/dist/api/matrix/PodMatrixStore.js.map +1 -1
- package/dist/api/matrix/index.d.ts +1 -1
- package/dist/api/matrix/index.js.map +1 -1
- package/dist/api/matrix/types.d.ts +25 -2
- package/dist/api/matrix/types.js.map +1 -1
- package/dist/api/middleware/AuthMiddleware.d.ts +1 -0
- package/dist/api/middleware/AuthMiddleware.js +13 -1
- package/dist/api/middleware/AuthMiddleware.js.map +1 -1
- package/dist/api/protocol-metadata.d.ts +4 -0
- package/dist/api/protocol-metadata.js +64 -0
- package/dist/api/protocol-metadata.js.map +1 -0
- package/dist/api/reconciler/ClientReconcilerCoordinator.d.ts +42 -0
- package/dist/api/reconciler/ClientReconcilerCoordinator.js +250 -0
- package/dist/api/reconciler/ClientReconcilerCoordinator.js.map +1 -0
- package/dist/api/reconciler/ClientReconcilerCoordinator.jsonld +186 -0
- package/dist/api/reconciler/ServerGroupReconcilerService.d.ts +39 -0
- package/dist/api/reconciler/ServerGroupReconcilerService.js +91 -0
- package/dist/api/reconciler/ServerGroupReconcilerService.js.map +1 -0
- package/dist/api/reconciler/ServerGroupReconcilerService.jsonld +146 -0
- package/dist/api/reconciler/WakeAgentQueue.d.ts +23 -0
- package/dist/api/reconciler/WakeAgentQueue.js +123 -0
- package/dist/api/reconciler/WakeAgentQueue.js.map +1 -0
- package/dist/api/reconciler/WakeAgentQueue.jsonld +91 -0
- package/dist/api/reconciler/coordination.d.ts +61 -0
- package/dist/api/reconciler/coordination.js +109 -0
- package/dist/api/reconciler/coordination.js.map +1 -0
- package/dist/api/reconciler/coordination.jsonld +186 -0
- package/dist/api/reconciler/index.d.ts +4 -0
- package/dist/api/reconciler/index.js +21 -0
- package/dist/api/reconciler/index.js.map +1 -0
- package/dist/api/runs/ManagedRunWorker.js +0 -5
- package/dist/api/runs/ManagedRunWorker.js.map +1 -1
- package/dist/api/runs/RunStateCenter.d.ts +1 -1
- package/dist/api/runs/RunStateCenter.js +12 -28
- package/dist/api/runs/RunStateCenter.js.map +1 -1
- package/dist/api/runs/store.d.ts +12 -15
- package/dist/api/runs/store.js +24 -15
- package/dist/api/runs/store.js.map +1 -1
- package/dist/api/tasks/TaskMaterializer.d.ts +1 -0
- package/dist/api/tasks/TaskMaterializer.js +10 -13
- package/dist/api/tasks/TaskMaterializer.js.map +1 -1
- package/dist/api/tasks/TaskService.d.ts +0 -2
- package/dist/api/tasks/TaskService.js +6 -16
- package/dist/api/tasks/TaskService.js.map +1 -1
- package/dist/api/tasks/store.d.ts +0 -2
- package/dist/api/tasks/store.js.map +1 -1
- package/dist/cli/commands/auth.d.ts +1 -1
- package/dist/cli/commands/auth.js +4 -5
- package/dist/cli/commands/auth.js.map +1 -1
- package/dist/cli/commands/backup.js +1 -1
- package/dist/cli/commands/backup.js.map +1 -1
- package/dist/cli/commands/login.js +1 -1
- package/dist/cli/commands/login.js.map +1 -1
- package/dist/cli/commands/pod.js +1 -1
- package/dist/cli/commands/pod.js.map +1 -1
- package/dist/cli/lib/auth-context.js +10 -7
- package/dist/cli/lib/auth-context.js.map +1 -1
- package/dist/cli/lib/auth-helper.d.ts +10 -6
- package/dist/cli/lib/auth-helper.js +10 -6
- package/dist/cli/lib/auth-helper.js.map +1 -1
- package/dist/cli/lib/credentials-store.d.ts +22 -4
- package/dist/cli/lib/credentials-store.js +68 -51
- package/dist/cli/lib/credentials-store.js.map +1 -1
- package/dist/cli/lib/oidc-auth.d.ts +4 -0
- package/dist/cli/lib/oidc-auth.js +90 -0
- package/dist/cli/lib/oidc-auth.js.map +1 -0
- package/dist/cli/lib/oidc-session-storage.d.ts +3 -0
- package/dist/cli/lib/oidc-session-storage.js +41 -0
- package/dist/cli/lib/oidc-session-storage.js.map +1 -0
- package/dist/components/components.jsonld +5 -1
- package/dist/components/context.jsonld +103 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +15 -0
- package/dist/index.js.map +1 -1
- package/dist/provision/LocalPodProvisioningService.d.ts +1 -0
- package/dist/provision/LocalPodProvisioningService.js +9 -0
- package/dist/provision/LocalPodProvisioningService.js.map +1 -1
- package/dist/provision/LocalPodProvisioningService.jsonld +4 -0
- package/dist/runtime/Proxy.d.ts +1 -0
- package/dist/runtime/Proxy.js +8 -1
- package/dist/runtime/Proxy.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/query-builders/select-query-builder.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/query-builders/select-query-builder.js +19 -9
- package/node_modules/@undefineds.co/drizzle-solid/dist/core/query-builders/select-query-builder.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/query-builders/select-query-builder.d.ts.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/query-builders/select-query-builder.js +19 -9
- package/node_modules/@undefineds.co/drizzle-solid/dist/esm/core/query-builders/select-query-builder.js.map +1 -1
- package/node_modules/@undefineds.co/drizzle-solid/package.json +1 -1
- package/package.json +5 -4
|
@@ -37,7 +37,7 @@ export declare const Thread: import("@undefineds.co/drizzle-solid/dist/core/sche
|
|
|
37
37
|
}>>;
|
|
38
38
|
export declare const Message: import("@undefineds.co/drizzle-solid/dist/core/schema").PodTableWithColumns<import("@undefineds.co/drizzle-solid/dist/core/schema").ResolvedColumns<{
|
|
39
39
|
id: import("@undefineds.co/drizzle-solid/dist/core/schema").PodStringColumn<false, false>;
|
|
40
|
-
|
|
40
|
+
parent: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"uri", null, true, false>;
|
|
41
41
|
chat: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"uri", null, false, false>;
|
|
42
42
|
thread: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"uri", null, false, false>;
|
|
43
43
|
maker: import("@undefineds.co/drizzle-solid/dist/core/schema").ColumnBuilder<"uri", null, false, false>;
|
|
@@ -11,6 +11,7 @@ const global_logger_factory_1 = require("global-logger-factory");
|
|
|
11
11
|
const types_1 = require("./types");
|
|
12
12
|
const RunStateCenter_1 = require("../runs/RunStateCenter");
|
|
13
13
|
const types_2 = require("../workspace/types");
|
|
14
|
+
const reconciler_1 = require("../reconciler");
|
|
14
15
|
/**
|
|
15
16
|
* ChatKit Service
|
|
16
17
|
*/
|
|
@@ -133,13 +134,17 @@ class ChatKitService {
|
|
|
133
134
|
// Create new thread
|
|
134
135
|
const threadId = this.store.generateThreadId(context);
|
|
135
136
|
const now = (0, types_1.nowTimestamp)();
|
|
137
|
+
const normalizedMetadata = this.normalizeThreadMetadata(metadata);
|
|
138
|
+
const coordination = (0, reconciler_1.reconcilerCoordinationMetadata)((0, reconciler_1.normalizeReconcilerOwner)(normalizedMetadata?.reconcilerOwner, 'client'));
|
|
136
139
|
const thread = {
|
|
137
140
|
id: threadId,
|
|
141
|
+
parent: (0, types_1.getThreadParent)({ id: threadId })?.parent,
|
|
138
142
|
status: { type: 'active' },
|
|
139
143
|
workspace: this.resolveThreadWorkspace(params.workspace),
|
|
144
|
+
...coordination,
|
|
140
145
|
created_at: now,
|
|
141
146
|
updated_at: now,
|
|
142
|
-
metadata:
|
|
147
|
+
metadata: (0, reconciler_1.withReconcilerCoordinationMetadata)(normalizedMetadata, coordination.reconcilerOwner),
|
|
143
148
|
};
|
|
144
149
|
await this.store.saveThread(thread, context);
|
|
145
150
|
// Emit thread created event
|
|
@@ -504,16 +509,14 @@ class ChatKitService {
|
|
|
504
509
|
};
|
|
505
510
|
}
|
|
506
511
|
}
|
|
507
|
-
normalizeThreadMetadata(metadata
|
|
512
|
+
normalizeThreadMetadata(metadata) {
|
|
508
513
|
const normalized = { ...(metadata ?? {}) };
|
|
509
|
-
normalized.chat_id
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
: normalized.chat_id;
|
|
516
|
-
return Object.keys(normalized).length > 0 ? normalized : undefined;
|
|
514
|
+
delete normalized.chat_id;
|
|
515
|
+
delete normalized.surface_id;
|
|
516
|
+
delete normalized.commandKind;
|
|
517
|
+
delete normalized.conversationKind;
|
|
518
|
+
const reconcilerOwner = (0, reconciler_1.normalizeReconcilerOwner)(normalized.reconcilerOwner, 'client');
|
|
519
|
+
return (0, reconciler_1.withReconcilerCoordinationMetadata)(Object.keys(normalized).length > 0 ? normalized : undefined, reconcilerOwner);
|
|
517
520
|
}
|
|
518
521
|
resolveThreadWorkspace(workspace) {
|
|
519
522
|
return (0, types_2.isWorkspaceRef)(workspace) ? workspace : undefined;
|
|
@@ -524,7 +527,6 @@ class ChatKitService {
|
|
|
524
527
|
threadRefFromThread(thread) {
|
|
525
528
|
return {
|
|
526
529
|
thread_id: thread.id,
|
|
527
|
-
chat_id: (0, types_1.getChatIdFromThreadMetadata)(thread),
|
|
528
530
|
};
|
|
529
531
|
}
|
|
530
532
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service.js","sourceRoot":"","sources":["../../../src/api/chatkit/service.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * ChatKit Service\n * \n * Core service for handling ChatKit protocol requests.\n * Based on https://github.com/openai/chatkit-python/blob/main/chatkit/server.py\n */\n\nimport { getLoggerFor } from 'global-logger-factory';\nimport type { ChatKitStore, StoreContext } from './store';\nimport type {\n ChatKitReq,\n StreamingReq,\n NonStreamingReq,\n ThreadCreateParams,\n ThreadAddUserMessageParams,\n ThreadAddClientToolOutputParams,\n ThreadRetryAfterItemParams,\n ThreadCustomActionParams,\n ThreadGetByIdParams,\n ItemsListParams,\n ItemFeedbackParams,\n ThreadUpdateParams,\n ThreadDeleteParams,\n ThreadMetadata,\n ThreadRef,\n ThreadItem,\n UserMessageItem,\n AssistantMessageItem,\n ThreadStreamEvent,\n ThreadCreatedEvent,\n ThreadItemAddedEvent,\n ThreadItemDoneEvent,\n ThreadItemUpdatedEvent,\n Page,\n Thread,\n UserMessageContent,\n} from './types';\nimport {\n DEFAULT_THREAD_CHAT_ID,\n getChatIdFromThreadMetadata,\n getThreadIdFromRef,\n isStreamingReq,\n generateId,\n nowTimestamp,\n toThreadRef,\n extractUserMessageText,\n} from './types';\nimport { RunStateCenter, type RunStateEvent } from '../runs/RunStateCenter';\nimport type { RunExecutionBackend } from '../runs/RunExecutionBackend';\nimport { isWorkspaceRef } from '../workspace/types';\nimport type { WorkspaceRef } from '../workspace/types';\n\n/**\n * AI Provider interface for direct text generation in tests/dev harnesses.\n *\n * Product Chat requests go through RunStateCenter / Agent Runtime. This\n * provider is not a deployment compatibility path.\n */\nexport interface AiProvider {\n /**\n * Stream a response for the given messages\n * Returns an async iterator of text chunks\n */\n streamResponse(\n messages: Array<{ role: 'system' | 'user' | 'assistant'; content: string }>,\n options?: {\n model?: string;\n temperature?: number;\n maxTokens?: number;\n context?: unknown; // Allow passing context for auth\n },\n ): AsyncIterable<string>;\n}\n\n/**\n * ChatKit Service Options\n */\nexport interface ChatKitServiceOptions<TContext = StoreContext> {\n store: ChatKitStore<TContext>;\n aiProvider?: AiProvider;\n systemPrompt?: string;\n /**\n * Enable xpod Agent Runtime invocation (local-only feature).\n * When enabled, thread.metadata.runtime controls the runner/worktree.\n */\n enableAgentRuntime?: boolean;\n allowDirectAiFallback?: boolean;\n runExecutionBackend?: RunExecutionBackend;\n}\n\n/**\n * Streaming result wrapper\n */\nexport interface StreamingResult {\n type: 'streaming';\n stream(): AsyncIterable<Uint8Array>;\n}\n\n/**\n * Non-streaming result wrapper\n */\nexport interface NonStreamingResult {\n type: 'non_streaming';\n json: string;\n}\n\nexport type ChatKitResult = StreamingResult | NonStreamingResult;\n\n/**\n * ChatKit Service\n */\nexport class ChatKitService<TContext = StoreContext> {\n private readonly logger = getLoggerFor(this);\n private readonly store: ChatKitStore<TContext>;\n private readonly aiProvider?: AiProvider;\n private readonly systemPrompt: string;\n private readonly allowDirectAiFallback: boolean;\n private readonly runStateCenter: RunStateCenter<TContext>;\n\n public constructor(options: ChatKitServiceOptions<TContext>) {\n this.store = options.store;\n this.aiProvider = options.aiProvider;\n this.systemPrompt = options.systemPrompt ?? 'You are a helpful assistant.';\n this.allowDirectAiFallback = options.allowDirectAiFallback ?? false;\n this.runStateCenter = new RunStateCenter({\n store: this.store,\n enableAgentRuntime: options.enableAgentRuntime ?? true,\n executionBackend: options.runExecutionBackend,\n });\n }\n\n /**\n * Process a ChatKit request\n */\n public async process(requestBody: string | Buffer, context: TContext): Promise<ChatKitResult> {\n const requestStr = typeof requestBody === 'string' ? requestBody : requestBody.toString('utf-8');\n \n let request: ChatKitReq;\n try {\n request = JSON.parse(requestStr) as ChatKitReq;\n } catch (e) {\n throw new Error('Invalid JSON request body');\n }\n\n this.logger.debug(`Processing ChatKit request: ${request.type}`);\n\n if (isStreamingReq(request)) {\n return {\n type: 'streaming',\n stream: () => this.processStreamingAsBytes(request, context),\n };\n } else {\n const result = await this.processNonStreaming(request, context);\n return {\n type: 'non_streaming',\n json: JSON.stringify(result),\n };\n }\n }\n\n /**\n * Convert streaming events to SSE bytes\n */\n private async *processStreamingAsBytes(request: StreamingReq, context: TContext): AsyncIterable<Uint8Array> {\n const encoder = new TextEncoder();\n try {\n for await (const event of this.processStreaming(request, context)) {\n this.logger.info(`ChatKit streaming event (${request.type}): ${event.type}`);\n const data = JSON.stringify(event);\n yield encoder.encode(`data: ${data}\\n\\n`);\n }\n } catch (error: any) {\n this.logger.error(`ChatKit streaming request failed (${request.type}): ${error?.stack || error}`);\n const errorEvent: ThreadStreamEvent = {\n type: 'error',\n error: {\n code: 'internal_error',\n message: error.message || 'An error occurred',\n },\n };\n yield encoder.encode(`data: ${JSON.stringify(errorEvent)}\\n\\n`);\n }\n }\n\n /**\n * Process streaming requests\n */\n private async *processStreaming(request: StreamingReq, context: TContext): AsyncIterable<ThreadStreamEvent> {\n switch (request.type) {\n case 'threads.create':\n yield* this.handleThreadsCreate(request.params, context, request.metadata);\n break;\n case 'threads.add_user_message':\n yield* this.handleThreadsAddUserMessage(request.params, context);\n break;\n case 'threads.add_client_tool_output':\n yield* this.handleThreadsAddClientToolOutput(request.params, context);\n break;\n case 'threads.retry_after_item':\n yield* this.handleThreadsRetryAfterItem(request.params, context);\n break;\n case 'threads.custom_action':\n yield* this.handleThreadsCustomAction(request.params, context);\n break;\n }\n }\n\n /**\n * Process non-streaming requests\n */\n private async processNonStreaming(request: NonStreamingReq, context: TContext): Promise<unknown> {\n switch (request.type) {\n case 'threads.get_by_id':\n return this.handleThreadsGetById(request.params, context);\n case 'threads.list':\n return this.handleThreadsList(request.params, context);\n case 'items.list':\n return this.handleItemsList(request.params, context);\n case 'items.feedback':\n return this.handleItemsFeedback(request.params, context);\n case 'attachments.create':\n return this.handleAttachmentsCreate(request.params, context);\n case 'attachments.delete':\n return this.handleAttachmentsDelete(request.params, context);\n case 'threads.update':\n return this.handleThreadsUpdate(request.params, context);\n case 'threads.delete':\n return this.handleThreadsDelete(request.params, context);\n }\n }\n\n // =========================================================================\n // Streaming Request Handlers\n // =========================================================================\n\n /**\n * Handle threads.create - Create a new thread and optionally respond to initial message\n */\n private async *handleThreadsCreate(\n params: ThreadCreateParams,\n context: TContext,\n metadata?: Record<string, unknown>,\n ): AsyncIterable<ThreadStreamEvent> {\n // Create new thread\n const threadId = this.store.generateThreadId(context);\n const now = nowTimestamp();\n \n const thread: ThreadMetadata = {\n id: threadId,\n status: { type: 'active' },\n workspace: this.resolveThreadWorkspace(params.workspace),\n created_at: now,\n updated_at: now,\n metadata: this.normalizeThreadMetadata(metadata, params.chat_id),\n };\n\n await this.store.saveThread(thread, context);\n\n // Emit thread created event\n yield {\n type: 'thread.created',\n thread,\n } as ThreadCreatedEvent;\n\n // If input provided, add user message and respond\n if (params.input) {\n const threadRef = this.threadRefFromThread(thread);\n const userMessage = await this.createUserMessage(threadRef, params.input.content, context, thread);\n await this.store.addThreadItem(threadRef, userMessage, context);\n\n yield {\n type: 'thread.item.added',\n item: userMessage,\n } as ThreadItemAddedEvent;\n\n yield {\n type: 'thread.item.done',\n item: userMessage,\n } as ThreadItemDoneEvent;\n\n // Generate response (AI provider or Agent Runtime)\n yield* this.respond(thread, userMessage, context, params.input.inference_options);\n }\n }\n\n /**\n * Handle threads.add_user_message - Add a user message and respond\n */\n private async *handleThreadsAddUserMessage(\n params: ThreadAddUserMessageParams,\n context: TContext,\n ): AsyncIterable<ThreadStreamEvent> {\n const threadRef = this.threadRefFromParams(params);\n const thread = await this.store.loadThread(threadRef, context);\n\n // Create and save user message\n const userMessage = await this.createUserMessage(threadRef, params.input.content, context);\n await this.store.addThreadItem(threadRef, userMessage, context);\n\n yield {\n type: 'thread.item.added',\n item: userMessage,\n } as ThreadItemAddedEvent;\n\n yield {\n type: 'thread.item.done',\n item: userMessage,\n } as ThreadItemDoneEvent;\n\n // Generate response (AI provider or Agent Runtime)\n yield* this.respond(thread, userMessage, context, params.input.inference_options, threadRef);\n }\n\n /**\n * Handle threads.add_client_tool_output - Handle tool output (not fully implemented)\n */\n private async *handleThreadsAddClientToolOutput(\n params: ThreadAddClientToolOutputParams,\n context: TContext,\n ): AsyncIterable<ThreadStreamEvent> {\n const threadRef = this.threadRefFromParams(params);\n for await (\n const event of this.runStateCenter.completeClientToolOutput({\n threadRef,\n itemId: params.item_id,\n output: params.output,\n context,\n })\n ) {\n yield this.projectRunStateEvent(event);\n }\n }\n\n /**\n * Handle threads.retry_after_item - Retry generation after a specific item\n */\n private async *handleThreadsRetryAfterItem(\n params: ThreadRetryAfterItemParams,\n context: TContext,\n ): AsyncIterable<ThreadStreamEvent> {\n const threadRef = this.threadRefFromParams(params);\n const thread = await this.store.loadThread(threadRef, context);\n \n // Load all items and find the last user message before the retry point\n const items = await this.store.loadThreadItems(threadRef, undefined, 1000, 'asc', context);\n \n let lastUserMessage: UserMessageItem | undefined;\n for (const item of items.data) {\n if (item.id === params.item_id) {\n break;\n }\n if (item.type === 'user_message') {\n lastUserMessage = item;\n }\n }\n\n if (lastUserMessage) {\n yield* this.respond(thread, lastUserMessage, context, undefined, threadRef);\n }\n }\n\n /**\n * Handle threads.custom_action - Handle custom widget actions (not fully implemented)\n */\n private async *handleThreadsCustomAction(\n params: ThreadCustomActionParams,\n context: TContext,\n ): AsyncIterable<ThreadStreamEvent> {\n this.logger.info(`Custom action: ${params.action} on item ${params.item_id}`);\n // Custom actions can be implemented based on specific needs\n }\n\n // =========================================================================\n // Non-Streaming Request Handlers\n // =========================================================================\n\n /**\n * Handle threads.get_by_id\n */\n private async handleThreadsGetById(\n params: ThreadGetByIdParams,\n context: TContext,\n ): Promise<Thread> {\n const threadRef = this.threadRefFromParams(params);\n const thread = await this.store.loadThread(threadRef, context);\n const items = await this.store.loadThreadItems(threadRef, undefined, 50, 'asc', context);\n \n return {\n ...thread,\n items,\n };\n }\n\n /**\n * Handle threads.list\n */\n private async handleThreadsList(\n params: { limit?: number; order?: string; after?: string } | undefined,\n context: TContext,\n ): Promise<Page<ThreadMetadata>> {\n return this.store.loadThreads(\n params?.limit ?? 20,\n params?.after,\n params?.order ?? 'desc',\n context,\n );\n }\n\n /**\n * Handle items.list\n */\n private async handleItemsList(\n params: ItemsListParams,\n context: TContext,\n ): Promise<Page<ThreadItem>> {\n return this.store.loadThreadItems(\n this.threadRefFromParams(params),\n params.after,\n params.limit ?? 50,\n params.order ?? 'asc',\n context,\n );\n }\n\n /**\n * Handle items.feedback (acknowledge only for now)\n */\n private async handleItemsFeedback(\n params: ItemFeedbackParams,\n context: TContext,\n ): Promise<{ success: boolean }> {\n this.logger.info(`Feedback received: ${params.feedback} for items ${params.item_ids.join(', ')}`);\n // Store feedback in metadata or separate table if needed\n return { success: true };\n }\n\n /**\n * Handle attachments.create\n */\n private async handleAttachmentsCreate(\n params: { name: string; size: number; mime_type: string },\n context: TContext,\n ): Promise<{ attachment_id: string; upload_url?: string }> {\n const attachmentId = generateId('attach');\n // For now, return a placeholder - actual upload handling would need S3/MinIO integration\n return {\n attachment_id: attachmentId,\n // upload_url would be provided for actual file upload\n };\n }\n\n /**\n * Handle attachments.delete\n */\n private async handleAttachmentsDelete(\n params: { attachment_id: string },\n context: TContext,\n ): Promise<{ success: boolean }> {\n if (this.store.deleteAttachment) {\n await this.store.deleteAttachment(params.attachment_id, context);\n }\n return { success: true };\n }\n\n /**\n * Handle threads.update\n */\n private async handleThreadsUpdate(\n params: ThreadUpdateParams,\n context: TContext,\n ): Promise<ThreadMetadata> {\n const threadRef = this.threadRefFromParams(params);\n const thread = await this.store.loadThread(threadRef, context);\n \n if (params.title !== undefined) {\n thread.title = params.title;\n }\n if (params.workspace !== undefined) {\n thread.workspace = params.workspace || undefined;\n }\n thread.updated_at = nowTimestamp();\n\n await this.store.saveThread(thread, context);\n return thread;\n }\n\n /**\n * Handle threads.delete\n */\n private async handleThreadsDelete(\n params: ThreadDeleteParams,\n context: TContext,\n ): Promise<{ success: boolean }> {\n await this.store.deleteThread(this.threadRefFromParams(params), context);\n return { success: true };\n }\n\n // =========================================================================\n // Core Response Generation\n // =========================================================================\n\n /**\n * Generate AI response for a user message\n * This is the main response generation logic\n */\n private async *respond(\n thread: ThreadMetadata,\n userMessage: UserMessageItem,\n context: TContext,\n inferenceOptions?: any,\n threadRef: ThreadRef = this.threadRefFromThread(thread),\n ): AsyncIterable<ThreadStreamEvent> {\n const runtimeConfig = this.runStateCenter.getAgentRuntimeConfig(thread, context)\n ?? this.runStateCenter.getDefaultAgentRuntimeConfig(context);\n if (runtimeConfig) {\n for await (\n const event of this.runStateCenter.startAgentRun({\n thread,\n userMessage,\n context,\n runtimeConfig,\n })\n ) {\n yield this.projectRunStateEvent(event);\n }\n return;\n }\n\n if (!this.allowDirectAiFallback || !this.aiProvider) {\n yield {\n type: 'error',\n error: {\n code: 'runtime_required',\n message: 'Chat requires Agent Runtime; direct AI fallback is disabled',\n },\n };\n return;\n }\n\n // Build conversation history\n const messages = await this.buildConversationHistory(threadRef, context);\n \n // Create assistant message item\n const assistantItemId = this.store.generateItemId('assistant_message', thread, context);\n const assistantItem: AssistantMessageItem = {\n id: assistantItemId,\n thread_id: thread.id,\n type: 'assistant_message',\n content: [{ type: 'output_text', text: '' }],\n status: 'in_progress',\n created_at: nowTimestamp(),\n };\n\n await this.store.addThreadItem(threadRef, assistantItem, context);\n\n // Emit item added event\n yield {\n type: 'thread.item.added',\n item: assistantItem,\n } as ThreadItemAddedEvent;\n\n // Stream AI response\n let fullText = '';\n let partIndex = 0;\n\n try {\n for await (const chunk of this.aiProvider.streamResponse(messages, {\n model: inferenceOptions?.model,\n temperature: inferenceOptions?.temperature,\n maxTokens: inferenceOptions?.max_tokens,\n context, // Pass context for auth\n })) {\n fullText += chunk;\n\n // Emit text delta update\n yield {\n type: 'thread.item.updated',\n item_id: assistantItemId,\n update: {\n type: 'assistant_message.content_part.text_delta',\n part_index: partIndex,\n delta: chunk,\n },\n } as ThreadItemUpdatedEvent;\n }\n\n // Update item with full content\n assistantItem.content = [{ type: 'output_text', text: fullText }];\n assistantItem.status = 'completed';\n await this.store.saveItem(threadRef, assistantItem, context);\n\n // Emit item done event\n yield {\n type: 'thread.item.done',\n item: assistantItem,\n } as ThreadItemDoneEvent;\n } catch (error: any) {\n this.logger.error(`AI response generation failed: ${error}`);\n\n assistantItem.content = [{ type: 'output_text', text: 'Sorry, an error occurred while generating the response.' }];\n assistantItem.status = 'incomplete';\n await this.store.saveItem(threadRef, assistantItem, context);\n\n yield {\n type: 'thread.item.done',\n item: assistantItem,\n } as ThreadItemDoneEvent;\n\n yield {\n type: 'error',\n error: {\n code: 'generation_error',\n message: error.message || 'Failed to generate response',\n },\n };\n }\n\n // Auto-generate title if this is the first exchange (outside try/catch to not affect message saving)\n if (!thread.title) {\n try {\n const title = this.generateThreadTitle(userMessage, fullText);\n thread.title = title;\n thread.updated_at = nowTimestamp();\n await this.store.saveThread(thread, context);\n\n yield {\n type: 'thread.updated',\n thread,\n };\n } catch (titleError: any) {\n this.logger.warn(`Failed to auto-generate thread title: ${titleError.message}`);\n // Don't throw - title generation failure shouldn't affect the response\n }\n }\n }\n\n /**\n * Build conversation history from thread items\n */\n private async buildConversationHistory(\n thread: ThreadRef,\n context: TContext,\n ): Promise<Array<{ role: 'system' | 'user' | 'assistant'; content: string }>> {\n const messages: Array<{ role: 'system' | 'user' | 'assistant'; content: string }> = [];\n\n // Add system prompt\n messages.push({ role: 'system', content: this.systemPrompt });\n\n // Load thread items\n const items = await this.store.loadThreadItems(thread, undefined, 100, 'asc', context);\n\n for (const item of items.data) {\n if (item.type === 'user_message') {\n const text = extractUserMessageText(item.content);\n if (text) {\n messages.push({ role: 'user', content: text });\n }\n } else if (item.type === 'assistant_message') {\n const text = item.content\n .filter((c) => c.type === 'output_text')\n .map((c) => c.text)\n .join('\\n');\n if (text) {\n messages.push({ role: 'assistant', content: text });\n }\n }\n }\n\n return messages;\n }\n\n /**\n * Create a user message item\n */\n private async createUserMessage(\n threadRef: ThreadRef,\n content: UserMessageContent[],\n context: TContext,\n thread?: ThreadMetadata,\n ): Promise<UserMessageItem> {\n // Use provided thread or load it\n const threadMeta = thread || await this.store.loadThread(threadRef, context);\n const threadId = getThreadIdFromRef(threadRef);\n const itemId = this.store.generateItemId('user_message', threadMeta, context);\n\n return {\n id: itemId,\n thread_id: threadId,\n type: 'user_message',\n content,\n created_at: nowTimestamp(),\n };\n }\n\n /**\n * Generate a title for the thread based on the first exchange\n */\n private generateThreadTitle(userMessage: UserMessageItem, assistantResponse: string): string {\n const userText = extractUserMessageText(userMessage.content);\n // Use the first 50 chars of user message as title\n let title = userText.slice(0, 50);\n if (userText.length > 50) {\n title += '...';\n }\n return title || 'New Chat';\n }\n\n private projectRunStateEvent(event: RunStateEvent): ThreadStreamEvent {\n switch (event.type) {\n case 'item_added':\n return { type: 'thread.item.added', item: event.item } as ThreadItemAddedEvent;\n case 'item_updated':\n return {\n type: 'thread.item.updated',\n item_id: event.itemId,\n update: {\n type: 'assistant_message.content_part.text_delta',\n part_index: 0,\n delta: event.delta,\n },\n } as ThreadItemUpdatedEvent;\n case 'item_done':\n return { type: 'thread.item.done', item: event.item } as ThreadItemDoneEvent;\n case 'client_effect':\n return { type: 'client_effect', effect: event.effect };\n case 'error':\n return {\n type: 'error',\n error: {\n code: event.code,\n message: event.message,\n },\n };\n }\n }\n\n private normalizeThreadMetadata(\n metadata: Record<string, unknown> | undefined,\n chatId?: string,\n ): Record<string, unknown> | undefined {\n const normalized = { ...(metadata ?? {}) };\n normalized.chat_id = chatId\n ?? (typeof normalized.chat_id === 'string' && normalized.chat_id.length > 0\n ? normalized.chat_id\n : DEFAULT_THREAD_CHAT_ID);\n normalized.surface_id = typeof normalized.surface_id === 'string' && normalized.surface_id.length > 0\n ? normalized.surface_id\n : normalized.chat_id;\n return Object.keys(normalized).length > 0 ? normalized : undefined;\n }\n\n private resolveThreadWorkspace(workspace: WorkspaceRef | undefined): WorkspaceRef | undefined {\n return isWorkspaceRef(workspace) ? workspace : undefined;\n }\n\n private threadRefFromParams(params: { thread_id: string; chat_id?: string }): ThreadRef {\n return toThreadRef(params);\n }\n\n private threadRefFromThread(thread: ThreadMetadata): ThreadRef {\n return {\n thread_id: thread.id,\n chat_id: getChatIdFromThreadMetadata(thread),\n };\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"service.js","sourceRoot":"","sources":["../../../src/api/chatkit/service.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * ChatKit Service\n * \n * Core service for handling ChatKit protocol requests.\n * Based on https://github.com/openai/chatkit-python/blob/main/chatkit/server.py\n */\n\nimport { getLoggerFor } from 'global-logger-factory';\nimport type { ChatKitStore, StoreContext } from './store';\nimport type {\n ChatKitReq,\n StreamingReq,\n NonStreamingReq,\n ThreadCreateParams,\n ThreadAddUserMessageParams,\n ThreadAddClientToolOutputParams,\n ThreadRetryAfterItemParams,\n ThreadCustomActionParams,\n ThreadGetByIdParams,\n ItemsListParams,\n ItemFeedbackParams,\n ThreadUpdateParams,\n ThreadDeleteParams,\n ThreadMetadata,\n ThreadRef,\n ThreadItem,\n UserMessageItem,\n AssistantMessageItem,\n ThreadStreamEvent,\n ThreadCreatedEvent,\n ThreadItemAddedEvent,\n ThreadItemDoneEvent,\n ThreadItemUpdatedEvent,\n Page,\n Thread,\n UserMessageContent,\n} from './types';\nimport {\n getThreadParent,\n getThreadIdFromRef,\n isStreamingReq,\n generateId,\n nowTimestamp,\n toThreadRef,\n extractUserMessageText,\n} from './types';\nimport { RunStateCenter, type RunStateEvent } from '../runs/RunStateCenter';\nimport type { RunExecutionBackend } from '../runs/RunExecutionBackend';\nimport { isWorkspaceRef } from '../workspace/types';\nimport type { WorkspaceRef } from '../workspace/types';\nimport {\n normalizeReconcilerOwner,\n reconcilerCoordinationMetadata,\n withReconcilerCoordinationMetadata,\n} from '../reconciler';\n\n/**\n * AI Provider interface for direct text generation in tests/dev harnesses.\n *\n * Product Chat requests go through RunStateCenter / Agent Runtime. This\n * provider is not a deployment compatibility path.\n */\nexport interface AiProvider {\n /**\n * Stream a response for the given messages\n * Returns an async iterator of text chunks\n */\n streamResponse(\n messages: Array<{ role: 'system' | 'user' | 'assistant'; content: string }>,\n options?: {\n model?: string;\n temperature?: number;\n maxTokens?: number;\n context?: unknown; // Allow passing context for auth\n },\n ): AsyncIterable<string>;\n}\n\n/**\n * ChatKit Service Options\n */\nexport interface ChatKitServiceOptions<TContext = StoreContext> {\n store: ChatKitStore<TContext>;\n aiProvider?: AiProvider;\n systemPrompt?: string;\n /**\n * Enable xpod Agent Runtime invocation (local-only feature).\n * When enabled, thread.metadata.runtime controls the runner/worktree.\n */\n enableAgentRuntime?: boolean;\n allowDirectAiFallback?: boolean;\n runExecutionBackend?: RunExecutionBackend;\n}\n\n/**\n * Streaming result wrapper\n */\nexport interface StreamingResult {\n type: 'streaming';\n stream(): AsyncIterable<Uint8Array>;\n}\n\n/**\n * Non-streaming result wrapper\n */\nexport interface NonStreamingResult {\n type: 'non_streaming';\n json: string;\n}\n\nexport type ChatKitResult = StreamingResult | NonStreamingResult;\n\n/**\n * ChatKit Service\n */\nexport class ChatKitService<TContext = StoreContext> {\n private readonly logger = getLoggerFor(this);\n private readonly store: ChatKitStore<TContext>;\n private readonly aiProvider?: AiProvider;\n private readonly systemPrompt: string;\n private readonly allowDirectAiFallback: boolean;\n private readonly runStateCenter: RunStateCenter<TContext>;\n\n public constructor(options: ChatKitServiceOptions<TContext>) {\n this.store = options.store;\n this.aiProvider = options.aiProvider;\n this.systemPrompt = options.systemPrompt ?? 'You are a helpful assistant.';\n this.allowDirectAiFallback = options.allowDirectAiFallback ?? false;\n this.runStateCenter = new RunStateCenter({\n store: this.store,\n enableAgentRuntime: options.enableAgentRuntime ?? true,\n executionBackend: options.runExecutionBackend,\n });\n }\n\n /**\n * Process a ChatKit request\n */\n public async process(requestBody: string | Buffer, context: TContext): Promise<ChatKitResult> {\n const requestStr = typeof requestBody === 'string' ? requestBody : requestBody.toString('utf-8');\n \n let request: ChatKitReq;\n try {\n request = JSON.parse(requestStr) as ChatKitReq;\n } catch (e) {\n throw new Error('Invalid JSON request body');\n }\n\n this.logger.debug(`Processing ChatKit request: ${request.type}`);\n\n if (isStreamingReq(request)) {\n return {\n type: 'streaming',\n stream: () => this.processStreamingAsBytes(request, context),\n };\n } else {\n const result = await this.processNonStreaming(request, context);\n return {\n type: 'non_streaming',\n json: JSON.stringify(result),\n };\n }\n }\n\n /**\n * Convert streaming events to SSE bytes\n */\n private async *processStreamingAsBytes(request: StreamingReq, context: TContext): AsyncIterable<Uint8Array> {\n const encoder = new TextEncoder();\n try {\n for await (const event of this.processStreaming(request, context)) {\n this.logger.info(`ChatKit streaming event (${request.type}): ${event.type}`);\n const data = JSON.stringify(event);\n yield encoder.encode(`data: ${data}\\n\\n`);\n }\n } catch (error: any) {\n this.logger.error(`ChatKit streaming request failed (${request.type}): ${error?.stack || error}`);\n const errorEvent: ThreadStreamEvent = {\n type: 'error',\n error: {\n code: 'internal_error',\n message: error.message || 'An error occurred',\n },\n };\n yield encoder.encode(`data: ${JSON.stringify(errorEvent)}\\n\\n`);\n }\n }\n\n /**\n * Process streaming requests\n */\n private async *processStreaming(request: StreamingReq, context: TContext): AsyncIterable<ThreadStreamEvent> {\n switch (request.type) {\n case 'threads.create':\n yield* this.handleThreadsCreate(request.params, context, request.metadata);\n break;\n case 'threads.add_user_message':\n yield* this.handleThreadsAddUserMessage(request.params, context);\n break;\n case 'threads.add_client_tool_output':\n yield* this.handleThreadsAddClientToolOutput(request.params, context);\n break;\n case 'threads.retry_after_item':\n yield* this.handleThreadsRetryAfterItem(request.params, context);\n break;\n case 'threads.custom_action':\n yield* this.handleThreadsCustomAction(request.params, context);\n break;\n }\n }\n\n /**\n * Process non-streaming requests\n */\n private async processNonStreaming(request: NonStreamingReq, context: TContext): Promise<unknown> {\n switch (request.type) {\n case 'threads.get_by_id':\n return this.handleThreadsGetById(request.params, context);\n case 'threads.list':\n return this.handleThreadsList(request.params, context);\n case 'items.list':\n return this.handleItemsList(request.params, context);\n case 'items.feedback':\n return this.handleItemsFeedback(request.params, context);\n case 'attachments.create':\n return this.handleAttachmentsCreate(request.params, context);\n case 'attachments.delete':\n return this.handleAttachmentsDelete(request.params, context);\n case 'threads.update':\n return this.handleThreadsUpdate(request.params, context);\n case 'threads.delete':\n return this.handleThreadsDelete(request.params, context);\n }\n }\n\n // =========================================================================\n // Streaming Request Handlers\n // =========================================================================\n\n /**\n * Handle threads.create - Create a new thread and optionally respond to initial message\n */\n private async *handleThreadsCreate(\n params: ThreadCreateParams,\n context: TContext,\n metadata?: Record<string, unknown>,\n ): AsyncIterable<ThreadStreamEvent> {\n // Create new thread\n const threadId = this.store.generateThreadId(context);\n const now = nowTimestamp();\n const normalizedMetadata = this.normalizeThreadMetadata(metadata);\n const coordination = reconcilerCoordinationMetadata(\n normalizeReconcilerOwner(normalizedMetadata?.reconcilerOwner, 'client'),\n );\n \n const thread: ThreadMetadata = {\n id: threadId,\n parent: getThreadParent({ id: threadId })?.parent,\n status: { type: 'active' },\n workspace: this.resolveThreadWorkspace(params.workspace),\n ...coordination,\n created_at: now,\n updated_at: now,\n metadata: withReconcilerCoordinationMetadata(normalizedMetadata, coordination.reconcilerOwner),\n };\n\n await this.store.saveThread(thread, context);\n\n // Emit thread created event\n yield {\n type: 'thread.created',\n thread,\n } as ThreadCreatedEvent;\n\n // If input provided, add user message and respond\n if (params.input) {\n const threadRef = this.threadRefFromThread(thread);\n const userMessage = await this.createUserMessage(threadRef, params.input.content, context, thread);\n await this.store.addThreadItem(threadRef, userMessage, context);\n\n yield {\n type: 'thread.item.added',\n item: userMessage,\n } as ThreadItemAddedEvent;\n\n yield {\n type: 'thread.item.done',\n item: userMessage,\n } as ThreadItemDoneEvent;\n\n // Generate response (AI provider or Agent Runtime)\n yield* this.respond(thread, userMessage, context, params.input.inference_options);\n }\n }\n\n /**\n * Handle threads.add_user_message - Add a user message and respond\n */\n private async *handleThreadsAddUserMessage(\n params: ThreadAddUserMessageParams,\n context: TContext,\n ): AsyncIterable<ThreadStreamEvent> {\n const threadRef = this.threadRefFromParams(params);\n const thread = await this.store.loadThread(threadRef, context);\n\n // Create and save user message\n const userMessage = await this.createUserMessage(threadRef, params.input.content, context);\n await this.store.addThreadItem(threadRef, userMessage, context);\n\n yield {\n type: 'thread.item.added',\n item: userMessage,\n } as ThreadItemAddedEvent;\n\n yield {\n type: 'thread.item.done',\n item: userMessage,\n } as ThreadItemDoneEvent;\n\n // Generate response (AI provider or Agent Runtime)\n yield* this.respond(thread, userMessage, context, params.input.inference_options, threadRef);\n }\n\n /**\n * Handle threads.add_client_tool_output - Handle tool output (not fully implemented)\n */\n private async *handleThreadsAddClientToolOutput(\n params: ThreadAddClientToolOutputParams,\n context: TContext,\n ): AsyncIterable<ThreadStreamEvent> {\n const threadRef = this.threadRefFromParams(params);\n for await (\n const event of this.runStateCenter.completeClientToolOutput({\n threadRef,\n itemId: params.item_id,\n output: params.output,\n context,\n })\n ) {\n yield this.projectRunStateEvent(event);\n }\n }\n\n /**\n * Handle threads.retry_after_item - Retry generation after a specific item\n */\n private async *handleThreadsRetryAfterItem(\n params: ThreadRetryAfterItemParams,\n context: TContext,\n ): AsyncIterable<ThreadStreamEvent> {\n const threadRef = this.threadRefFromParams(params);\n const thread = await this.store.loadThread(threadRef, context);\n \n // Load all items and find the last user message before the retry point\n const items = await this.store.loadThreadItems(threadRef, undefined, 1000, 'asc', context);\n \n let lastUserMessage: UserMessageItem | undefined;\n for (const item of items.data) {\n if (item.id === params.item_id) {\n break;\n }\n if (item.type === 'user_message') {\n lastUserMessage = item;\n }\n }\n\n if (lastUserMessage) {\n yield* this.respond(thread, lastUserMessage, context, undefined, threadRef);\n }\n }\n\n /**\n * Handle threads.custom_action - Handle custom widget actions (not fully implemented)\n */\n private async *handleThreadsCustomAction(\n params: ThreadCustomActionParams,\n context: TContext,\n ): AsyncIterable<ThreadStreamEvent> {\n this.logger.info(`Custom action: ${params.action} on item ${params.item_id}`);\n // Custom actions can be implemented based on specific needs\n }\n\n // =========================================================================\n // Non-Streaming Request Handlers\n // =========================================================================\n\n /**\n * Handle threads.get_by_id\n */\n private async handleThreadsGetById(\n params: ThreadGetByIdParams,\n context: TContext,\n ): Promise<Thread> {\n const threadRef = this.threadRefFromParams(params);\n const thread = await this.store.loadThread(threadRef, context);\n const items = await this.store.loadThreadItems(threadRef, undefined, 50, 'asc', context);\n \n return {\n ...thread,\n items,\n };\n }\n\n /**\n * Handle threads.list\n */\n private async handleThreadsList(\n params: { limit?: number; order?: string; after?: string } | undefined,\n context: TContext,\n ): Promise<Page<ThreadMetadata>> {\n return this.store.loadThreads(\n params?.limit ?? 20,\n params?.after,\n params?.order ?? 'desc',\n context,\n );\n }\n\n /**\n * Handle items.list\n */\n private async handleItemsList(\n params: ItemsListParams,\n context: TContext,\n ): Promise<Page<ThreadItem>> {\n return this.store.loadThreadItems(\n this.threadRefFromParams(params),\n params.after,\n params.limit ?? 50,\n params.order ?? 'asc',\n context,\n );\n }\n\n /**\n * Handle items.feedback (acknowledge only for now)\n */\n private async handleItemsFeedback(\n params: ItemFeedbackParams,\n context: TContext,\n ): Promise<{ success: boolean }> {\n this.logger.info(`Feedback received: ${params.feedback} for items ${params.item_ids.join(', ')}`);\n // Store feedback in metadata or separate table if needed\n return { success: true };\n }\n\n /**\n * Handle attachments.create\n */\n private async handleAttachmentsCreate(\n params: { name: string; size: number; mime_type: string },\n context: TContext,\n ): Promise<{ attachment_id: string; upload_url?: string }> {\n const attachmentId = generateId('attach');\n // For now, return a placeholder - actual upload handling would need S3/MinIO integration\n return {\n attachment_id: attachmentId,\n // upload_url would be provided for actual file upload\n };\n }\n\n /**\n * Handle attachments.delete\n */\n private async handleAttachmentsDelete(\n params: { attachment_id: string },\n context: TContext,\n ): Promise<{ success: boolean }> {\n if (this.store.deleteAttachment) {\n await this.store.deleteAttachment(params.attachment_id, context);\n }\n return { success: true };\n }\n\n /**\n * Handle threads.update\n */\n private async handleThreadsUpdate(\n params: ThreadUpdateParams,\n context: TContext,\n ): Promise<ThreadMetadata> {\n const threadRef = this.threadRefFromParams(params);\n const thread = await this.store.loadThread(threadRef, context);\n \n if (params.title !== undefined) {\n thread.title = params.title;\n }\n if (params.workspace !== undefined) {\n thread.workspace = params.workspace || undefined;\n }\n thread.updated_at = nowTimestamp();\n\n await this.store.saveThread(thread, context);\n return thread;\n }\n\n /**\n * Handle threads.delete\n */\n private async handleThreadsDelete(\n params: ThreadDeleteParams,\n context: TContext,\n ): Promise<{ success: boolean }> {\n await this.store.deleteThread(this.threadRefFromParams(params), context);\n return { success: true };\n }\n\n // =========================================================================\n // Core Response Generation\n // =========================================================================\n\n /**\n * Generate AI response for a user message\n * This is the main response generation logic\n */\n private async *respond(\n thread: ThreadMetadata,\n userMessage: UserMessageItem,\n context: TContext,\n inferenceOptions?: any,\n threadRef: ThreadRef = this.threadRefFromThread(thread),\n ): AsyncIterable<ThreadStreamEvent> {\n const runtimeConfig = this.runStateCenter.getAgentRuntimeConfig(thread, context)\n ?? this.runStateCenter.getDefaultAgentRuntimeConfig(context);\n if (runtimeConfig) {\n for await (\n const event of this.runStateCenter.startAgentRun({\n thread,\n userMessage,\n context,\n runtimeConfig,\n })\n ) {\n yield this.projectRunStateEvent(event);\n }\n return;\n }\n\n if (!this.allowDirectAiFallback || !this.aiProvider) {\n yield {\n type: 'error',\n error: {\n code: 'runtime_required',\n message: 'Chat requires Agent Runtime; direct AI fallback is disabled',\n },\n };\n return;\n }\n\n // Build conversation history\n const messages = await this.buildConversationHistory(threadRef, context);\n \n // Create assistant message item\n const assistantItemId = this.store.generateItemId('assistant_message', thread, context);\n const assistantItem: AssistantMessageItem = {\n id: assistantItemId,\n thread_id: thread.id,\n type: 'assistant_message',\n content: [{ type: 'output_text', text: '' }],\n status: 'in_progress',\n created_at: nowTimestamp(),\n };\n\n await this.store.addThreadItem(threadRef, assistantItem, context);\n\n // Emit item added event\n yield {\n type: 'thread.item.added',\n item: assistantItem,\n } as ThreadItemAddedEvent;\n\n // Stream AI response\n let fullText = '';\n let partIndex = 0;\n\n try {\n for await (const chunk of this.aiProvider.streamResponse(messages, {\n model: inferenceOptions?.model,\n temperature: inferenceOptions?.temperature,\n maxTokens: inferenceOptions?.max_tokens,\n context, // Pass context for auth\n })) {\n fullText += chunk;\n\n // Emit text delta update\n yield {\n type: 'thread.item.updated',\n item_id: assistantItemId,\n update: {\n type: 'assistant_message.content_part.text_delta',\n part_index: partIndex,\n delta: chunk,\n },\n } as ThreadItemUpdatedEvent;\n }\n\n // Update item with full content\n assistantItem.content = [{ type: 'output_text', text: fullText }];\n assistantItem.status = 'completed';\n await this.store.saveItem(threadRef, assistantItem, context);\n\n // Emit item done event\n yield {\n type: 'thread.item.done',\n item: assistantItem,\n } as ThreadItemDoneEvent;\n } catch (error: any) {\n this.logger.error(`AI response generation failed: ${error}`);\n\n assistantItem.content = [{ type: 'output_text', text: 'Sorry, an error occurred while generating the response.' }];\n assistantItem.status = 'incomplete';\n await this.store.saveItem(threadRef, assistantItem, context);\n\n yield {\n type: 'thread.item.done',\n item: assistantItem,\n } as ThreadItemDoneEvent;\n\n yield {\n type: 'error',\n error: {\n code: 'generation_error',\n message: error.message || 'Failed to generate response',\n },\n };\n }\n\n // Auto-generate title if this is the first exchange (outside try/catch to not affect message saving)\n if (!thread.title) {\n try {\n const title = this.generateThreadTitle(userMessage, fullText);\n thread.title = title;\n thread.updated_at = nowTimestamp();\n await this.store.saveThread(thread, context);\n\n yield {\n type: 'thread.updated',\n thread,\n };\n } catch (titleError: any) {\n this.logger.warn(`Failed to auto-generate thread title: ${titleError.message}`);\n // Don't throw - title generation failure shouldn't affect the response\n }\n }\n }\n\n /**\n * Build conversation history from thread items\n */\n private async buildConversationHistory(\n thread: ThreadRef,\n context: TContext,\n ): Promise<Array<{ role: 'system' | 'user' | 'assistant'; content: string }>> {\n const messages: Array<{ role: 'system' | 'user' | 'assistant'; content: string }> = [];\n\n // Add system prompt\n messages.push({ role: 'system', content: this.systemPrompt });\n\n // Load thread items\n const items = await this.store.loadThreadItems(thread, undefined, 100, 'asc', context);\n\n for (const item of items.data) {\n if (item.type === 'user_message') {\n const text = extractUserMessageText(item.content);\n if (text) {\n messages.push({ role: 'user', content: text });\n }\n } else if (item.type === 'assistant_message') {\n const text = item.content\n .filter((c) => c.type === 'output_text')\n .map((c) => c.text)\n .join('\\n');\n if (text) {\n messages.push({ role: 'assistant', content: text });\n }\n }\n }\n\n return messages;\n }\n\n /**\n * Create a user message item\n */\n private async createUserMessage(\n threadRef: ThreadRef,\n content: UserMessageContent[],\n context: TContext,\n thread?: ThreadMetadata,\n ): Promise<UserMessageItem> {\n // Use provided thread or load it\n const threadMeta = thread || await this.store.loadThread(threadRef, context);\n const threadId = getThreadIdFromRef(threadRef);\n const itemId = this.store.generateItemId('user_message', threadMeta, context);\n\n return {\n id: itemId,\n thread_id: threadId,\n type: 'user_message',\n content,\n created_at: nowTimestamp(),\n };\n }\n\n /**\n * Generate a title for the thread based on the first exchange\n */\n private generateThreadTitle(userMessage: UserMessageItem, assistantResponse: string): string {\n const userText = extractUserMessageText(userMessage.content);\n // Use the first 50 chars of user message as title\n let title = userText.slice(0, 50);\n if (userText.length > 50) {\n title += '...';\n }\n return title || 'New Chat';\n }\n\n private projectRunStateEvent(event: RunStateEvent): ThreadStreamEvent {\n switch (event.type) {\n case 'item_added':\n return { type: 'thread.item.added', item: event.item } as ThreadItemAddedEvent;\n case 'item_updated':\n return {\n type: 'thread.item.updated',\n item_id: event.itemId,\n update: {\n type: 'assistant_message.content_part.text_delta',\n part_index: 0,\n delta: event.delta,\n },\n } as ThreadItemUpdatedEvent;\n case 'item_done':\n return { type: 'thread.item.done', item: event.item } as ThreadItemDoneEvent;\n case 'client_effect':\n return { type: 'client_effect', effect: event.effect };\n case 'error':\n return {\n type: 'error',\n error: {\n code: event.code,\n message: event.message,\n },\n };\n }\n }\n\n private normalizeThreadMetadata(\n metadata: Record<string, unknown> | undefined,\n ): Record<string, unknown> | undefined {\n const normalized = { ...(metadata ?? {}) };\n delete normalized.chat_id;\n delete normalized.surface_id;\n delete normalized.commandKind;\n delete normalized.conversationKind;\n const reconcilerOwner = normalizeReconcilerOwner(normalized.reconcilerOwner, 'client');\n return withReconcilerCoordinationMetadata(\n Object.keys(normalized).length > 0 ? normalized : undefined,\n reconcilerOwner,\n );\n }\n\n private resolveThreadWorkspace(workspace: WorkspaceRef | undefined): WorkspaceRef | undefined {\n return isWorkspaceRef(workspace) ? workspace : undefined;\n }\n\n private threadRefFromParams(params: { thread_id: string }): ThreadRef {\n return toThreadRef(params);\n }\n\n private threadRefFromThread(thread: ThreadMetadata): ThreadRef {\n return {\n thread_id: thread.id,\n };\n }\n}\n"]}
|
|
@@ -48,6 +48,7 @@ export declare class InMemoryStore<TContext = StoreContext> implements ChatKitSt
|
|
|
48
48
|
private getUserKey;
|
|
49
49
|
private getThreadKey;
|
|
50
50
|
private normalizeThreadId;
|
|
51
|
+
private stripThreadProtocolMetadata;
|
|
51
52
|
generateThreadId(_context: TContext): string;
|
|
52
53
|
generateItemId(itemType: StoreItemType, thread: ThreadMetadata, _context: TContext): string;
|
|
53
54
|
loadThread(thread: ThreadRef, context: TContext): Promise<ThreadMetadata>;
|
|
@@ -38,20 +38,30 @@ class InMemoryStore {
|
|
|
38
38
|
normalizeThreadId(thread) {
|
|
39
39
|
return (0, types_1.getThreadIdFromRef)(thread);
|
|
40
40
|
}
|
|
41
|
+
stripThreadProtocolMetadata(metadata) {
|
|
42
|
+
if (!metadata) {
|
|
43
|
+
return undefined;
|
|
44
|
+
}
|
|
45
|
+
const stripped = { ...metadata };
|
|
46
|
+
delete stripped.chat_id;
|
|
47
|
+
delete stripped.surface_id;
|
|
48
|
+
delete stripped.commandKind;
|
|
49
|
+
delete stripped.parent;
|
|
50
|
+
return Object.keys(stripped).length > 0 ? stripped : undefined;
|
|
51
|
+
}
|
|
41
52
|
// ID Generation
|
|
42
53
|
generateThreadId(_context) {
|
|
43
54
|
return `chat/default/index.ttl#${(0, types_1.generateId)('thread')}`;
|
|
44
55
|
}
|
|
45
56
|
generateItemId(itemType, thread, _context) {
|
|
46
|
-
const
|
|
47
|
-
const
|
|
48
|
-
|
|
49
|
-
: (typeof thread.metadata?.chat_id === 'string' ? thread.metadata.chat_id : 'default');
|
|
57
|
+
const parent = (0, types_1.getThreadParent)(thread);
|
|
58
|
+
const storageKind = parent?.kind ?? 'chat';
|
|
59
|
+
const storageKey = parent?.key ?? 'default';
|
|
50
60
|
const date = new Date();
|
|
51
61
|
const yyyy = String(date.getUTCFullYear());
|
|
52
62
|
const MM = String(date.getUTCMonth() + 1).padStart(2, '0');
|
|
53
63
|
const dd = String(date.getUTCDate()).padStart(2, '0');
|
|
54
|
-
return `${
|
|
64
|
+
return `${storageKind}/${storageKey}/${yyyy}/${MM}/${dd}/messages.ttl#${(0, types_1.generateId)(itemType)}`;
|
|
55
65
|
}
|
|
56
66
|
// Thread operations
|
|
57
67
|
async loadThread(thread, context) {
|
|
@@ -65,7 +75,12 @@ class InMemoryStore {
|
|
|
65
75
|
}
|
|
66
76
|
async saveThread(thread, context) {
|
|
67
77
|
const key = this.getThreadKey(thread.id, context);
|
|
68
|
-
this.threads.set(key, {
|
|
78
|
+
this.threads.set(key, {
|
|
79
|
+
...thread,
|
|
80
|
+
parent: thread.parent ?? (0, types_1.getThreadParent)(thread)?.parent,
|
|
81
|
+
metadata: this.stripThreadProtocolMetadata(thread.metadata),
|
|
82
|
+
updated_at: (0, types_1.nowTimestamp)(),
|
|
83
|
+
});
|
|
69
84
|
}
|
|
70
85
|
async loadThreads(limit, after, order, context) {
|
|
71
86
|
const userKey = this.getUserKey(context);
|
|
@@ -181,7 +196,7 @@ class InMemoryStore {
|
|
|
181
196
|
this.attachments.delete(attachmentId);
|
|
182
197
|
}
|
|
183
198
|
async saveRun(run, context) {
|
|
184
|
-
run.id = (0, store_1.buildRunResourceId)(run);
|
|
199
|
+
run.id = (0, store_1.buildRunResourceId)(run.id);
|
|
185
200
|
this.runs.set(this.getRunKey(run.id, context), { ...run });
|
|
186
201
|
}
|
|
187
202
|
async loadRun(runId, context) {
|
|
@@ -206,9 +221,6 @@ class InMemoryStore {
|
|
|
206
221
|
if (options.workspace) {
|
|
207
222
|
runs = runs.filter((run) => run.workspace === options.workspace);
|
|
208
223
|
}
|
|
209
|
-
if (options.commandKind) {
|
|
210
|
-
runs = runs.filter((run) => run.commandKind === options.commandKind);
|
|
211
|
-
}
|
|
212
224
|
if (options.status) {
|
|
213
225
|
runs = runs.filter((run) => run.status === options.status);
|
|
214
226
|
}
|
|
@@ -219,7 +231,7 @@ class InMemoryStore {
|
|
|
219
231
|
if (!(0, store_1.isRunResourceId)(event.runId)) {
|
|
220
232
|
throw new Error(`RunStep runId must be a complete Run resource id: ${event.runId}`);
|
|
221
233
|
}
|
|
222
|
-
event.id = (0, store_1.buildRunStepResourceId)(event);
|
|
234
|
+
event.id = (0, store_1.buildRunStepResourceId)(event.id);
|
|
223
235
|
const key = this.getRunKey(event.runId, context);
|
|
224
236
|
const events = this.runSteps.get(key) ?? [];
|
|
225
237
|
events.push({ ...event });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../../src/api/chatkit/store.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * ChatKit Store Interface\n * \n * Abstract interface for persisting threads and items.\n * Based on https://github.com/openai/chatkit-python/blob/main/chatkit/store.py\n */\n\nimport type {\n ThreadMetadata,\n ThreadRef,\n ThreadItem,\n Attachment,\n Page,\n StoreItemType,\n} from './types';\nimport { generateId, getThreadIdFromRef, nowTimestamp } from './types';\nimport {\n buildRunResourceId,\n buildRunStepResourceId,\n canClaimRun,\n isRunResourceId,\n type RunListOptions,\n type RunRecordData,\n type RunStepRecordData,\n type RunStore,\n} from '../runs/store';\nimport { buildTaskResourceId, type TaskListOptions, type TaskRecordData, type TaskStore } from '../tasks/store';\nimport {\n TASK_AUTH_CREDENTIAL_SERVICE,\n type TaskAuthBindingRepository,\n type TaskAuthCredentialRecord,\n} from '../tasks/TaskAuthBinding';\n\n/**\n * Context type for store operations (generic)\n */\nexport type StoreContext = Record<string, unknown>;\n\n/**\n * Abstract Store interface\n */\nexport interface ChatKitStore<TContext = StoreContext> extends Partial<RunStore<TContext>> {\n // ID Generation\n generateThreadId(context: TContext): string;\n generateItemId(itemType: StoreItemType, thread: ThreadMetadata, context: TContext): string;\n\n // Thread operations\n loadThread(thread: ThreadRef, context: TContext): Promise<ThreadMetadata>;\n saveThread(thread: ThreadMetadata, context: TContext): Promise<void>;\n loadThreads(limit: number, after: string | undefined, order: string, context: TContext): Promise<Page<ThreadMetadata>>;\n deleteThread(thread: ThreadRef, context: TContext): Promise<void>;\n\n // Thread Item operations\n loadThreadItems(thread: ThreadRef, after: string | undefined, limit: number, order: string, context: TContext): Promise<Page<ThreadItem>>;\n addThreadItem(thread: ThreadRef, item: ThreadItem, context: TContext): Promise<void>;\n saveItem(thread: ThreadRef, item: ThreadItem, context: TContext): Promise<void>;\n loadItem(thread: ThreadRef, itemId: string, context: TContext): Promise<ThreadItem>;\n deleteThreadItem(thread: ThreadRef, itemId: string, context: TContext): Promise<void>;\n\n // Attachment operations (optional)\n saveAttachment?(attachment: Attachment, context: TContext): Promise<void>;\n loadAttachment?(attachmentId: string, context: TContext): Promise<Attachment>;\n deleteAttachment?(attachmentId: string, context: TContext): Promise<void>;\n}\n\n/**\n * In-Memory Store Implementation\n * \n * Simple in-memory store for development and testing.\n * Data is lost when the server restarts.\n */\nexport class InMemoryStore<TContext = StoreContext> implements ChatKitStore<TContext>, TaskStore<TContext>, TaskAuthBindingRepository<TContext & StoreContext> {\n private threads: Map<string, ThreadMetadata> = new Map();\n private items: Map<string, Map<string, ThreadItem>> = new Map(); // threadId -> (itemId -> item)\n private attachments: Map<string, Attachment> = new Map();\n private runs: Map<string, RunRecordData> = new Map();\n private runSteps: Map<string, RunStepRecordData[]> = new Map();\n private tasks: Map<string, TaskRecordData> = new Map();\n private taskAuthCredentials: Map<string, TaskAuthCredentialRecord> = new Map();\n\n // Store per-user data using a key from context\n private getUserKey(context: TContext): string {\n const userId = (context as Record<string, unknown>).userId;\n return typeof userId === 'string' ? userId : 'default';\n }\n\n private getThreadKey(threadId: string, context: TContext): string {\n return `${this.getUserKey(context)}:${threadId}`;\n }\n\n private normalizeThreadId(thread: ThreadRef): string {\n return getThreadIdFromRef(thread);\n }\n\n // ID Generation\n generateThreadId(_context: TContext): string {\n return `chat/default/index.ttl#${generateId('thread')}`;\n }\n\n generateItemId(itemType: StoreItemType, thread: ThreadMetadata, _context: TContext): string {\n const commandKind = thread.metadata?.commandKind === 'task' ? 'task' : 'chat';\n const surfaceId = typeof thread.metadata?.surface_id === 'string'\n ? thread.metadata.surface_id\n : (typeof thread.metadata?.chat_id === 'string' ? thread.metadata.chat_id : 'default');\n const date = new Date();\n const yyyy = String(date.getUTCFullYear());\n const MM = String(date.getUTCMonth() + 1).padStart(2, '0');\n const dd = String(date.getUTCDate()).padStart(2, '0');\n return `${commandKind}/${surfaceId}/${yyyy}/${MM}/${dd}/messages.ttl#${generateId(itemType)}`;\n }\n\n // Thread operations\n async loadThread(thread: ThreadRef, context: TContext): Promise<ThreadMetadata> {\n const threadId = this.normalizeThreadId(thread);\n const key = this.getThreadKey(threadId, context);\n const threadData = this.threads.get(key);\n if (!threadData) {\n throw new Error(`Thread not found: ${threadId}`);\n }\n return threadData;\n }\n\n async saveThread(thread: ThreadMetadata, context: TContext): Promise<void> {\n const key = this.getThreadKey(thread.id, context);\n this.threads.set(key, { ...thread, updated_at: nowTimestamp() });\n }\n\n async loadThreads(limit: number, after: string | undefined, order: string, context: TContext): Promise<Page<ThreadMetadata>> {\n const userKey = this.getUserKey(context);\n const prefix = `${userKey}:`;\n \n // Get all threads for this user\n const userThreads: ThreadMetadata[] = [];\n for (const [key, thread] of this.threads) {\n if (key.startsWith(prefix)) {\n userThreads.push(thread);\n }\n }\n\n // Sort by created_at\n userThreads.sort((a, b) => {\n return order === 'desc' ? b.created_at - a.created_at : a.created_at - b.created_at;\n });\n\n // Apply pagination\n let startIndex = 0;\n if (after) {\n const afterIndex = userThreads.findIndex((t) => t.id === after);\n if (afterIndex !== -1) {\n startIndex = afterIndex + 1;\n }\n }\n\n const slice = userThreads.slice(startIndex, startIndex + limit);\n const hasMore = startIndex + limit < userThreads.length;\n\n return {\n data: slice,\n has_more: hasMore,\n after: slice.length > 0 ? slice[slice.length - 1].id : undefined,\n };\n }\n\n async deleteThread(thread: ThreadRef, context: TContext): Promise<void> {\n const threadId = this.normalizeThreadId(thread);\n const key = this.getThreadKey(threadId, context);\n this.threads.delete(key);\n this.items.delete(key);\n }\n\n // Thread Item operations\n async loadThreadItems(thread: ThreadRef, after: string | undefined, limit: number, order: string, context: TContext): Promise<Page<ThreadItem>> {\n const threadId = this.normalizeThreadId(thread);\n const key = this.getThreadKey(threadId, context);\n const threadItems = this.items.get(key);\n \n if (!threadItems) {\n return { data: [], has_more: false };\n }\n\n const itemList = Array.from(threadItems.values());\n \n // Sort by created_at\n itemList.sort((a, b) => {\n return order === 'desc' ? b.created_at - a.created_at : a.created_at - b.created_at;\n });\n\n // Apply pagination\n let startIndex = 0;\n if (after) {\n const afterIndex = itemList.findIndex((item) => item.id === after);\n if (afterIndex !== -1) {\n startIndex = afterIndex + 1;\n }\n }\n\n const slice = itemList.slice(startIndex, startIndex + limit);\n const hasMore = startIndex + limit < itemList.length;\n\n return {\n data: slice,\n has_more: hasMore,\n after: slice.length > 0 ? slice[slice.length - 1].id : undefined,\n };\n }\n\n async addThreadItem(thread: ThreadRef, item: ThreadItem, context: TContext): Promise<void> {\n const threadId = this.normalizeThreadId(thread);\n const key = this.getThreadKey(threadId, context);\n let threadItems = this.items.get(key);\n if (!threadItems) {\n threadItems = new Map();\n this.items.set(key, threadItems);\n }\n threadItems.set(item.id, item);\n }\n\n async saveItem(thread: ThreadRef, item: ThreadItem, context: TContext): Promise<void> {\n await this.addThreadItem(thread, item, context);\n }\n\n async loadItem(thread: ThreadRef, itemId: string, context: TContext): Promise<ThreadItem> {\n const threadId = this.normalizeThreadId(thread);\n const key = this.getThreadKey(threadId, context);\n const threadItems = this.items.get(key);\n if (!threadItems) {\n throw new Error(`Thread not found: ${threadId}`);\n }\n const item = threadItems.get(itemId);\n if (!item) {\n throw new Error(`Item not found: ${itemId}`);\n }\n return item;\n }\n\n async deleteThreadItem(thread: ThreadRef, itemId: string, context: TContext): Promise<void> {\n const threadId = this.normalizeThreadId(thread);\n const key = this.getThreadKey(threadId, context);\n const threadItems = this.items.get(key);\n if (threadItems) {\n threadItems.delete(itemId);\n }\n }\n\n // Attachment operations\n async saveAttachment(attachment: Attachment, _context: TContext): Promise<void> {\n this.attachments.set(attachment.id, attachment);\n }\n\n async loadAttachment(attachmentId: string, _context: TContext): Promise<Attachment> {\n const attachment = this.attachments.get(attachmentId);\n if (!attachment) {\n throw new Error(`Attachment not found: ${attachmentId}`);\n }\n return attachment;\n }\n\n async deleteAttachment(attachmentId: string, _context: TContext): Promise<void> {\n this.attachments.delete(attachmentId);\n }\n\n async saveRun(run: RunRecordData, context: TContext): Promise<void> {\n run.id = buildRunResourceId(run);\n this.runs.set(this.getRunKey(run.id, context), { ...run });\n }\n\n async loadRun(runId: string, context: TContext): Promise<RunRecordData> {\n const run = this.runs.get(this.getRunKey(runId, context));\n if (!run) {\n throw new Error(`Run not found: ${runId}`);\n }\n return { ...run };\n }\n\n async listRuns(options: RunListOptions, context: TContext): Promise<RunRecordData[]> {\n const userKey = this.getUserKey(context);\n const prefix = `${userKey}:`;\n let runs = Array.from(this.runs.entries())\n .filter(([key]) => key.startsWith(prefix))\n .map(([, run]) => ({ ...run }));\n\n if (options.task) {\n runs = runs.filter((run) => run.task === options.task);\n }\n if (options.thread) {\n runs = runs.filter((run) => run.thread === options.thread);\n }\n if (options.workspace) {\n runs = runs.filter((run) => run.workspace === options.workspace);\n }\n if (options.commandKind) {\n runs = runs.filter((run) => run.commandKind === options.commandKind);\n }\n if (options.status) {\n runs = runs.filter((run) => run.status === options.status);\n }\n\n runs.sort((a, b) => b.createdAt - a.createdAt || b.id.localeCompare(a.id));\n return runs.slice(0, options.limit ?? runs.length);\n }\n\n async appendRunStep(event: RunStepRecordData, context: TContext): Promise<void> {\n if (!isRunResourceId(event.runId)) {\n throw new Error(`RunStep runId must be a complete Run resource id: ${event.runId}`);\n }\n event.id = buildRunStepResourceId(event);\n const key = this.getRunKey(event.runId, context);\n const events = this.runSteps.get(key) ?? [];\n events.push({ ...event });\n this.runSteps.set(key, events);\n }\n\n async loadRunSteps(runId: string, context: TContext): Promise<RunStepRecordData[]> {\n return [...(this.runSteps.get(this.getRunKey(runId, context)) ?? [])];\n }\n\n async claimRun(input: {\n runId: string;\n leaseOwner: string;\n leaseExpiresAt: number;\n now: number;\n }, context: TContext): Promise<RunRecordData | undefined> {\n const key = this.getRunKey(input.runId, context);\n const run = this.runs.get(key);\n if (!run || !canClaimRun(run, input)) {\n return undefined;\n }\n const claimed = {\n ...run,\n leaseOwner: input.leaseOwner,\n leaseExpiresAt: input.leaseExpiresAt,\n heartbeatAt: input.now,\n updatedAt: input.now,\n };\n this.runs.set(key, claimed);\n return { ...claimed };\n }\n\n async saveTask(task: TaskRecordData, context: TContext): Promise<void> {\n task.id = buildTaskResourceId(task.id);\n this.tasks.set(this.getTaskKey(task.id, context), {\n ...task,\n metadata: this.withAuthBindingMetadata(task.metadata, task.authBinding),\n });\n }\n\n async loadTask(taskId: string, context: TContext): Promise<TaskRecordData> {\n const task = this.tasks.get(this.getTaskKey(taskId, context));\n if (!task) {\n throw new Error(`Task not found: ${taskId}`);\n }\n return { ...task };\n }\n\n async listTasks(options: TaskListOptions, context: TContext): Promise<TaskRecordData[]> {\n const userKey = this.getUserKey(context);\n const prefix = `${userKey}:`;\n const dueAt = options.dueAt ?? nowTimestamp();\n let tasks = Array.from(this.tasks.entries())\n .filter(([key]) => key.startsWith(prefix))\n .map(([, task]) => ({ ...task }));\n\n if (options.status) {\n tasks = tasks.filter((task) => task.status === options.status);\n }\n if (options.triggerKind) {\n tasks = tasks.filter((task) => task.triggerKind === options.triggerKind);\n }\n if (options.eventName) {\n tasks = tasks.filter((task) => task.eventName === options.eventName);\n }\n if (typeof options.dueAt === 'number') {\n tasks = tasks.filter((task) => typeof task.nextRunAt === 'number' && task.nextRunAt <= dueAt);\n }\n\n tasks.sort((a, b) => (a.nextRunAt ?? a.createdAt) - (b.nextRunAt ?? b.createdAt) || a.id.localeCompare(b.id));\n return tasks.slice(0, options.limit ?? tasks.length);\n }\n\n async saveTaskAuthCredential(input: {\n id: string;\n apiKey: string;\n displayName?: string;\n expiresAt?: number;\n }, context: TContext & StoreContext): Promise<TaskAuthCredentialRecord> {\n const record: TaskAuthCredentialRecord = {\n id: input.id,\n service: TASK_AUTH_CREDENTIAL_SERVICE,\n status: 'active',\n apiKey: input.apiKey,\n label: input.displayName,\n oauthExpiresAt: input.expiresAt ? new Date(input.expiresAt * 1000).toISOString() : undefined,\n createdAt: new Date().toISOString(),\n };\n this.taskAuthCredentials.set(this.getTaskAuthCredentialKey(input.id, context), record);\n return { ...record };\n }\n\n async loadTaskAuthCredential(id: string, context: TContext & StoreContext): Promise<TaskAuthCredentialRecord | undefined> {\n const record = this.taskAuthCredentials.get(this.getTaskAuthCredentialKey(id, context));\n return record ? { ...record } : undefined;\n }\n\n private withAuthBindingMetadata(\n metadata: Record<string, unknown> | undefined,\n authBinding: TaskRecordData['authBinding'],\n ): Record<string, unknown> | undefined {\n if (!authBinding) {\n return metadata;\n }\n return {\n ...(metadata ?? {}),\n authBinding,\n };\n }\n\n // Utility methods for debugging\n getStats(): { threads: number; items: number; attachments: number } {\n let totalItems = 0;\n for (const threadItems of this.items.values()) {\n totalItems += threadItems.size;\n }\n return {\n threads: this.threads.size,\n items: totalItems,\n attachments: this.attachments.size,\n };\n }\n\n clear(): void {\n this.threads.clear();\n this.items.clear();\n this.attachments.clear();\n this.runs.clear();\n this.runSteps.clear();\n this.tasks.clear();\n this.taskAuthCredentials.clear();\n }\n\n private getRunKey(runId: string, context: TContext): string {\n return `${this.getUserKey(context)}:${runId}`;\n }\n\n private getTaskKey(taskId: string, context: TContext): string {\n return `${this.getUserKey(context)}:${taskId}`;\n }\n\n private getTaskAuthCredentialKey(id: string, context: TContext): string {\n return `${this.getUserKey(context)}:${id}`;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../../src/api/chatkit/store.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * ChatKit Store Interface\n * \n * Abstract interface for persisting threads and items.\n * Based on https://github.com/openai/chatkit-python/blob/main/chatkit/store.py\n */\n\nimport type {\n ThreadMetadata,\n ThreadRef,\n ThreadItem,\n Attachment,\n Page,\n StoreItemType,\n} from './types';\nimport { generateId, getThreadIdFromRef, getThreadParent, nowTimestamp } from './types';\nimport {\n buildRunResourceId,\n buildRunStepResourceId,\n canClaimRun,\n isRunResourceId,\n type RunListOptions,\n type RunRecordData,\n type RunStepRecordData,\n type RunStore,\n} from '../runs/store';\nimport { buildTaskResourceId, type TaskListOptions, type TaskRecordData, type TaskStore } from '../tasks/store';\nimport {\n TASK_AUTH_CREDENTIAL_SERVICE,\n type TaskAuthBindingRepository,\n type TaskAuthCredentialRecord,\n} from '../tasks/TaskAuthBinding';\n\n/**\n * Context type for store operations (generic)\n */\nexport type StoreContext = Record<string, unknown>;\n\n/**\n * Abstract Store interface\n */\nexport interface ChatKitStore<TContext = StoreContext> extends Partial<RunStore<TContext>> {\n // ID Generation\n generateThreadId(context: TContext): string;\n generateItemId(itemType: StoreItemType, thread: ThreadMetadata, context: TContext): string;\n\n // Thread operations\n loadThread(thread: ThreadRef, context: TContext): Promise<ThreadMetadata>;\n saveThread(thread: ThreadMetadata, context: TContext): Promise<void>;\n loadThreads(limit: number, after: string | undefined, order: string, context: TContext): Promise<Page<ThreadMetadata>>;\n deleteThread(thread: ThreadRef, context: TContext): Promise<void>;\n\n // Thread Item operations\n loadThreadItems(thread: ThreadRef, after: string | undefined, limit: number, order: string, context: TContext): Promise<Page<ThreadItem>>;\n addThreadItem(thread: ThreadRef, item: ThreadItem, context: TContext): Promise<void>;\n saveItem(thread: ThreadRef, item: ThreadItem, context: TContext): Promise<void>;\n loadItem(thread: ThreadRef, itemId: string, context: TContext): Promise<ThreadItem>;\n deleteThreadItem(thread: ThreadRef, itemId: string, context: TContext): Promise<void>;\n\n // Attachment operations (optional)\n saveAttachment?(attachment: Attachment, context: TContext): Promise<void>;\n loadAttachment?(attachmentId: string, context: TContext): Promise<Attachment>;\n deleteAttachment?(attachmentId: string, context: TContext): Promise<void>;\n}\n\n/**\n * In-Memory Store Implementation\n * \n * Simple in-memory store for development and testing.\n * Data is lost when the server restarts.\n */\nexport class InMemoryStore<TContext = StoreContext> implements ChatKitStore<TContext>, TaskStore<TContext>, TaskAuthBindingRepository<TContext & StoreContext> {\n private threads: Map<string, ThreadMetadata> = new Map();\n private items: Map<string, Map<string, ThreadItem>> = new Map(); // threadId -> (itemId -> item)\n private attachments: Map<string, Attachment> = new Map();\n private runs: Map<string, RunRecordData> = new Map();\n private runSteps: Map<string, RunStepRecordData[]> = new Map();\n private tasks: Map<string, TaskRecordData> = new Map();\n private taskAuthCredentials: Map<string, TaskAuthCredentialRecord> = new Map();\n\n // Store per-user data using a key from context\n private getUserKey(context: TContext): string {\n const userId = (context as Record<string, unknown>).userId;\n return typeof userId === 'string' ? userId : 'default';\n }\n\n private getThreadKey(threadId: string, context: TContext): string {\n return `${this.getUserKey(context)}:${threadId}`;\n }\n\n private normalizeThreadId(thread: ThreadRef): string {\n return getThreadIdFromRef(thread);\n }\n\n private stripThreadProtocolMetadata(metadata: Record<string, unknown> | undefined): Record<string, unknown> | undefined {\n if (!metadata) {\n return undefined;\n }\n const stripped = { ...metadata };\n delete stripped.chat_id;\n delete stripped.surface_id;\n delete stripped.commandKind;\n delete stripped.parent;\n return Object.keys(stripped).length > 0 ? stripped : undefined;\n }\n\n // ID Generation\n generateThreadId(_context: TContext): string {\n return `chat/default/index.ttl#${generateId('thread')}`;\n }\n\n generateItemId(itemType: StoreItemType, thread: ThreadMetadata, _context: TContext): string {\n const parent = getThreadParent(thread);\n const storageKind = parent?.kind ?? 'chat';\n const storageKey = parent?.key ?? 'default';\n const date = new Date();\n const yyyy = String(date.getUTCFullYear());\n const MM = String(date.getUTCMonth() + 1).padStart(2, '0');\n const dd = String(date.getUTCDate()).padStart(2, '0');\n return `${storageKind}/${storageKey}/${yyyy}/${MM}/${dd}/messages.ttl#${generateId(itemType)}`;\n }\n\n // Thread operations\n async loadThread(thread: ThreadRef, context: TContext): Promise<ThreadMetadata> {\n const threadId = this.normalizeThreadId(thread);\n const key = this.getThreadKey(threadId, context);\n const threadData = this.threads.get(key);\n if (!threadData) {\n throw new Error(`Thread not found: ${threadId}`);\n }\n return threadData;\n }\n\n async saveThread(thread: ThreadMetadata, context: TContext): Promise<void> {\n const key = this.getThreadKey(thread.id, context);\n this.threads.set(key, {\n ...thread,\n parent: thread.parent ?? getThreadParent(thread)?.parent,\n metadata: this.stripThreadProtocolMetadata(thread.metadata),\n updated_at: nowTimestamp(),\n });\n }\n\n async loadThreads(limit: number, after: string | undefined, order: string, context: TContext): Promise<Page<ThreadMetadata>> {\n const userKey = this.getUserKey(context);\n const prefix = `${userKey}:`;\n \n // Get all threads for this user\n const userThreads: ThreadMetadata[] = [];\n for (const [key, thread] of this.threads) {\n if (key.startsWith(prefix)) {\n userThreads.push(thread);\n }\n }\n\n // Sort by created_at\n userThreads.sort((a, b) => {\n return order === 'desc' ? b.created_at - a.created_at : a.created_at - b.created_at;\n });\n\n // Apply pagination\n let startIndex = 0;\n if (after) {\n const afterIndex = userThreads.findIndex((t) => t.id === after);\n if (afterIndex !== -1) {\n startIndex = afterIndex + 1;\n }\n }\n\n const slice = userThreads.slice(startIndex, startIndex + limit);\n const hasMore = startIndex + limit < userThreads.length;\n\n return {\n data: slice,\n has_more: hasMore,\n after: slice.length > 0 ? slice[slice.length - 1].id : undefined,\n };\n }\n\n async deleteThread(thread: ThreadRef, context: TContext): Promise<void> {\n const threadId = this.normalizeThreadId(thread);\n const key = this.getThreadKey(threadId, context);\n this.threads.delete(key);\n this.items.delete(key);\n }\n\n // Thread Item operations\n async loadThreadItems(thread: ThreadRef, after: string | undefined, limit: number, order: string, context: TContext): Promise<Page<ThreadItem>> {\n const threadId = this.normalizeThreadId(thread);\n const key = this.getThreadKey(threadId, context);\n const threadItems = this.items.get(key);\n \n if (!threadItems) {\n return { data: [], has_more: false };\n }\n\n const itemList = Array.from(threadItems.values());\n \n // Sort by created_at\n itemList.sort((a, b) => {\n return order === 'desc' ? b.created_at - a.created_at : a.created_at - b.created_at;\n });\n\n // Apply pagination\n let startIndex = 0;\n if (after) {\n const afterIndex = itemList.findIndex((item) => item.id === after);\n if (afterIndex !== -1) {\n startIndex = afterIndex + 1;\n }\n }\n\n const slice = itemList.slice(startIndex, startIndex + limit);\n const hasMore = startIndex + limit < itemList.length;\n\n return {\n data: slice,\n has_more: hasMore,\n after: slice.length > 0 ? slice[slice.length - 1].id : undefined,\n };\n }\n\n async addThreadItem(thread: ThreadRef, item: ThreadItem, context: TContext): Promise<void> {\n const threadId = this.normalizeThreadId(thread);\n const key = this.getThreadKey(threadId, context);\n let threadItems = this.items.get(key);\n if (!threadItems) {\n threadItems = new Map();\n this.items.set(key, threadItems);\n }\n threadItems.set(item.id, item);\n }\n\n async saveItem(thread: ThreadRef, item: ThreadItem, context: TContext): Promise<void> {\n await this.addThreadItem(thread, item, context);\n }\n\n async loadItem(thread: ThreadRef, itemId: string, context: TContext): Promise<ThreadItem> {\n const threadId = this.normalizeThreadId(thread);\n const key = this.getThreadKey(threadId, context);\n const threadItems = this.items.get(key);\n if (!threadItems) {\n throw new Error(`Thread not found: ${threadId}`);\n }\n const item = threadItems.get(itemId);\n if (!item) {\n throw new Error(`Item not found: ${itemId}`);\n }\n return item;\n }\n\n async deleteThreadItem(thread: ThreadRef, itemId: string, context: TContext): Promise<void> {\n const threadId = this.normalizeThreadId(thread);\n const key = this.getThreadKey(threadId, context);\n const threadItems = this.items.get(key);\n if (threadItems) {\n threadItems.delete(itemId);\n }\n }\n\n // Attachment operations\n async saveAttachment(attachment: Attachment, _context: TContext): Promise<void> {\n this.attachments.set(attachment.id, attachment);\n }\n\n async loadAttachment(attachmentId: string, _context: TContext): Promise<Attachment> {\n const attachment = this.attachments.get(attachmentId);\n if (!attachment) {\n throw new Error(`Attachment not found: ${attachmentId}`);\n }\n return attachment;\n }\n\n async deleteAttachment(attachmentId: string, _context: TContext): Promise<void> {\n this.attachments.delete(attachmentId);\n }\n\n async saveRun(run: RunRecordData, context: TContext): Promise<void> {\n run.id = buildRunResourceId(run.id);\n this.runs.set(this.getRunKey(run.id, context), { ...run });\n }\n\n async loadRun(runId: string, context: TContext): Promise<RunRecordData> {\n const run = this.runs.get(this.getRunKey(runId, context));\n if (!run) {\n throw new Error(`Run not found: ${runId}`);\n }\n return { ...run };\n }\n\n async listRuns(options: RunListOptions, context: TContext): Promise<RunRecordData[]> {\n const userKey = this.getUserKey(context);\n const prefix = `${userKey}:`;\n let runs = Array.from(this.runs.entries())\n .filter(([key]) => key.startsWith(prefix))\n .map(([, run]) => ({ ...run }));\n\n if (options.task) {\n runs = runs.filter((run) => run.task === options.task);\n }\n if (options.thread) {\n runs = runs.filter((run) => run.thread === options.thread);\n }\n if (options.workspace) {\n runs = runs.filter((run) => run.workspace === options.workspace);\n }\n if (options.status) {\n runs = runs.filter((run) => run.status === options.status);\n }\n\n runs.sort((a, b) => b.createdAt - a.createdAt || b.id.localeCompare(a.id));\n return runs.slice(0, options.limit ?? runs.length);\n }\n\n async appendRunStep(event: RunStepRecordData, context: TContext): Promise<void> {\n if (!isRunResourceId(event.runId)) {\n throw new Error(`RunStep runId must be a complete Run resource id: ${event.runId}`);\n }\n event.id = buildRunStepResourceId(event.id);\n const key = this.getRunKey(event.runId, context);\n const events = this.runSteps.get(key) ?? [];\n events.push({ ...event });\n this.runSteps.set(key, events);\n }\n\n async loadRunSteps(runId: string, context: TContext): Promise<RunStepRecordData[]> {\n return [...(this.runSteps.get(this.getRunKey(runId, context)) ?? [])];\n }\n\n async claimRun(input: {\n runId: string;\n leaseOwner: string;\n leaseExpiresAt: number;\n now: number;\n }, context: TContext): Promise<RunRecordData | undefined> {\n const key = this.getRunKey(input.runId, context);\n const run = this.runs.get(key);\n if (!run || !canClaimRun(run, input)) {\n return undefined;\n }\n const claimed = {\n ...run,\n leaseOwner: input.leaseOwner,\n leaseExpiresAt: input.leaseExpiresAt,\n heartbeatAt: input.now,\n updatedAt: input.now,\n };\n this.runs.set(key, claimed);\n return { ...claimed };\n }\n\n async saveTask(task: TaskRecordData, context: TContext): Promise<void> {\n task.id = buildTaskResourceId(task.id);\n this.tasks.set(this.getTaskKey(task.id, context), {\n ...task,\n metadata: this.withAuthBindingMetadata(task.metadata, task.authBinding),\n });\n }\n\n async loadTask(taskId: string, context: TContext): Promise<TaskRecordData> {\n const task = this.tasks.get(this.getTaskKey(taskId, context));\n if (!task) {\n throw new Error(`Task not found: ${taskId}`);\n }\n return { ...task };\n }\n\n async listTasks(options: TaskListOptions, context: TContext): Promise<TaskRecordData[]> {\n const userKey = this.getUserKey(context);\n const prefix = `${userKey}:`;\n const dueAt = options.dueAt ?? nowTimestamp();\n let tasks = Array.from(this.tasks.entries())\n .filter(([key]) => key.startsWith(prefix))\n .map(([, task]) => ({ ...task }));\n\n if (options.status) {\n tasks = tasks.filter((task) => task.status === options.status);\n }\n if (options.triggerKind) {\n tasks = tasks.filter((task) => task.triggerKind === options.triggerKind);\n }\n if (options.eventName) {\n tasks = tasks.filter((task) => task.eventName === options.eventName);\n }\n if (typeof options.dueAt === 'number') {\n tasks = tasks.filter((task) => typeof task.nextRunAt === 'number' && task.nextRunAt <= dueAt);\n }\n\n tasks.sort((a, b) => (a.nextRunAt ?? a.createdAt) - (b.nextRunAt ?? b.createdAt) || a.id.localeCompare(b.id));\n return tasks.slice(0, options.limit ?? tasks.length);\n }\n\n async saveTaskAuthCredential(input: {\n id: string;\n apiKey: string;\n displayName?: string;\n expiresAt?: number;\n }, context: TContext & StoreContext): Promise<TaskAuthCredentialRecord> {\n const record: TaskAuthCredentialRecord = {\n id: input.id,\n service: TASK_AUTH_CREDENTIAL_SERVICE,\n status: 'active',\n apiKey: input.apiKey,\n label: input.displayName,\n oauthExpiresAt: input.expiresAt ? new Date(input.expiresAt * 1000).toISOString() : undefined,\n createdAt: new Date().toISOString(),\n };\n this.taskAuthCredentials.set(this.getTaskAuthCredentialKey(input.id, context), record);\n return { ...record };\n }\n\n async loadTaskAuthCredential(id: string, context: TContext & StoreContext): Promise<TaskAuthCredentialRecord | undefined> {\n const record = this.taskAuthCredentials.get(this.getTaskAuthCredentialKey(id, context));\n return record ? { ...record } : undefined;\n }\n\n private withAuthBindingMetadata(\n metadata: Record<string, unknown> | undefined,\n authBinding: TaskRecordData['authBinding'],\n ): Record<string, unknown> | undefined {\n if (!authBinding) {\n return metadata;\n }\n return {\n ...(metadata ?? {}),\n authBinding,\n };\n }\n\n // Utility methods for debugging\n getStats(): { threads: number; items: number; attachments: number } {\n let totalItems = 0;\n for (const threadItems of this.items.values()) {\n totalItems += threadItems.size;\n }\n return {\n threads: this.threads.size,\n items: totalItems,\n attachments: this.attachments.size,\n };\n }\n\n clear(): void {\n this.threads.clear();\n this.items.clear();\n this.attachments.clear();\n this.runs.clear();\n this.runSteps.clear();\n this.tasks.clear();\n this.taskAuthCredentials.clear();\n }\n\n private getRunKey(runId: string, context: TContext): string {\n return `${this.getUserKey(context)}:${runId}`;\n }\n\n private getTaskKey(taskId: string, context: TContext): string {\n return `${this.getUserKey(context)}:${taskId}`;\n }\n\n private getTaskAuthCredentialKey(id: string, context: TContext): string {\n return `${this.getUserKey(context)}:${id}`;\n }\n}\n"]}
|
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
* Type definitions for OpenAI ChatKit protocol.
|
|
5
5
|
* Based on https://github.com/openai/chatkit-python
|
|
6
6
|
*/
|
|
7
|
+
import type { ReconcilerOwner } from '../reconciler';
|
|
7
8
|
import type { WorkspaceRef } from '../workspace/types';
|
|
8
9
|
export interface Page<T> {
|
|
9
10
|
data: T[];
|
|
@@ -24,6 +25,12 @@ export interface ClosedStatus {
|
|
|
24
25
|
export type ThreadStatus = ActiveStatus | LockedStatus | ClosedStatus;
|
|
25
26
|
export interface ThreadMetadata {
|
|
26
27
|
id: string;
|
|
28
|
+
/**
|
|
29
|
+
* RDF Thread owner relation (`sioc:has_parent`).
|
|
30
|
+
* Chat parent: `chat/{chatKey}/index.ttl#this`.
|
|
31
|
+
* Task parent: `task/index.ttl#{taskKey}`.
|
|
32
|
+
*/
|
|
33
|
+
parent?: string;
|
|
27
34
|
title?: string;
|
|
28
35
|
status: ThreadStatus;
|
|
29
36
|
/**
|
|
@@ -31,6 +38,8 @@ export interface ThreadMetadata {
|
|
|
31
38
|
* The Solid schema stores this as the `workspace` RDF relation.
|
|
32
39
|
*/
|
|
33
40
|
workspace?: WorkspaceRef;
|
|
41
|
+
/** Runtime coordination owner for this Thread; not a durable conversation topology field. */
|
|
42
|
+
reconcilerOwner?: ReconcilerOwner;
|
|
34
43
|
created_at: number;
|
|
35
44
|
updated_at: number;
|
|
36
45
|
metadata?: Record<string, unknown>;
|
|
@@ -38,25 +47,24 @@ export interface ThreadMetadata {
|
|
|
38
47
|
export interface Thread extends ThreadMetadata {
|
|
39
48
|
items: Page<ThreadItem>;
|
|
40
49
|
}
|
|
41
|
-
export declare const DEFAULT_THREAD_CHAT_ID = "default";
|
|
42
50
|
export type HttpResource = `http://${string}` | `https://${string}`;
|
|
43
|
-
export interface
|
|
51
|
+
export interface ThreadRef {
|
|
44
52
|
thread_id: string;
|
|
45
|
-
chat_id: string;
|
|
46
53
|
}
|
|
47
|
-
export interface
|
|
48
|
-
|
|
49
|
-
|
|
54
|
+
export interface ThreadParentRef {
|
|
55
|
+
kind: 'chat' | 'task';
|
|
56
|
+
key: string;
|
|
57
|
+
parent: string;
|
|
50
58
|
}
|
|
51
|
-
export type ThreadRef = ThreadSurfaceRef | ThreadResourceRef;
|
|
52
59
|
export declare function isHttpResource(value: string): value is HttpResource;
|
|
53
60
|
export declare function isBaseRelativeThreadResourceId(value: string): boolean;
|
|
54
61
|
export declare function toThreadRef(params: {
|
|
55
62
|
thread_id: string;
|
|
56
|
-
chat_id?: string;
|
|
57
63
|
}): ThreadRef;
|
|
58
64
|
export declare function getThreadIdFromRef(thread: ThreadRef): string;
|
|
59
|
-
export declare function
|
|
65
|
+
export declare function threadParentFromThreadId(threadId: string): ThreadParentRef | undefined;
|
|
66
|
+
export declare function threadParentFromParentRef(parent: string | undefined): ThreadParentRef | undefined;
|
|
67
|
+
export declare function getThreadParent(thread: Pick<ThreadMetadata, 'id' | 'parent'>): ThreadParentRef | undefined;
|
|
60
68
|
export interface ThreadItemBase {
|
|
61
69
|
id: string;
|
|
62
70
|
thread_id: string;
|
|
@@ -236,7 +244,6 @@ export interface ThreadsGetByIdReq extends BaseReq {
|
|
|
236
244
|
params: ThreadGetByIdParams;
|
|
237
245
|
}
|
|
238
246
|
export interface ThreadCreateParams {
|
|
239
|
-
chat_id?: string;
|
|
240
247
|
workspace?: WorkspaceRef;
|
|
241
248
|
input?: UserMessageInput;
|
|
242
249
|
}
|