@assistant-ui/react
Version:
React components for AI chat.
1 lines • 8.27 kB
Source Map (JSON)
{"version":3,"sources":["../../../src/runtimes/local/LocalThreadListRuntimeCore.tsx"],"sourcesContent":["import type { Unsubscribe } from \"../../types\";\nimport {\n ThreadListMetadata,\n ThreadListRuntimeCore,\n} from \"../core/ThreadListRuntimeCore\";\nimport { ExportedMessageRepository } from \"../utils/MessageRepository\";\nimport { generateId } from \"../../utils/idUtils\";\nimport { LocalThreadRuntimeCore } from \"./LocalThreadRuntimeCore\";\n\nexport type LocalThreadData = {\n data: ExportedMessageRepository;\n metadata: ThreadListMetadata;\n isArchived: boolean;\n};\n\nexport type LocalThreadFactory = (\n threadId: string,\n data: ExportedMessageRepository,\n) => LocalThreadRuntimeCore;\n\nexport class LocalThreadListRuntimeCore implements ThreadListRuntimeCore {\n private _threadData = new Map<string, LocalThreadData>();\n\n private _threads: readonly ThreadListMetadata[] = [];\n private _archivedThreads: readonly ThreadListMetadata[] = [];\n\n public get threads() {\n return this._threads;\n }\n\n public get archivedThreads() {\n return this._archivedThreads;\n }\n\n private _mainThread: LocalThreadRuntimeCore;\n\n public get mainThread(): LocalThreadRuntimeCore {\n return this._mainThread;\n }\n\n constructor(private _threadFactory: LocalThreadFactory) {\n const threadId = generateId();\n this._threadData.set(threadId, {\n data: { messages: [] },\n metadata: { threadId },\n isArchived: false,\n });\n this._threads = [{ threadId }];\n this._mainThread = this._threadFactory(threadId, { messages: [] });\n }\n\n public getThreadMetadataById(threadId: string) {\n return this._threadData.get(threadId)?.metadata;\n }\n\n public switchToThread(threadId: string): void {\n if (this._mainThread.threadId === threadId) return;\n\n const data = this._threadData.get(threadId);\n if (!data) throw new Error(\"Thread not found\");\n\n const thread = this._threadFactory(threadId, data.data);\n this._performThreadSwitch(thread);\n }\n\n public switchToNewThread(): void {\n const threadId = generateId();\n this._threadData.set(threadId, {\n data: { messages: [] },\n metadata: { threadId },\n isArchived: false,\n });\n this._threads = [{ threadId }];\n const thread = this._threadFactory(threadId, { messages: [] });\n this._performThreadSwitch(thread);\n }\n\n private _performThreadSwitch(newThreadCore: LocalThreadRuntimeCore) {\n const data = this._threadData.get(this._mainThread.threadId);\n if (!data) throw new Error(\"Thread not found\");\n\n const exprt = this._mainThread.export();\n data.data = exprt;\n\n this._mainThread._notifyEventSubscribers(\"switched-away\");\n this._mainThread = newThreadCore;\n newThreadCore._notifyEventSubscribers(\"switched-to\");\n\n this._notifySubscribers();\n }\n\n private _performMoveOp(\n threadId: string,\n operation: \"archive\" | \"unarchive\" | \"delete\",\n ) {\n const data = this._threadData.get(threadId);\n if (!data) throw new Error(\"Thread not found\");\n\n if (operation === \"archive\" && data.isArchived) return;\n if (operation === \"unarchive\" && !data.isArchived) return;\n\n if (operation === \"archive\") {\n data.isArchived = true;\n this._archivedThreads = [...this._archivedThreads, data.metadata];\n }\n if (operation === \"unarchive\") {\n data.isArchived = false;\n this._threads = [...this._threads, data.metadata];\n }\n if (operation === \"delete\") {\n this._threadData.delete(threadId);\n }\n\n if (\n operation === \"archive\" ||\n (operation === \"delete\" && data.isArchived)\n ) {\n this._archivedThreads = this._archivedThreads.filter(\n (t) => t.threadId !== threadId,\n );\n }\n\n if (\n operation === \"unarchive\" ||\n (operation === \"delete\" && !data.isArchived)\n ) {\n this._threads = this._threads.filter((t) => t.threadId !== threadId);\n }\n\n this._notifySubscribers();\n }\n\n public async rename(threadId: string, newTitle: string): Promise<void> {\n const data = this._threadData.get(threadId);\n if (!data) throw new Error(\"Thread not found\");\n\n data.metadata = {\n ...data.metadata,\n title: newTitle,\n };\n\n const threadList = data.isArchived ? this.archivedThreads : this.threads;\n const idx = threadList.findIndex((t) => t.threadId === threadId);\n const updatedThreadList = threadList.toSpliced(idx, 1, data.metadata);\n if (data.isArchived) {\n this._archivedThreads = updatedThreadList;\n } else {\n this._threads = updatedThreadList;\n }\n this._notifySubscribers();\n }\n\n public async archive(threadId: string): Promise<void> {\n this._performMoveOp(threadId, \"archive\");\n }\n\n public async unarchive(threadId: string): Promise<void> {\n this._performMoveOp(threadId, \"unarchive\");\n }\n\n public async delete(threadId: string): Promise<void> {\n this._performMoveOp(threadId, \"delete\");\n }\n\n private _subscriptions = new Set<() => void>();\n\n public subscribe(callback: () => void): Unsubscribe {\n this._subscriptions.add(callback);\n return () => this._subscriptions.delete(callback);\n }\n\n private _notifySubscribers() {\n for (const callback of this._subscriptions) callback();\n }\n}\n"],"mappings":"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","names":[]}