@assistant-ui/core 0.2.8 → 0.2.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (123) hide show
  1. package/dist/model-context/tool.d.ts +1 -1
  2. package/dist/model-context/tool.js +1 -1
  3. package/dist/model-context/tool.js.map +1 -1
  4. package/dist/model-context/types.js +17 -2
  5. package/dist/model-context/types.js.map +1 -1
  6. package/dist/react/adapters/LocalStorageThreadListAdapter.d.ts.map +1 -1
  7. package/dist/react/adapters/LocalStorageThreadListAdapter.js +12 -2
  8. package/dist/react/adapters/LocalStorageThreadListAdapter.js.map +1 -1
  9. package/dist/react/client/Tools.d.ts.map +1 -1
  10. package/dist/react/client/Tools.js +9 -3
  11. package/dist/react/client/Tools.js.map +1 -1
  12. package/dist/react/index.d.ts +8 -2
  13. package/dist/react/index.js +7 -1
  14. package/dist/react/model-context/define-mcp-toolkit.d.ts +12 -0
  15. package/dist/react/model-context/define-mcp-toolkit.d.ts.map +1 -0
  16. package/dist/react/model-context/define-mcp-toolkit.js +14 -0
  17. package/dist/react/model-context/define-mcp-toolkit.js.map +1 -0
  18. package/dist/react/model-context/define-toolkit.d.ts +21 -0
  19. package/dist/react/model-context/define-toolkit.d.ts.map +1 -0
  20. package/dist/react/model-context/define-toolkit.js +8 -0
  21. package/dist/react/model-context/define-toolkit.js.map +1 -0
  22. package/dist/react/model-context/hitl.d.ts +23 -0
  23. package/dist/react/model-context/hitl.d.ts.map +1 -0
  24. package/dist/react/model-context/hitl.js +26 -0
  25. package/dist/react/model-context/hitl.js.map +1 -0
  26. package/dist/react/model-context/makeAssistantTool.d.ts +8 -0
  27. package/dist/react/model-context/makeAssistantTool.d.ts.map +1 -1
  28. package/dist/react/model-context/makeAssistantTool.js +4 -0
  29. package/dist/react/model-context/makeAssistantTool.js.map +1 -1
  30. package/dist/react/model-context/makeAssistantToolUI.d.ts +8 -0
  31. package/dist/react/model-context/makeAssistantToolUI.d.ts.map +1 -1
  32. package/dist/react/model-context/makeAssistantToolUI.js +4 -0
  33. package/dist/react/model-context/makeAssistantToolUI.js.map +1 -1
  34. package/dist/react/model-context/provider-tool.d.ts +15 -0
  35. package/dist/react/model-context/provider-tool.d.ts.map +1 -0
  36. package/dist/react/model-context/provider-tool.js +12 -0
  37. package/dist/react/model-context/provider-tool.js.map +1 -0
  38. package/dist/react/model-context/stub-tool.d.ts +12 -0
  39. package/dist/react/model-context/stub-tool.d.ts.map +1 -0
  40. package/dist/react/model-context/stub-tool.js +15 -0
  41. package/dist/react/model-context/stub-tool.js.map +1 -0
  42. package/dist/react/model-context/toolbox.d.ts +62 -15
  43. package/dist/react/model-context/toolbox.d.ts.map +1 -1
  44. package/dist/react/model-context/toolbox.js +19 -1
  45. package/dist/react/model-context/toolbox.js.map +1 -1
  46. package/dist/react/model-context/useAssistantTool.d.ts +11 -1
  47. package/dist/react/model-context/useAssistantTool.d.ts.map +1 -1
  48. package/dist/react/model-context/useAssistantTool.js +12 -6
  49. package/dist/react/model-context/useAssistantTool.js.map +1 -1
  50. package/dist/react/model-context/useAssistantToolUI.d.ts +13 -4
  51. package/dist/react/model-context/useAssistantToolUI.d.ts.map +1 -1
  52. package/dist/react/model-context/useAssistantToolUI.js +6 -3
  53. package/dist/react/model-context/useAssistantToolUI.js.map +1 -1
  54. package/dist/react/model-context/useAuiToolOverrides.d.ts +22 -0
  55. package/dist/react/model-context/useAuiToolOverrides.d.ts.map +1 -0
  56. package/dist/react/model-context/useAuiToolOverrides.js +31 -0
  57. package/dist/react/model-context/useAuiToolOverrides.js.map +1 -0
  58. package/dist/react/primitives/part/PartMessages.d.ts +13 -11
  59. package/dist/react/primitives/part/PartMessages.d.ts.map +1 -1
  60. package/dist/react/primitives/part/PartMessages.js +13 -11
  61. package/dist/react/primitives/part/PartMessages.js.map +1 -1
  62. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.d.ts +1 -0
  63. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.d.ts.map +1 -1
  64. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.js +28 -0
  65. package/dist/react/runtimes/RemoteThreadListThreadListRuntimeCore.js.map +1 -1
  66. package/dist/react/runtimes/cloud/useCloudThreadListAdapter.d.ts.map +1 -1
  67. package/dist/react/runtimes/cloud/useCloudThreadListAdapter.js +9 -2
  68. package/dist/react/runtimes/cloud/useCloudThreadListAdapter.js.map +1 -1
  69. package/dist/runtime/api/thread-list-item-runtime.d.ts +2 -0
  70. package/dist/runtime/api/thread-list-item-runtime.d.ts.map +1 -1
  71. package/dist/runtime/api/thread-list-item-runtime.js +6 -0
  72. package/dist/runtime/api/thread-list-item-runtime.js.map +1 -1
  73. package/dist/runtime/interfaces/thread-list-runtime-core.d.ts +1 -0
  74. package/dist/runtime/interfaces/thread-list-runtime-core.d.ts.map +1 -1
  75. package/dist/runtimes/external-store/external-store-adapter.d.ts +2 -0
  76. package/dist/runtimes/external-store/external-store-adapter.d.ts.map +1 -1
  77. package/dist/runtimes/external-store/external-store-thread-list-runtime-core.d.ts +1 -0
  78. package/dist/runtimes/external-store/external-store-thread-list-runtime-core.d.ts.map +1 -1
  79. package/dist/runtimes/external-store/external-store-thread-list-runtime-core.js +5 -0
  80. package/dist/runtimes/external-store/external-store-thread-list-runtime-core.js.map +1 -1
  81. package/dist/runtimes/remote-thread-list/adapter/in-memory.d.ts +1 -0
  82. package/dist/runtimes/remote-thread-list/adapter/in-memory.d.ts.map +1 -1
  83. package/dist/runtimes/remote-thread-list/adapter/in-memory.js +3 -0
  84. package/dist/runtimes/remote-thread-list/adapter/in-memory.js.map +1 -1
  85. package/dist/runtimes/remote-thread-list/types.d.ts +1 -0
  86. package/dist/runtimes/remote-thread-list/types.d.ts.map +1 -1
  87. package/dist/store/runtime-clients/thread-list-item-runtime-client.js +1 -0
  88. package/dist/store/runtime-clients/thread-list-item-runtime-client.js.map +1 -1
  89. package/dist/store/scopes/thread-list-item.d.ts +1 -0
  90. package/dist/store/scopes/thread-list-item.d.ts.map +1 -1
  91. package/package.json +5 -5
  92. package/src/model-context/tool.ts +1 -1
  93. package/src/model-context/types.ts +21 -3
  94. package/src/react/adapters/LocalStorageThreadListAdapter.tsx +15 -2
  95. package/src/react/client/Tools.ts +22 -7
  96. package/src/react/index.ts +15 -2
  97. package/src/react/model-context/define-mcp-toolkit.ts +16 -0
  98. package/src/react/model-context/define-toolkit.test.ts +101 -0
  99. package/src/react/model-context/define-toolkit.ts +41 -0
  100. package/src/react/model-context/hitl.ts +27 -0
  101. package/src/react/model-context/makeAssistantTool.ts +8 -0
  102. package/src/react/model-context/makeAssistantToolUI.ts +8 -0
  103. package/src/react/model-context/provider-tool.ts +30 -0
  104. package/src/react/model-context/stub-tool.ts +14 -0
  105. package/src/react/model-context/toolbox.test.ts +182 -0
  106. package/src/react/model-context/toolbox.ts +189 -21
  107. package/src/react/model-context/useAssistantTool.ts +28 -8
  108. package/src/react/model-context/useAssistantToolUI.ts +13 -4
  109. package/src/react/model-context/useAuiToolOverrides.ts +38 -0
  110. package/src/react/primitives/part/PartMessages.tsx +13 -11
  111. package/src/react/runtimes/RemoteThreadListThreadListRuntimeCore.tsx +43 -0
  112. package/src/react/runtimes/cloud/useCloudThreadListAdapter.tsx +9 -0
  113. package/src/runtime/api/thread-list-item-runtime.ts +15 -0
  114. package/src/runtime/interfaces/thread-list-runtime-core.ts +4 -0
  115. package/src/runtimes/external-store/external-store-adapter.ts +7 -0
  116. package/src/runtimes/external-store/external-store-thread-list-runtime-core.ts +13 -0
  117. package/src/runtimes/remote-thread-list/adapter/in-memory.ts +4 -0
  118. package/src/runtimes/remote-thread-list/types.ts +4 -0
  119. package/src/store/clients/model-context-client.test.ts +87 -2
  120. package/src/store/runtime-clients/thread-list-item-runtime-client.ts +1 -0
  121. package/src/store/scopes/thread-list-item.ts +1 -0
  122. package/src/tests/RemoteThreadListThreadListRuntimeCore-custom-metadata.test.ts +69 -1
  123. package/src/tests/thread-list-runtime-getLoadThreadsPromise.test.ts +1 -0
@@ -383,6 +383,34 @@ var RemoteThreadListThreadListRuntimeCore = class extends BaseSubscribable {
383
383
  }
384
384
  });
385
385
  }
386
+ updateCustom(threadIdOrRemoteId, custom) {
387
+ const data = this.getItemById(threadIdOrRemoteId);
388
+ if (!data) throw new Error("Thread not found");
389
+ if (data.status === "new") throw new Error("Thread is not yet initialized");
390
+ if (!this._options.adapter.updateCustom) throw new Error("Remote thread list adapter does not support updating custom metadata");
391
+ return this._state.optimisticUpdate({
392
+ execute: async () => {
393
+ const { remoteId } = await data.initializeTask;
394
+ const adapter = this._options.adapter;
395
+ if (!adapter.updateCustom) throw new Error("Remote thread list adapter does not support updating custom metadata");
396
+ return adapter.updateCustom(remoteId, custom);
397
+ },
398
+ optimistic: (state) => {
399
+ const data = getThreadData(state, threadIdOrRemoteId);
400
+ if (!data) return state;
401
+ return {
402
+ ...state,
403
+ threadData: {
404
+ ...state.threadData,
405
+ [data.id]: {
406
+ ...data,
407
+ custom
408
+ }
409
+ }
410
+ };
411
+ }
412
+ });
413
+ }
386
414
  async _ensureThreadIsNotMain(threadId) {
387
415
  if (threadId === this.newThreadId) throw new Error("Cannot ensure new thread is not main");
388
416
  if (threadId === this._mainThreadId) await this.switchToNewThread();
@@ -1 +1 @@
1
- {"version":3,"file":"RemoteThreadListThreadListRuntimeCore.js","names":[],"sources":["../../../src/react/runtimes/RemoteThreadListThreadListRuntimeCore.tsx"],"sourcesContent":["import type { ThreadListRuntimeCore } from \"../../runtime/interfaces/thread-list-runtime-core\";\nimport { generateId } from \"../../utils/id\";\nimport { BaseSubscribable } from \"../../subscribable/subscribable\";\nimport { OptimisticState } from \"../../runtimes/remote-thread-list/optimistic-state\";\nimport { EMPTY_THREAD_CORE } from \"../../runtimes/remote-thread-list/empty-thread-core\";\nimport type {\n RemoteThreadData,\n RemoteThreadState,\n} from \"../../runtimes/remote-thread-list/remote-thread-state\";\nimport {\n classifyThreads,\n createThreadMappingId,\n getThreadData,\n normalizeCursor,\n updateStatusReducer,\n} from \"../../runtimes/remote-thread-list/remote-thread-state\";\nimport type { RemoteThreadListOptions } from \"../../runtimes/remote-thread-list/types\";\nimport { RemoteThreadListHookInstanceManager } from \"./RemoteThreadListHookInstanceManager\";\nimport { type FC, Fragment, useEffect, useId } from \"react\";\nimport { create } from \"zustand\";\nimport { AssistantMessageStream } from \"assistant-stream\";\nimport type { ModelContextProvider } from \"../../model-context/types\";\nimport { RuntimeAdapterProvider } from \"./RuntimeAdapterProvider\";\n\nexport class RemoteThreadListThreadListRuntimeCore\n extends BaseSubscribable\n implements ThreadListRuntimeCore\n{\n private _options!: RemoteThreadListOptions;\n private readonly _hookManager: RemoteThreadListHookInstanceManager;\n\n private _loadThreadsPromise: Promise<void> | undefined;\n private _loadMorePromise: Promise<void> | undefined;\n private _loadGeneration = 0;\n\n private _mainThreadId!: string;\n private readonly _state = new OptimisticState<RemoteThreadState>({\n isLoading: true,\n isLoadingMore: false,\n cursor: undefined,\n newThreadId: undefined,\n threadIds: [],\n archivedThreadIds: [],\n threadIdMap: {},\n threadData: {},\n });\n\n public get threadItems() {\n return this._state.value.threadData;\n }\n\n public getLoadThreadsPromise() {\n // TODO this needs to be cached in case this promise is loaded during suspense\n if (!this._loadThreadsPromise) {\n const generation = this._loadGeneration;\n this._loadThreadsPromise = this._state\n .optimisticUpdate({\n execute: () => this._options.adapter.list(),\n loading: (state) => {\n return {\n ...state,\n isLoading: true,\n };\n },\n then: (state, l) => {\n if (generation !== this._loadGeneration) return state;\n const fresh = classifyThreads(l.threads, {\n threadIds: [],\n archivedThreadIds: [],\n threadIdMap: {},\n threadData: {},\n });\n\n return {\n ...state,\n isLoading: false,\n cursor: normalizeCursor(l.nextCursor),\n threadIds: fresh.threadIds,\n archivedThreadIds: fresh.archivedThreadIds,\n threadIdMap: {\n ...state.threadIdMap,\n ...fresh.threadIdMap,\n },\n threadData: {\n ...state.threadData,\n ...fresh.threadData,\n },\n };\n },\n })\n .catch((error: unknown) => {\n if (generation !== this._loadGeneration) return;\n console.error(\"[assistant-ui] thread list load failed:\", error);\n this._loadThreadsPromise = undefined;\n this._state.update({\n ...this._state.baseValue,\n isLoading: false,\n });\n })\n .then(() => {});\n }\n\n return this._loadThreadsPromise;\n }\n\n public loadMore(): Promise<void> {\n if (this._loadMorePromise) return this._loadMorePromise;\n\n const initialState = this._state.value;\n if (initialState.cursor === undefined || initialState.isLoading) {\n return Promise.resolve();\n }\n\n const generation = this._loadGeneration;\n const adapter = this._options.adapter;\n const cursor = initialState.cursor;\n\n const dedup = this._state\n .optimisticUpdate({\n execute: () => adapter.list({ after: cursor }),\n loading: (state) => ({ ...state, isLoadingMore: true }),\n then: (state, l) => {\n if (generation !== this._loadGeneration) return state;\n if (adapter !== this._options.adapter) return state;\n\n const appended = classifyThreads(l.threads, {\n threadIds: [...state.threadIds],\n archivedThreadIds: [...state.archivedThreadIds],\n threadIdMap: { ...state.threadIdMap },\n threadData: { ...state.threadData },\n });\n\n return {\n ...state,\n isLoadingMore: false,\n cursor: normalizeCursor(l.nextCursor),\n threadIds: appended.threadIds,\n archivedThreadIds: appended.archivedThreadIds,\n threadIdMap: appended.threadIdMap,\n threadData: appended.threadData,\n };\n },\n })\n .catch((error: unknown) => {\n console.error(\"[assistant-ui] thread list loadMore failed:\", error);\n })\n .then(() => {\n if (this._loadMorePromise === dedup) {\n this._loadMorePromise = undefined;\n }\n });\n\n this._loadMorePromise = dedup;\n return dedup;\n }\n\n private readonly contextProvider: ModelContextProvider;\n\n constructor(\n options: RemoteThreadListOptions,\n contextProvider: ModelContextProvider,\n ) {\n super();\n this.contextProvider = contextProvider;\n\n this._state.subscribe(() => this._notifySubscribers());\n this._hookManager = new RemoteThreadListHookInstanceManager(\n options.runtimeHook,\n this,\n );\n this.useProvider = create(() => ({\n Provider: options.adapter.unstable_Provider ?? Fragment,\n }));\n this.__internal_setOptions(options);\n this.switchToNewThread();\n }\n\n private _initialThreadLoaded = false;\n private useProvider;\n\n public __internal_setOptions(options: RemoteThreadListOptions) {\n if (this._options === options) return;\n\n const adapterChanged =\n this._options !== undefined && this._options.adapter !== options.adapter;\n\n this._options = options;\n\n const Provider = options.adapter.unstable_Provider ?? Fragment;\n if (Provider !== this.useProvider.getState().Provider) {\n this.useProvider.setState({ Provider }, true);\n }\n\n this._hookManager.setRuntimeHook(options.runtimeHook);\n\n if (adapterChanged) {\n this._loadGeneration++;\n this._loadThreadsPromise = undefined;\n this._loadMorePromise = undefined;\n this._state.update({\n ...this._state.baseValue,\n cursor: undefined,\n });\n }\n }\n\n public __internal_load() {\n this.getLoadThreadsPromise(); // begin loading on initial bind\n const startThreadId =\n this._options.threadId ?? this._options.initialThreadId;\n if (!this._initialThreadLoaded && startThreadId) {\n this._initialThreadLoaded = true;\n this.switchToThread(startThreadId).catch(() => {});\n }\n }\n\n public reload() {\n this._loadGeneration++;\n this._loadThreadsPromise = undefined;\n this._loadMorePromise = undefined;\n this._state.update({\n ...this._state.baseValue,\n cursor: undefined,\n });\n return this.getLoadThreadsPromise();\n }\n\n public get isLoading() {\n return this._state.value.isLoading;\n }\n\n public get isLoadingMore() {\n return this._state.value.isLoadingMore;\n }\n\n public get hasMore() {\n return this._state.value.cursor !== undefined;\n }\n\n public get threadIds() {\n return this._state.value.threadIds;\n }\n\n public get archivedThreadIds() {\n return this._state.value.archivedThreadIds;\n }\n\n public get newThreadId() {\n return this._state.value.newThreadId;\n }\n\n public get mainThreadId(): string {\n return this._mainThreadId;\n }\n\n public getMainThreadRuntimeCore() {\n const result = this._hookManager.getThreadRuntimeCore(this._mainThreadId);\n if (!result) return EMPTY_THREAD_CORE;\n return result;\n }\n\n public getThreadRuntimeCore(threadIdOrRemoteId: string) {\n const data = this.getItemById(threadIdOrRemoteId);\n if (!data) throw new Error(\"Thread not found\");\n\n const result = this._hookManager.getThreadRuntimeCore(data.id);\n if (!result) throw new Error(\"Thread not found\");\n return result;\n }\n\n public getItemById(threadIdOrRemoteId: string) {\n return getThreadData(this._state.value, threadIdOrRemoteId);\n }\n\n public async switchToThread(\n threadIdOrRemoteId: string,\n options?: { unarchive?: boolean },\n ): Promise<void> {\n let data = this.getItemById(threadIdOrRemoteId);\n\n if (!data) {\n const remoteMetadata =\n await this._options.adapter.fetch(threadIdOrRemoteId);\n const state = this._state.value;\n const mappingId = createThreadMappingId(remoteMetadata.remoteId);\n\n const newThreadData = {\n ...state.threadData,\n [mappingId]: {\n id: mappingId,\n initializeTask: Promise.resolve({\n remoteId: remoteMetadata.remoteId,\n externalId: remoteMetadata.externalId,\n }),\n remoteId: remoteMetadata.remoteId,\n externalId: remoteMetadata.externalId,\n status: remoteMetadata.status,\n title: remoteMetadata.title,\n custom: remoteMetadata.custom,\n } as RemoteThreadData,\n };\n\n const newThreadIdMap = {\n ...state.threadIdMap,\n [remoteMetadata.remoteId]: mappingId,\n };\n\n // Filter both arrays first so a concurrent `list()` can't leave the id\n // duplicated or under the wrong status.\n const threadIdsWithoutRemote = state.threadIds.filter(\n (id) => id !== remoteMetadata.remoteId,\n );\n const archivedThreadIdsWithoutRemote = state.archivedThreadIds.filter(\n (id) => id !== remoteMetadata.remoteId,\n );\n\n const newThreadIds =\n remoteMetadata.status === \"regular\"\n ? [...threadIdsWithoutRemote, remoteMetadata.remoteId]\n : threadIdsWithoutRemote;\n const newArchivedThreadIds =\n remoteMetadata.status === \"archived\"\n ? [...archivedThreadIdsWithoutRemote, remoteMetadata.remoteId]\n : archivedThreadIdsWithoutRemote;\n\n this._state.update({\n ...state,\n threadIds: newThreadIds,\n archivedThreadIds: newArchivedThreadIds,\n threadIdMap: newThreadIdMap,\n threadData: newThreadData,\n });\n\n data = this.getItemById(threadIdOrRemoteId);\n }\n\n if (!data) throw new Error(\"Thread not found\");\n if (this._mainThreadId === data.id) return;\n\n const task = this._hookManager.startThreadRuntime(data.id);\n if (this.mainThreadId !== undefined) {\n await task;\n } else {\n task.then(() => this._notifySubscribers());\n }\n\n if (data.status === \"archived\" && options?.unarchive !== false) {\n await this.unarchive(data.id);\n }\n this._mainThreadId = data.id;\n\n this._notifySubscribers();\n }\n\n public async switchToNewThread(): Promise<void> {\n // an initialization transaction is in progress, wait for it to settle\n while (\n this._state.baseValue.newThreadId !== undefined &&\n this._state.value.newThreadId === undefined\n ) {\n await this._state.waitForUpdate();\n }\n\n const state = this._state.value;\n let id: string | undefined = this._state.value.newThreadId;\n if (id === undefined) {\n do {\n id = `__LOCALID_${generateId()}`;\n } while (state.threadIdMap[id]);\n\n const mappingId = createThreadMappingId(id);\n this._state.update({\n ...state,\n newThreadId: id,\n threadIdMap: {\n ...state.threadIdMap,\n [id]: mappingId,\n },\n threadData: {\n ...state.threadData,\n [mappingId]: {\n status: \"new\",\n id,\n remoteId: undefined,\n externalId: undefined,\n title: undefined,\n custom: undefined,\n } satisfies RemoteThreadData,\n },\n });\n }\n\n return this.switchToThread(id);\n }\n\n public initialize = async (threadId: string) => {\n if (this._state.value.newThreadId !== threadId) {\n const data = this.getItemById(threadId);\n if (!data) throw new Error(\"Thread not found\");\n if (data.status === \"new\") throw new Error(\"Unexpected new state\");\n return data.initializeTask;\n }\n\n return this._state.optimisticUpdate({\n execute: () => {\n return this._options.adapter.initialize(threadId);\n },\n optimistic: (state) => {\n return updateStatusReducer(state, threadId, \"regular\");\n },\n loading: (state, task) => {\n const mappingId = createThreadMappingId(threadId);\n return {\n ...state,\n threadData: {\n ...state.threadData,\n [mappingId]: {\n ...state.threadData[mappingId],\n initializeTask: task,\n },\n },\n };\n },\n then: (state, { remoteId, externalId }) => {\n const data = getThreadData(state, threadId);\n if (!data) return state;\n\n const mappingId = createThreadMappingId(threadId);\n return {\n ...state,\n threadIdMap: {\n ...state.threadIdMap,\n [remoteId]: mappingId,\n },\n threadData: {\n ...state.threadData,\n [mappingId]: {\n ...data,\n initializeTask: Promise.resolve({ remoteId, externalId }),\n remoteId,\n externalId,\n },\n },\n };\n },\n });\n };\n\n public generateTitle = async (threadId: string) => {\n const data = this.getItemById(threadId);\n if (!data) throw new Error(\"Thread not found\");\n if (data.status === \"new\") throw new Error(\"Thread is not yet initialized\");\n\n const { remoteId } = await data.initializeTask;\n\n const runtimeCore = this._hookManager.getThreadRuntimeCore(data.id);\n if (!runtimeCore) return; // thread is no longer running\n\n const messages = runtimeCore.messages;\n const stream = await this._options.adapter.generateTitle(\n remoteId,\n messages,\n );\n const messageStream = AssistantMessageStream.fromAssistantStream(stream);\n for await (const result of messageStream) {\n const newTitle = result.parts.filter((c) => c.type === \"text\")[0]?.text;\n const state = this._state.baseValue;\n const currentData = getThreadData(state, data.id);\n if (!currentData) continue;\n this._state.update({\n ...state,\n threadData: {\n ...state.threadData,\n [currentData.id]: {\n ...currentData,\n title: newTitle,\n },\n },\n });\n }\n };\n\n public rename(threadIdOrRemoteId: string, newTitle: string): Promise<void> {\n const data = this.getItemById(threadIdOrRemoteId);\n if (!data) throw new Error(\"Thread not found\");\n if (data.status === \"new\") throw new Error(\"Thread is not yet initialized\");\n\n return this._state.optimisticUpdate({\n execute: async () => {\n const { remoteId } = await data.initializeTask;\n return this._options.adapter.rename(remoteId, newTitle);\n },\n optimistic: (state) => {\n const data = getThreadData(state, threadIdOrRemoteId);\n if (!data) return state;\n\n return {\n ...state,\n threadData: {\n ...state.threadData,\n [data.id]: {\n ...data,\n title: newTitle,\n },\n },\n };\n },\n });\n }\n\n private async _ensureThreadIsNotMain(threadId: string) {\n if (threadId === this.newThreadId)\n throw new Error(\"Cannot ensure new thread is not main\");\n\n if (threadId === this._mainThreadId) {\n await this.switchToNewThread();\n }\n }\n\n public async archive(threadIdOrRemoteId: string) {\n const data = this.getItemById(threadIdOrRemoteId);\n if (!data) throw new Error(\"Thread not found\");\n if (data.status !== \"regular\")\n throw new Error(\"Thread is not yet initialized or already archived\");\n\n await this._ensureThreadIsNotMain(data.id);\n\n return this._state.optimisticUpdate({\n execute: async () => {\n const { remoteId } = await data.initializeTask;\n return this._options.adapter.archive(remoteId);\n },\n optimistic: (state) => {\n return updateStatusReducer(state, data.id, \"archived\");\n },\n });\n }\n\n public unarchive(threadIdOrRemoteId: string): Promise<void> {\n const data = this.getItemById(threadIdOrRemoteId);\n if (!data) throw new Error(\"Thread not found\");\n if (data.status !== \"archived\") throw new Error(\"Thread is not archived\");\n\n return this._state.optimisticUpdate({\n execute: async () => {\n try {\n const { remoteId } = await data.initializeTask;\n return await this._options.adapter.unarchive(remoteId);\n } catch (error) {\n await this._ensureThreadIsNotMain(data.id);\n throw error;\n }\n },\n optimistic: (state) => {\n return updateStatusReducer(state, data.id, \"regular\");\n },\n });\n }\n\n public async delete(threadIdOrRemoteId: string) {\n const data = this.getItemById(threadIdOrRemoteId);\n if (!data) throw new Error(\"Thread not found\");\n if (data.status !== \"regular\" && data.status !== \"archived\")\n throw new Error(\"Thread is not yet initialized\");\n\n await this._ensureThreadIsNotMain(data.id);\n this._hookManager.stopThreadRuntime(data.id);\n\n return this._state.optimisticUpdate({\n execute: async () => {\n const { remoteId } = await data.initializeTask;\n return await this._options.adapter.delete(remoteId);\n },\n optimistic: (state) => {\n return updateStatusReducer(state, data.id, \"deleted\");\n },\n });\n }\n\n public async detach(threadIdOrRemoteId: string): Promise<void> {\n const data = this.getItemById(threadIdOrRemoteId);\n if (!data) throw new Error(\"Thread not found\");\n if (data.status !== \"regular\" && data.status !== \"archived\")\n throw new Error(\"Thread is not yet initialized\");\n\n await this._ensureThreadIsNotMain(data.id);\n this._hookManager.stopThreadRuntime(data.id);\n }\n\n private useBoundIds = create<string[]>(() => []);\n\n public __internal_RenderComponent: FC = () => {\n const id = useId();\n useEffect(() => {\n this.useBoundIds.setState((s) => [...s, id], true);\n return () => {\n this.useBoundIds.setState((s) => s.filter((i) => i !== id), true);\n };\n }, [id]);\n\n const boundIds = this.useBoundIds();\n const { Provider } = this.useProvider();\n\n const adapters = {\n modelContext: this.contextProvider,\n };\n\n return (\n (boundIds.length === 0 || boundIds[0] === id) && (\n // only render if the component is the first one mounted\n <RuntimeAdapterProvider adapters={adapters}>\n <this._hookManager.__internal_RenderThreadRuntimes\n provider={Provider}\n />\n </RuntimeAdapterProvider>\n )\n );\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"RemoteThreadListThreadListRuntimeCore.js","names":[],"sources":["../../../src/react/runtimes/RemoteThreadListThreadListRuntimeCore.tsx"],"sourcesContent":["import type { ThreadListRuntimeCore } from \"../../runtime/interfaces/thread-list-runtime-core\";\nimport { generateId } from \"../../utils/id\";\nimport { BaseSubscribable } from \"../../subscribable/subscribable\";\nimport { OptimisticState } from \"../../runtimes/remote-thread-list/optimistic-state\";\nimport { EMPTY_THREAD_CORE } from \"../../runtimes/remote-thread-list/empty-thread-core\";\nimport type {\n RemoteThreadData,\n RemoteThreadState,\n} from \"../../runtimes/remote-thread-list/remote-thread-state\";\nimport {\n classifyThreads,\n createThreadMappingId,\n getThreadData,\n normalizeCursor,\n updateStatusReducer,\n} from \"../../runtimes/remote-thread-list/remote-thread-state\";\nimport type { RemoteThreadListOptions } from \"../../runtimes/remote-thread-list/types\";\nimport { RemoteThreadListHookInstanceManager } from \"./RemoteThreadListHookInstanceManager\";\nimport { type FC, Fragment, useEffect, useId } from \"react\";\nimport { create } from \"zustand\";\nimport { AssistantMessageStream } from \"assistant-stream\";\nimport type { ModelContextProvider } from \"../../model-context/types\";\nimport { RuntimeAdapterProvider } from \"./RuntimeAdapterProvider\";\n\nexport class RemoteThreadListThreadListRuntimeCore\n extends BaseSubscribable\n implements ThreadListRuntimeCore\n{\n private _options!: RemoteThreadListOptions;\n private readonly _hookManager: RemoteThreadListHookInstanceManager;\n\n private _loadThreadsPromise: Promise<void> | undefined;\n private _loadMorePromise: Promise<void> | undefined;\n private _loadGeneration = 0;\n\n private _mainThreadId!: string;\n private readonly _state = new OptimisticState<RemoteThreadState>({\n isLoading: true,\n isLoadingMore: false,\n cursor: undefined,\n newThreadId: undefined,\n threadIds: [],\n archivedThreadIds: [],\n threadIdMap: {},\n threadData: {},\n });\n\n public get threadItems() {\n return this._state.value.threadData;\n }\n\n public getLoadThreadsPromise() {\n // TODO this needs to be cached in case this promise is loaded during suspense\n if (!this._loadThreadsPromise) {\n const generation = this._loadGeneration;\n this._loadThreadsPromise = this._state\n .optimisticUpdate({\n execute: () => this._options.adapter.list(),\n loading: (state) => {\n return {\n ...state,\n isLoading: true,\n };\n },\n then: (state, l) => {\n if (generation !== this._loadGeneration) return state;\n const fresh = classifyThreads(l.threads, {\n threadIds: [],\n archivedThreadIds: [],\n threadIdMap: {},\n threadData: {},\n });\n\n return {\n ...state,\n isLoading: false,\n cursor: normalizeCursor(l.nextCursor),\n threadIds: fresh.threadIds,\n archivedThreadIds: fresh.archivedThreadIds,\n threadIdMap: {\n ...state.threadIdMap,\n ...fresh.threadIdMap,\n },\n threadData: {\n ...state.threadData,\n ...fresh.threadData,\n },\n };\n },\n })\n .catch((error: unknown) => {\n if (generation !== this._loadGeneration) return;\n console.error(\"[assistant-ui] thread list load failed:\", error);\n this._loadThreadsPromise = undefined;\n this._state.update({\n ...this._state.baseValue,\n isLoading: false,\n });\n })\n .then(() => {});\n }\n\n return this._loadThreadsPromise;\n }\n\n public loadMore(): Promise<void> {\n if (this._loadMorePromise) return this._loadMorePromise;\n\n const initialState = this._state.value;\n if (initialState.cursor === undefined || initialState.isLoading) {\n return Promise.resolve();\n }\n\n const generation = this._loadGeneration;\n const adapter = this._options.adapter;\n const cursor = initialState.cursor;\n\n const dedup = this._state\n .optimisticUpdate({\n execute: () => adapter.list({ after: cursor }),\n loading: (state) => ({ ...state, isLoadingMore: true }),\n then: (state, l) => {\n if (generation !== this._loadGeneration) return state;\n if (adapter !== this._options.adapter) return state;\n\n const appended = classifyThreads(l.threads, {\n threadIds: [...state.threadIds],\n archivedThreadIds: [...state.archivedThreadIds],\n threadIdMap: { ...state.threadIdMap },\n threadData: { ...state.threadData },\n });\n\n return {\n ...state,\n isLoadingMore: false,\n cursor: normalizeCursor(l.nextCursor),\n threadIds: appended.threadIds,\n archivedThreadIds: appended.archivedThreadIds,\n threadIdMap: appended.threadIdMap,\n threadData: appended.threadData,\n };\n },\n })\n .catch((error: unknown) => {\n console.error(\"[assistant-ui] thread list loadMore failed:\", error);\n })\n .then(() => {\n if (this._loadMorePromise === dedup) {\n this._loadMorePromise = undefined;\n }\n });\n\n this._loadMorePromise = dedup;\n return dedup;\n }\n\n private readonly contextProvider: ModelContextProvider;\n\n constructor(\n options: RemoteThreadListOptions,\n contextProvider: ModelContextProvider,\n ) {\n super();\n this.contextProvider = contextProvider;\n\n this._state.subscribe(() => this._notifySubscribers());\n this._hookManager = new RemoteThreadListHookInstanceManager(\n options.runtimeHook,\n this,\n );\n this.useProvider = create(() => ({\n Provider: options.adapter.unstable_Provider ?? Fragment,\n }));\n this.__internal_setOptions(options);\n this.switchToNewThread();\n }\n\n private _initialThreadLoaded = false;\n private useProvider;\n\n public __internal_setOptions(options: RemoteThreadListOptions) {\n if (this._options === options) return;\n\n const adapterChanged =\n this._options !== undefined && this._options.adapter !== options.adapter;\n\n this._options = options;\n\n const Provider = options.adapter.unstable_Provider ?? Fragment;\n if (Provider !== this.useProvider.getState().Provider) {\n this.useProvider.setState({ Provider }, true);\n }\n\n this._hookManager.setRuntimeHook(options.runtimeHook);\n\n if (adapterChanged) {\n this._loadGeneration++;\n this._loadThreadsPromise = undefined;\n this._loadMorePromise = undefined;\n this._state.update({\n ...this._state.baseValue,\n cursor: undefined,\n });\n }\n }\n\n public __internal_load() {\n this.getLoadThreadsPromise(); // begin loading on initial bind\n const startThreadId =\n this._options.threadId ?? this._options.initialThreadId;\n if (!this._initialThreadLoaded && startThreadId) {\n this._initialThreadLoaded = true;\n this.switchToThread(startThreadId).catch(() => {});\n }\n }\n\n public reload() {\n this._loadGeneration++;\n this._loadThreadsPromise = undefined;\n this._loadMorePromise = undefined;\n this._state.update({\n ...this._state.baseValue,\n cursor: undefined,\n });\n return this.getLoadThreadsPromise();\n }\n\n public get isLoading() {\n return this._state.value.isLoading;\n }\n\n public get isLoadingMore() {\n return this._state.value.isLoadingMore;\n }\n\n public get hasMore() {\n return this._state.value.cursor !== undefined;\n }\n\n public get threadIds() {\n return this._state.value.threadIds;\n }\n\n public get archivedThreadIds() {\n return this._state.value.archivedThreadIds;\n }\n\n public get newThreadId() {\n return this._state.value.newThreadId;\n }\n\n public get mainThreadId(): string {\n return this._mainThreadId;\n }\n\n public getMainThreadRuntimeCore() {\n const result = this._hookManager.getThreadRuntimeCore(this._mainThreadId);\n if (!result) return EMPTY_THREAD_CORE;\n return result;\n }\n\n public getThreadRuntimeCore(threadIdOrRemoteId: string) {\n const data = this.getItemById(threadIdOrRemoteId);\n if (!data) throw new Error(\"Thread not found\");\n\n const result = this._hookManager.getThreadRuntimeCore(data.id);\n if (!result) throw new Error(\"Thread not found\");\n return result;\n }\n\n public getItemById(threadIdOrRemoteId: string) {\n return getThreadData(this._state.value, threadIdOrRemoteId);\n }\n\n public async switchToThread(\n threadIdOrRemoteId: string,\n options?: { unarchive?: boolean },\n ): Promise<void> {\n let data = this.getItemById(threadIdOrRemoteId);\n\n if (!data) {\n const remoteMetadata =\n await this._options.adapter.fetch(threadIdOrRemoteId);\n const state = this._state.value;\n const mappingId = createThreadMappingId(remoteMetadata.remoteId);\n\n const newThreadData = {\n ...state.threadData,\n [mappingId]: {\n id: mappingId,\n initializeTask: Promise.resolve({\n remoteId: remoteMetadata.remoteId,\n externalId: remoteMetadata.externalId,\n }),\n remoteId: remoteMetadata.remoteId,\n externalId: remoteMetadata.externalId,\n status: remoteMetadata.status,\n title: remoteMetadata.title,\n custom: remoteMetadata.custom,\n } as RemoteThreadData,\n };\n\n const newThreadIdMap = {\n ...state.threadIdMap,\n [remoteMetadata.remoteId]: mappingId,\n };\n\n // Filter both arrays first so a concurrent `list()` can't leave the id\n // duplicated or under the wrong status.\n const threadIdsWithoutRemote = state.threadIds.filter(\n (id) => id !== remoteMetadata.remoteId,\n );\n const archivedThreadIdsWithoutRemote = state.archivedThreadIds.filter(\n (id) => id !== remoteMetadata.remoteId,\n );\n\n const newThreadIds =\n remoteMetadata.status === \"regular\"\n ? [...threadIdsWithoutRemote, remoteMetadata.remoteId]\n : threadIdsWithoutRemote;\n const newArchivedThreadIds =\n remoteMetadata.status === \"archived\"\n ? [...archivedThreadIdsWithoutRemote, remoteMetadata.remoteId]\n : archivedThreadIdsWithoutRemote;\n\n this._state.update({\n ...state,\n threadIds: newThreadIds,\n archivedThreadIds: newArchivedThreadIds,\n threadIdMap: newThreadIdMap,\n threadData: newThreadData,\n });\n\n data = this.getItemById(threadIdOrRemoteId);\n }\n\n if (!data) throw new Error(\"Thread not found\");\n if (this._mainThreadId === data.id) return;\n\n const task = this._hookManager.startThreadRuntime(data.id);\n if (this.mainThreadId !== undefined) {\n await task;\n } else {\n task.then(() => this._notifySubscribers());\n }\n\n if (data.status === \"archived\" && options?.unarchive !== false) {\n await this.unarchive(data.id);\n }\n this._mainThreadId = data.id;\n\n this._notifySubscribers();\n }\n\n public async switchToNewThread(): Promise<void> {\n // an initialization transaction is in progress, wait for it to settle\n while (\n this._state.baseValue.newThreadId !== undefined &&\n this._state.value.newThreadId === undefined\n ) {\n await this._state.waitForUpdate();\n }\n\n const state = this._state.value;\n let id: string | undefined = this._state.value.newThreadId;\n if (id === undefined) {\n do {\n id = `__LOCALID_${generateId()}`;\n } while (state.threadIdMap[id]);\n\n const mappingId = createThreadMappingId(id);\n this._state.update({\n ...state,\n newThreadId: id,\n threadIdMap: {\n ...state.threadIdMap,\n [id]: mappingId,\n },\n threadData: {\n ...state.threadData,\n [mappingId]: {\n status: \"new\",\n id,\n remoteId: undefined,\n externalId: undefined,\n title: undefined,\n custom: undefined,\n } satisfies RemoteThreadData,\n },\n });\n }\n\n return this.switchToThread(id);\n }\n\n public initialize = async (threadId: string) => {\n if (this._state.value.newThreadId !== threadId) {\n const data = this.getItemById(threadId);\n if (!data) throw new Error(\"Thread not found\");\n if (data.status === \"new\") throw new Error(\"Unexpected new state\");\n return data.initializeTask;\n }\n\n return this._state.optimisticUpdate({\n execute: () => {\n return this._options.adapter.initialize(threadId);\n },\n optimistic: (state) => {\n return updateStatusReducer(state, threadId, \"regular\");\n },\n loading: (state, task) => {\n const mappingId = createThreadMappingId(threadId);\n return {\n ...state,\n threadData: {\n ...state.threadData,\n [mappingId]: {\n ...state.threadData[mappingId],\n initializeTask: task,\n },\n },\n };\n },\n then: (state, { remoteId, externalId }) => {\n const data = getThreadData(state, threadId);\n if (!data) return state;\n\n const mappingId = createThreadMappingId(threadId);\n return {\n ...state,\n threadIdMap: {\n ...state.threadIdMap,\n [remoteId]: mappingId,\n },\n threadData: {\n ...state.threadData,\n [mappingId]: {\n ...data,\n initializeTask: Promise.resolve({ remoteId, externalId }),\n remoteId,\n externalId,\n },\n },\n };\n },\n });\n };\n\n public generateTitle = async (threadId: string) => {\n const data = this.getItemById(threadId);\n if (!data) throw new Error(\"Thread not found\");\n if (data.status === \"new\") throw new Error(\"Thread is not yet initialized\");\n\n const { remoteId } = await data.initializeTask;\n\n const runtimeCore = this._hookManager.getThreadRuntimeCore(data.id);\n if (!runtimeCore) return; // thread is no longer running\n\n const messages = runtimeCore.messages;\n const stream = await this._options.adapter.generateTitle(\n remoteId,\n messages,\n );\n const messageStream = AssistantMessageStream.fromAssistantStream(stream);\n for await (const result of messageStream) {\n const newTitle = result.parts.filter((c) => c.type === \"text\")[0]?.text;\n const state = this._state.baseValue;\n const currentData = getThreadData(state, data.id);\n if (!currentData) continue;\n this._state.update({\n ...state,\n threadData: {\n ...state.threadData,\n [currentData.id]: {\n ...currentData,\n title: newTitle,\n },\n },\n });\n }\n };\n\n public rename(threadIdOrRemoteId: string, newTitle: string): Promise<void> {\n const data = this.getItemById(threadIdOrRemoteId);\n if (!data) throw new Error(\"Thread not found\");\n if (data.status === \"new\") throw new Error(\"Thread is not yet initialized\");\n\n return this._state.optimisticUpdate({\n execute: async () => {\n const { remoteId } = await data.initializeTask;\n return this._options.adapter.rename(remoteId, newTitle);\n },\n optimistic: (state) => {\n const data = getThreadData(state, threadIdOrRemoteId);\n if (!data) return state;\n\n return {\n ...state,\n threadData: {\n ...state.threadData,\n [data.id]: {\n ...data,\n title: newTitle,\n },\n },\n };\n },\n });\n }\n\n public updateCustom(\n threadIdOrRemoteId: string,\n custom: Record<string, unknown> | undefined,\n ): Promise<void> {\n const data = this.getItemById(threadIdOrRemoteId);\n if (!data) throw new Error(\"Thread not found\");\n if (data.status === \"new\") throw new Error(\"Thread is not yet initialized\");\n\n if (!this._options.adapter.updateCustom) {\n throw new Error(\n \"Remote thread list adapter does not support updating custom metadata\",\n );\n }\n\n return this._state.optimisticUpdate({\n execute: async () => {\n const { remoteId } = await data.initializeTask;\n const adapter = this._options.adapter;\n if (!adapter.updateCustom) {\n throw new Error(\n \"Remote thread list adapter does not support updating custom metadata\",\n );\n }\n return adapter.updateCustom(remoteId, custom);\n },\n optimistic: (state) => {\n const data = getThreadData(state, threadIdOrRemoteId);\n if (!data) return state;\n\n return {\n ...state,\n threadData: {\n ...state.threadData,\n [data.id]: {\n ...data,\n custom,\n },\n },\n };\n },\n });\n }\n\n private async _ensureThreadIsNotMain(threadId: string) {\n if (threadId === this.newThreadId)\n throw new Error(\"Cannot ensure new thread is not main\");\n\n if (threadId === this._mainThreadId) {\n await this.switchToNewThread();\n }\n }\n\n public async archive(threadIdOrRemoteId: string) {\n const data = this.getItemById(threadIdOrRemoteId);\n if (!data) throw new Error(\"Thread not found\");\n if (data.status !== \"regular\")\n throw new Error(\"Thread is not yet initialized or already archived\");\n\n await this._ensureThreadIsNotMain(data.id);\n\n return this._state.optimisticUpdate({\n execute: async () => {\n const { remoteId } = await data.initializeTask;\n return this._options.adapter.archive(remoteId);\n },\n optimistic: (state) => {\n return updateStatusReducer(state, data.id, \"archived\");\n },\n });\n }\n\n public unarchive(threadIdOrRemoteId: string): Promise<void> {\n const data = this.getItemById(threadIdOrRemoteId);\n if (!data) throw new Error(\"Thread not found\");\n if (data.status !== \"archived\") throw new Error(\"Thread is not archived\");\n\n return this._state.optimisticUpdate({\n execute: async () => {\n try {\n const { remoteId } = await data.initializeTask;\n return await this._options.adapter.unarchive(remoteId);\n } catch (error) {\n await this._ensureThreadIsNotMain(data.id);\n throw error;\n }\n },\n optimistic: (state) => {\n return updateStatusReducer(state, data.id, \"regular\");\n },\n });\n }\n\n public async delete(threadIdOrRemoteId: string) {\n const data = this.getItemById(threadIdOrRemoteId);\n if (!data) throw new Error(\"Thread not found\");\n if (data.status !== \"regular\" && data.status !== \"archived\")\n throw new Error(\"Thread is not yet initialized\");\n\n await this._ensureThreadIsNotMain(data.id);\n this._hookManager.stopThreadRuntime(data.id);\n\n return this._state.optimisticUpdate({\n execute: async () => {\n const { remoteId } = await data.initializeTask;\n return await this._options.adapter.delete(remoteId);\n },\n optimistic: (state) => {\n return updateStatusReducer(state, data.id, \"deleted\");\n },\n });\n }\n\n public async detach(threadIdOrRemoteId: string): Promise<void> {\n const data = this.getItemById(threadIdOrRemoteId);\n if (!data) throw new Error(\"Thread not found\");\n if (data.status !== \"regular\" && data.status !== \"archived\")\n throw new Error(\"Thread is not yet initialized\");\n\n await this._ensureThreadIsNotMain(data.id);\n this._hookManager.stopThreadRuntime(data.id);\n }\n\n private useBoundIds = create<string[]>(() => []);\n\n public __internal_RenderComponent: FC = () => {\n const id = useId();\n useEffect(() => {\n this.useBoundIds.setState((s) => [...s, id], true);\n return () => {\n this.useBoundIds.setState((s) => s.filter((i) => i !== id), true);\n };\n }, [id]);\n\n const boundIds = this.useBoundIds();\n const { Provider } = this.useProvider();\n\n const adapters = {\n modelContext: this.contextProvider,\n };\n\n return (\n (boundIds.length === 0 || boundIds[0] === id) && (\n // only render if the component is the first one mounted\n <RuntimeAdapterProvider adapters={adapters}>\n <this._hookManager.__internal_RenderThreadRuntimes\n provider={Provider}\n />\n </RuntimeAdapterProvider>\n )\n );\n };\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"useCloudThreadListAdapter.d.ts","names":[],"sources":["../../../../src/react/runtimes/cloud/useCloudThreadListAdapter.tsx"],"mappings":";;;;KAiBK,UAAA;EACH,UAAU;AAAA;AAAA,KAGP,6BAAA;EACH,KAAA,GAAQ,cAAA;EAER,MAAA,UAAgB,OAAA,CAAQ,UAAA;EACxB,MAAA,KAAW,QAAA,aAAqB,OAAA;AAAA;AAAA,cAUrB,yBAAA,GACX,OAAA,EAAS,6BAAA,KACR,uBAoHF"}
1
+ {"version":3,"file":"useCloudThreadListAdapter.d.ts","names":[],"sources":["../../../../src/react/runtimes/cloud/useCloudThreadListAdapter.tsx"],"mappings":";;;;KAkBK,UAAA;EACH,UAAU;AAAA;AAAA,KAGP,6BAAA;EACH,KAAA,GAAQ,cAAA;EAER,MAAA,UAAgB,OAAA,CAAQ,UAAA;EACxB,MAAA,KAAW,QAAA,aAAqB,OAAA;AAAA;AAAA,cAarB,yBAAA,GACX,OAAA,EAAS,6BAAA,KACR,uBAyHF"}
@@ -1,4 +1,5 @@
1
1
  import { InMemoryThreadListAdapter } from "../../../runtimes/remote-thread-list/adapter/in-memory.js";
2
+ import { isRecord } from "../../../utils/json/is-json.js";
2
3
  import { RuntimeAdapterProvider } from "../RuntimeAdapterProvider.js";
3
4
  import { useAssistantCloudThreadHistoryAdapter } from "./AssistantCloudThreadHistoryAdapter.js";
4
5
  import { CloudFileAttachmentAdapter } from "./CloudFileAttachmentAdapter.js";
@@ -6,6 +7,7 @@ import { useCallback, useEffect, useMemo, useRef } from "react";
6
7
  import { jsx } from "react/jsx-runtime";
7
8
  import { AssistantCloud } from "assistant-cloud";
8
9
  //#region src/react/runtimes/cloud/useCloudThreadListAdapter.tsx
10
+ const toCustom = (value) => isRecord(value) ? value : void 0;
9
11
  const baseUrl = typeof process !== "undefined" && process?.env?.NEXT_PUBLIC_ASSISTANT_BASE_URL;
10
12
  const autoCloud = baseUrl ? new AssistantCloud({
11
13
  baseUrl,
@@ -49,7 +51,8 @@ const useCloudThreadListAdapter = (adapter) => {
49
51
  status: t.is_archived ? "archived" : "regular",
50
52
  remoteId: t.id,
51
53
  title: t.title,
52
- externalId: t.external_id ?? void 0
54
+ externalId: t.external_id ?? void 0,
55
+ custom: toCustom(t.metadata)
53
56
  })) };
54
57
  },
55
58
  initialize: async () => {
@@ -67,6 +70,9 @@ const useCloudThreadListAdapter = (adapter) => {
67
70
  rename: async (threadId, newTitle) => {
68
71
  return cloud.threads.update(threadId, { title: newTitle });
69
72
  },
73
+ updateCustom: async (threadId, custom) => {
74
+ return cloud.threads.update(threadId, { metadata: custom ?? null });
75
+ },
70
76
  archive: async (threadId) => {
71
77
  return cloud.threads.update(threadId, { is_archived: true });
72
78
  },
@@ -94,7 +100,8 @@ const useCloudThreadListAdapter = (adapter) => {
94
100
  status: thread.is_archived ? "archived" : "regular",
95
101
  remoteId: thread.id,
96
102
  title: thread.title,
97
- externalId: thread.external_id ?? void 0
103
+ externalId: thread.external_id ?? void 0,
104
+ custom: toCustom(thread.metadata)
98
105
  };
99
106
  },
100
107
  unstable_Provider
@@ -1 +1 @@
1
- {"version":3,"file":"useCloudThreadListAdapter.js","names":[],"sources":["../../../../src/react/runtimes/cloud/useCloudThreadListAdapter.tsx"],"sourcesContent":["declare const process: { env: Record<string, string | undefined> };\n\nimport {\n type FC,\n type PropsWithChildren,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n} from \"react\";\nimport { AssistantCloud } from \"assistant-cloud\";\nimport type { RemoteThreadListAdapter } from \"../../../runtimes/remote-thread-list/types\";\nimport { InMemoryThreadListAdapter } from \"../../../runtimes/remote-thread-list/adapter/in-memory\";\nimport { useAssistantCloudThreadHistoryAdapter } from \"./AssistantCloudThreadHistoryAdapter\";\nimport { RuntimeAdapterProvider } from \"../RuntimeAdapterProvider\";\nimport { CloudFileAttachmentAdapter } from \"./CloudFileAttachmentAdapter\";\n\ntype ThreadData = {\n externalId: string | undefined;\n};\n\ntype CloudThreadListAdapterOptions = {\n cloud?: AssistantCloud | undefined;\n\n create?: (() => Promise<ThreadData>) | undefined;\n delete?: ((threadId: string) => Promise<void>) | undefined;\n};\n\nconst baseUrl =\n typeof process !== \"undefined\" &&\n process?.env?.NEXT_PUBLIC_ASSISTANT_BASE_URL;\nconst autoCloud = baseUrl\n ? new AssistantCloud({ baseUrl, anonymous: true })\n : undefined;\n\nexport const useCloudThreadListAdapter = (\n adapter: CloudThreadListAdapterOptions,\n): RemoteThreadListAdapter => {\n const adapterRef = useRef(adapter);\n useEffect(() => {\n adapterRef.current = adapter;\n }, [adapter]);\n\n const unstable_Provider = useCallback<FC<PropsWithChildren>>(\n function Provider({ children }) {\n const history = useAssistantCloudThreadHistoryAdapter({\n get current() {\n return adapterRef.current.cloud ?? autoCloud!;\n },\n });\n const cloudInstance = adapterRef.current.cloud ?? autoCloud!;\n const attachments = useMemo(\n () => new CloudFileAttachmentAdapter(cloudInstance),\n [cloudInstance],\n );\n\n const adapters = useMemo(\n () => ({\n history,\n attachments,\n }),\n [history, attachments],\n );\n\n return (\n <RuntimeAdapterProvider adapters={adapters}>\n {children}\n </RuntimeAdapterProvider>\n );\n },\n [],\n );\n\n const cloud = adapter.cloud ?? autoCloud;\n if (!cloud) {\n const ref = adapterRef;\n const inMemory = new InMemoryThreadListAdapter();\n inMemory.initialize = async (threadId: string) => {\n const result = await ref.current.create?.();\n return { remoteId: threadId, externalId: result?.externalId };\n };\n return inMemory;\n }\n\n return {\n list: async () => {\n const { threads } = await cloud.threads.list();\n return {\n threads: threads.map((t) => ({\n status: t.is_archived ? \"archived\" : \"regular\",\n remoteId: t.id,\n title: t.title,\n externalId: t.external_id ?? undefined,\n })),\n };\n },\n\n initialize: async () => {\n const createTask = adapter.create?.() ?? Promise.resolve();\n const t = await createTask;\n const external_id = t ? t.externalId : undefined;\n const { thread_id: remoteId } = await cloud.threads.create({\n last_message_at: new Date(),\n external_id,\n });\n\n return { externalId: external_id, remoteId: remoteId };\n },\n\n rename: async (threadId, newTitle) => {\n return cloud.threads.update(threadId, { title: newTitle });\n },\n archive: async (threadId) => {\n return cloud.threads.update(threadId, { is_archived: true });\n },\n unarchive: async (threadId) => {\n return cloud.threads.update(threadId, { is_archived: false });\n },\n delete: async (threadId) => {\n await adapter.delete?.(threadId);\n return cloud.threads.delete(threadId);\n },\n\n generateTitle: async (threadId, messages) => {\n // Filter messages to only include content types the title generator understands\n // (reasoning, source, etc. are not needed for title generation)\n // TODO serialize these to a more efficient format\n const filteredMessages = messages.map((msg) => ({\n ...msg,\n content: msg.content.filter(\n (part) => part.type === \"text\" || part.type === \"tool-call\",\n ),\n }));\n\n return cloud.runs.stream({\n thread_id: threadId,\n assistant_id: \"system/thread_title\",\n messages: filteredMessages,\n });\n },\n\n fetch: async (threadId: string) => {\n const thread = await cloud.threads.get(threadId);\n return {\n status: thread.is_archived ? \"archived\" : \"regular\",\n remoteId: thread.id,\n title: thread.title,\n externalId: thread.external_id ?? undefined,\n };\n },\n\n unstable_Provider,\n };\n};\n"],"mappings":";;;;;;;;AA4BA,MAAM,UACJ,OAAO,YAAY,eACnB,SAAS,KAAK;AAChB,MAAM,YAAY,UACd,IAAI,eAAe;CAAE;CAAS,WAAW;AAAK,CAAC,IAC/C,KAAA;AAEJ,MAAa,6BACX,YAC4B;CAC5B,MAAM,aAAa,OAAO,OAAO;CACjC,gBAAgB;EACd,WAAW,UAAU;CACvB,GAAG,CAAC,OAAO,CAAC;CAEZ,MAAM,oBAAoB,YACxB,SAAS,SAAS,EAAE,YAAY;EAC9B,MAAM,UAAU,sCAAsC,EACpD,IAAI,UAAU;GACZ,OAAO,WAAW,QAAQ,SAAS;EACrC,EACF,CAAC;EACD,MAAM,gBAAgB,WAAW,QAAQ,SAAS;EAClD,MAAM,cAAc,cACZ,IAAI,2BAA2B,aAAa,GAClD,CAAC,aAAa,CAChB;EAUA,OACE,oBAAC,wBAAD;GAAwB,UATT,eACR;IACL;IACA;GACF,IACA,CAAC,SAAS,WAAW,CAIoB;GACtC;EACqB,CAAA;CAE5B,GACA,CAAC,CACH;CAEA,MAAM,QAAQ,QAAQ,SAAS;CAC/B,IAAI,CAAC,OAAO;EACV,MAAM,MAAM;EACZ,MAAM,WAAW,IAAI,0BAA0B;EAC/C,SAAS,aAAa,OAAO,aAAqB;GAEhD,OAAO;IAAE,UAAU;IAAU,aAAY,MADpB,IAAI,QAAQ,SAAS,IACO;GAAW;EAC9D;EACA,OAAO;CACT;CAEA,OAAO;EACL,MAAM,YAAY;GAChB,MAAM,EAAE,YAAY,MAAM,MAAM,QAAQ,KAAK;GAC7C,OAAO,EACL,SAAS,QAAQ,KAAK,OAAO;IAC3B,QAAQ,EAAE,cAAc,aAAa;IACrC,UAAU,EAAE;IACZ,OAAO,EAAE;IACT,YAAY,EAAE,eAAe,KAAA;GAC/B,EAAE,EACJ;EACF;EAEA,YAAY,YAAY;GAEtB,MAAM,IAAI,OADS,QAAQ,SAAS,KAAK,QAAQ,QAAQ;GAEzD,MAAM,cAAc,IAAI,EAAE,aAAa,KAAA;GACvC,MAAM,EAAE,WAAW,aAAa,MAAM,MAAM,QAAQ,OAAO;IACzD,iCAAiB,IAAI,KAAK;IAC1B;GACF,CAAC;GAED,OAAO;IAAE,YAAY;IAAuB;GAAS;EACvD;EAEA,QAAQ,OAAO,UAAU,aAAa;GACpC,OAAO,MAAM,QAAQ,OAAO,UAAU,EAAE,OAAO,SAAS,CAAC;EAC3D;EACA,SAAS,OAAO,aAAa;GAC3B,OAAO,MAAM,QAAQ,OAAO,UAAU,EAAE,aAAa,KAAK,CAAC;EAC7D;EACA,WAAW,OAAO,aAAa;GAC7B,OAAO,MAAM,QAAQ,OAAO,UAAU,EAAE,aAAa,MAAM,CAAC;EAC9D;EACA,QAAQ,OAAO,aAAa;GAC1B,MAAM,QAAQ,SAAS,QAAQ;GAC/B,OAAO,MAAM,QAAQ,OAAO,QAAQ;EACtC;EAEA,eAAe,OAAO,UAAU,aAAa;GAI3C,MAAM,mBAAmB,SAAS,KAAK,SAAS;IAC9C,GAAG;IACH,SAAS,IAAI,QAAQ,QAClB,SAAS,KAAK,SAAS,UAAU,KAAK,SAAS,WAClD;GACF,EAAE;GAEF,OAAO,MAAM,KAAK,OAAO;IACvB,WAAW;IACX,cAAc;IACd,UAAU;GACZ,CAAC;EACH;EAEA,OAAO,OAAO,aAAqB;GACjC,MAAM,SAAS,MAAM,MAAM,QAAQ,IAAI,QAAQ;GAC/C,OAAO;IACL,QAAQ,OAAO,cAAc,aAAa;IAC1C,UAAU,OAAO;IACjB,OAAO,OAAO;IACd,YAAY,OAAO,eAAe,KAAA;GACpC;EACF;EAEA;CACF;AACF"}
1
+ {"version":3,"file":"useCloudThreadListAdapter.js","names":[],"sources":["../../../../src/react/runtimes/cloud/useCloudThreadListAdapter.tsx"],"sourcesContent":["declare const process: { env: Record<string, string | undefined> };\n\nimport {\n type FC,\n type PropsWithChildren,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n} from \"react\";\nimport { AssistantCloud } from \"assistant-cloud\";\nimport type { RemoteThreadListAdapter } from \"../../../runtimes/remote-thread-list/types\";\nimport { InMemoryThreadListAdapter } from \"../../../runtimes/remote-thread-list/adapter/in-memory\";\nimport { useAssistantCloudThreadHistoryAdapter } from \"./AssistantCloudThreadHistoryAdapter\";\nimport { RuntimeAdapterProvider } from \"../RuntimeAdapterProvider\";\nimport { CloudFileAttachmentAdapter } from \"./CloudFileAttachmentAdapter\";\nimport { isRecord } from \"../../../utils/json/is-json\";\n\ntype ThreadData = {\n externalId: string | undefined;\n};\n\ntype CloudThreadListAdapterOptions = {\n cloud?: AssistantCloud | undefined;\n\n create?: (() => Promise<ThreadData>) | undefined;\n delete?: ((threadId: string) => Promise<void>) | undefined;\n};\n\nconst toCustom = (value: unknown): Record<string, unknown> | undefined =>\n isRecord(value) ? value : undefined;\n\nconst baseUrl =\n typeof process !== \"undefined\" &&\n process?.env?.NEXT_PUBLIC_ASSISTANT_BASE_URL;\nconst autoCloud = baseUrl\n ? new AssistantCloud({ baseUrl, anonymous: true })\n : undefined;\n\nexport const useCloudThreadListAdapter = (\n adapter: CloudThreadListAdapterOptions,\n): RemoteThreadListAdapter => {\n const adapterRef = useRef(adapter);\n useEffect(() => {\n adapterRef.current = adapter;\n }, [adapter]);\n\n const unstable_Provider = useCallback<FC<PropsWithChildren>>(\n function Provider({ children }) {\n const history = useAssistantCloudThreadHistoryAdapter({\n get current() {\n return adapterRef.current.cloud ?? autoCloud!;\n },\n });\n const cloudInstance = adapterRef.current.cloud ?? autoCloud!;\n const attachments = useMemo(\n () => new CloudFileAttachmentAdapter(cloudInstance),\n [cloudInstance],\n );\n\n const adapters = useMemo(\n () => ({\n history,\n attachments,\n }),\n [history, attachments],\n );\n\n return (\n <RuntimeAdapterProvider adapters={adapters}>\n {children}\n </RuntimeAdapterProvider>\n );\n },\n [],\n );\n\n const cloud = adapter.cloud ?? autoCloud;\n if (!cloud) {\n const ref = adapterRef;\n const inMemory = new InMemoryThreadListAdapter();\n inMemory.initialize = async (threadId: string) => {\n const result = await ref.current.create?.();\n return { remoteId: threadId, externalId: result?.externalId };\n };\n return inMemory;\n }\n\n return {\n list: async () => {\n const { threads } = await cloud.threads.list();\n return {\n threads: threads.map((t) => ({\n status: t.is_archived ? \"archived\" : \"regular\",\n remoteId: t.id,\n title: t.title,\n externalId: t.external_id ?? undefined,\n custom: toCustom(t.metadata),\n })),\n };\n },\n\n initialize: async () => {\n const createTask = adapter.create?.() ?? Promise.resolve();\n const t = await createTask;\n const external_id = t ? t.externalId : undefined;\n const { thread_id: remoteId } = await cloud.threads.create({\n last_message_at: new Date(),\n external_id,\n });\n\n return { externalId: external_id, remoteId: remoteId };\n },\n\n rename: async (threadId, newTitle) => {\n return cloud.threads.update(threadId, { title: newTitle });\n },\n updateCustom: async (threadId, custom) => {\n return cloud.threads.update(threadId, { metadata: custom ?? null });\n },\n archive: async (threadId) => {\n return cloud.threads.update(threadId, { is_archived: true });\n },\n unarchive: async (threadId) => {\n return cloud.threads.update(threadId, { is_archived: false });\n },\n delete: async (threadId) => {\n await adapter.delete?.(threadId);\n return cloud.threads.delete(threadId);\n },\n\n generateTitle: async (threadId, messages) => {\n // Filter messages to only include content types the title generator understands\n // (reasoning, source, etc. are not needed for title generation)\n // TODO serialize these to a more efficient format\n const filteredMessages = messages.map((msg) => ({\n ...msg,\n content: msg.content.filter(\n (part) => part.type === \"text\" || part.type === \"tool-call\",\n ),\n }));\n\n return cloud.runs.stream({\n thread_id: threadId,\n assistant_id: \"system/thread_title\",\n messages: filteredMessages,\n });\n },\n\n fetch: async (threadId: string) => {\n const thread = await cloud.threads.get(threadId);\n return {\n status: thread.is_archived ? \"archived\" : \"regular\",\n remoteId: thread.id,\n title: thread.title,\n externalId: thread.external_id ?? undefined,\n custom: toCustom(thread.metadata),\n };\n },\n\n unstable_Provider,\n };\n};\n"],"mappings":"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"}
@@ -34,6 +34,7 @@ type ThreadListItemRuntime = {
34
34
  unarchive?: boolean;
35
35
  }): Promise<void>;
36
36
  rename(newTitle: string): Promise<void>;
37
+ updateCustom(custom: Record<string, unknown> | undefined): Promise<void>;
37
38
  archive(): Promise<void>;
38
39
  unarchive(): Promise<void>;
39
40
  delete(): Promise<void>;
@@ -54,6 +55,7 @@ declare class ThreadListItemRuntimeImpl implements ThreadListItemRuntime {
54
55
  unarchive?: boolean;
55
56
  }): Promise<void>;
56
57
  rename(newTitle: string): Promise<void>;
58
+ updateCustom(custom: Record<string, unknown> | undefined): Promise<void>;
57
59
  archive(): Promise<void>;
58
60
  unarchive(): Promise<void>;
59
61
  delete(): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"thread-list-item-runtime.d.ts","names":[],"sources":["../../../src/runtime/api/thread-list-item-runtime.ts"],"mappings":";;;;;;;;KAKY,0BAAA;;;;AAAZ;;EAME,UAAA,EAAY,MAAA;EAMQ;;;;;EAApB,YAAA,EAAc,MAAM;AAAA;AAAA,KAGV,uBAAA,SAAgC,0BAA0B;AAAA,KAE1D,2BAAA,WAAsC,uBAAA,KAChD,OAAA,EAAS,0BAAA,CAA2B,CAAA;AAAA,KAQ1B,qBAAA;EAAA,SACD,IAAA,EAAM,yBAAA;EACf,QAAA,IAAY,mBAAA;EAEZ,UAAA,IAAc,OAAA;IAAU,QAAA;IAAkB,UAAA;EAAA;EAC1C,aAAA,IAAiB,OAAA;EAEjB,QAAA,CAAS,OAAA;IAAY,SAAA;EAAA,IAAwB,OAAA;EAC7C,MAAA,CAAO,QAAA,WAAmB,OAAA;EAC1B,OAAA,IAAW,OAAA;EACX,SAAA,IAAa,OAAA;EACb,MAAA,IAAU,OAAA;EAEV,MAAA;EAEA,SAAA,CAAU,QAAA,eAAuB,WAAA;EAEjC,WAAA,WAAsB,uBAAA,EACpB,KAAA,EAAO,CAAA,EACP,QAAA,EAAU,2BAAA,CAA4B,CAAA,IACrC,WAAA;EAEH,qBAAA,IAAyB,qBAAA;AAAA;AAAA,KAGf,0BAAA,GAA6B,qBAAA,CACvC,mBAAA,EACA,yBAAA;AAAA,cAGW,yBAAA,YAAqC,qBAAA;EAAA,QAMtC,KAAA;EAAA,QACA,kBAAA;EAAA,IANC,IAAA,IAAI,yBAAA;cAKL,KAAA,EAAO,0BAAA,EACP,kBAAA,EAAoB,4BAAA;EAAA,UAKpB,sBAAA;EAcH,QAAA,IAAY,mBAAA;EAIZ,QAAA,CAAS,OAAA;IAAY,SAAA;EAAA,IAAwB,OAAA;EAK7C,MAAA,CAAO,QAAA,WAAmB,OAAA;EAM1B,OAAA,IAAW,OAAA;EAMX,SAAA,IAAa,OAAA;EAMb,MAAA,IAAU,OAAA;EAMV,UAAA,IAAc,OAAA;IACnB,QAAA;IACA,UAAA;EAAA;EAMK,aAAA,IAAiB,OAAA;EAKjB,WAAA,WAAsB,uBAAA,EAC3B,KAAA,EAAO,CAAA,EACP,QAAA,EAAU,2BAAA,CAA4B,CAAA,IAAE,WAAA;EAkBnC,SAAA,CAAU,QAAA,eAAuB,WAAA;EAIjC,MAAA;EAMA,qBAAA,IAAyB,qBAAA;AAAA"}
1
+ {"version":3,"file":"thread-list-item-runtime.d.ts","names":[],"sources":["../../../src/runtime/api/thread-list-item-runtime.ts"],"mappings":";;;;;;;;KAKY,0BAAA;;;;AAAZ;;EAME,UAAA,EAAY,MAAA;EAMQ;;;;;EAApB,YAAA,EAAc,MAAM;AAAA;AAAA,KAGV,uBAAA,SAAgC,0BAA0B;AAAA,KAE1D,2BAAA,WAAsC,uBAAA,KAChD,OAAA,EAAS,0BAAA,CAA2B,CAAA;AAAA,KAQ1B,qBAAA;EAAA,SACD,IAAA,EAAM,yBAAA;EACf,QAAA,IAAY,mBAAA;EAEZ,UAAA,IAAc,OAAA;IAAU,QAAA;IAAkB,UAAA;EAAA;EAC1C,aAAA,IAAiB,OAAA;EAEjB,QAAA,CAAS,OAAA;IAAY,SAAA;EAAA,IAAwB,OAAA;EAC7C,MAAA,CAAO,QAAA,WAAmB,OAAA;EAC1B,YAAA,CAAa,MAAA,EAAQ,MAAA,gCAAsC,OAAA;EAC3D,OAAA,IAAW,OAAA;EACX,SAAA,IAAa,OAAA;EACb,MAAA,IAAU,OAAA;EAEV,MAAA;EAEA,SAAA,CAAU,QAAA,eAAuB,WAAA;EAEjC,WAAA,WAAsB,uBAAA,EACpB,KAAA,EAAO,CAAA,EACP,QAAA,EAAU,2BAAA,CAA4B,CAAA,IACrC,WAAA;EAEH,qBAAA,IAAyB,qBAAA;AAAA;AAAA,KAGf,0BAAA,GAA6B,qBAAA,CACvC,mBAAA,EACA,yBAAA;AAAA,cAGW,yBAAA,YAAqC,qBAAA;EAAA,QAMtC,KAAA;EAAA,QACA,kBAAA;EAAA,IANC,IAAA,IAAI,yBAAA;cAKL,KAAA,EAAO,0BAAA,EACP,kBAAA,EAAoB,4BAAA;EAAA,UAKpB,sBAAA;EAeH,QAAA,IAAY,mBAAA;EAIZ,QAAA,CAAS,OAAA;IAAY,SAAA;EAAA,IAAwB,OAAA;EAK7C,MAAA,CAAO,QAAA,WAAmB,OAAA;EAM1B,YAAA,CACL,MAAA,EAAQ,MAAA,gCACP,OAAA;EAWI,OAAA,IAAW,OAAA;EAMX,SAAA,IAAa,OAAA;EAMb,MAAA,IAAU,OAAA;EAMV,UAAA,IAAc,OAAA;IACnB,QAAA;IACA,UAAA;EAAA;EAMK,aAAA,IAAiB,OAAA;EAKjB,WAAA,WAAsB,uBAAA,EAC3B,KAAA,EAAO,CAAA,EACP,QAAA,EAAU,2BAAA,CAA4B,CAAA,IAAE,WAAA;EAkBnC,SAAA,CAAU,QAAA,eAAuB,WAAA;EAIjC,MAAA;EAMA,qBAAA,IAAyB,qBAAA;AAAA"}
@@ -13,6 +13,7 @@ var ThreadListItemRuntimeImpl = class {
13
13
  __internal_bindMethods() {
14
14
  this.switchTo = this.switchTo.bind(this);
15
15
  this.rename = this.rename.bind(this);
16
+ this.updateCustom = this.updateCustom.bind(this);
16
17
  this.archive = this.archive.bind(this);
17
18
  this.unarchive = this.unarchive.bind(this);
18
19
  this.delete = this.delete.bind(this);
@@ -34,6 +35,11 @@ var ThreadListItemRuntimeImpl = class {
34
35
  const state = this._core.getState();
35
36
  return this._threadListBinding.rename(state.id, newTitle);
36
37
  }
38
+ updateCustom(custom) {
39
+ const state = this._core.getState();
40
+ if (!this._threadListBinding.updateCustom) throw new Error("Thread list runtime does not support updating custom metadata");
41
+ return this._threadListBinding.updateCustom(state.id, custom);
42
+ }
37
43
  archive() {
38
44
  const state = this._core.getState();
39
45
  return this._threadListBinding.archive(state.id);
@@ -1 +1 @@
1
- {"version":3,"file":"thread-list-item-runtime.js","names":[],"sources":["../../../src/runtime/api/thread-list-item-runtime.ts"],"sourcesContent":["import type { Unsubscribe } from \"../../types/unsubscribe\";\nimport type { SubscribableWithState } from \"../../subscribable/subscribable\";\nimport type { ThreadListItemRuntimePath } from \"./paths\";\nimport type { ThreadListRuntimeCoreBinding } from \"./thread-list-runtime\";\n\nexport type ThreadListItemEventPayload = {\n /**\n * @deprecated State-derivable. Compare `s.threads.mainThreadId` against the\n * item's `s.threadListItem.id` via `useAuiState` instead. Kept for backward\n * compatibility.\n */\n switchedTo: Record<string, never>;\n /**\n * @deprecated State-derivable. Compare `s.threads.mainThreadId` against the\n * item's `s.threadListItem.id` via `useAuiState` instead. Kept for backward\n * compatibility.\n */\n switchedAway: Record<string, never>;\n};\n\nexport type ThreadListItemEventType = keyof ThreadListItemEventPayload;\n\nexport type ThreadListItemEventCallback<E extends ThreadListItemEventType> = (\n payload: ThreadListItemEventPayload[E],\n) => void;\n\nimport type { ThreadListItemState } from \"./bindings\";\nimport type { ThreadListItemStatus } from \"../interfaces/thread-list-runtime-core\";\n\nexport type { ThreadListItemState, ThreadListItemStatus };\n\nexport type ThreadListItemRuntime = {\n readonly path: ThreadListItemRuntimePath;\n getState(): ThreadListItemState;\n\n initialize(): Promise<{ remoteId: string; externalId: string | undefined }>;\n generateTitle(): Promise<void>;\n\n switchTo(options?: { unarchive?: boolean }): Promise<void>;\n rename(newTitle: string): Promise<void>;\n archive(): Promise<void>;\n unarchive(): Promise<void>;\n delete(): Promise<void>;\n\n detach(): void;\n\n subscribe(callback: () => void): Unsubscribe;\n\n unstable_on<E extends ThreadListItemEventType>(\n event: E,\n callback: ThreadListItemEventCallback<E>,\n ): Unsubscribe;\n\n __internal_getRuntime(): ThreadListItemRuntime;\n};\n\nexport type ThreadListItemStateBinding = SubscribableWithState<\n ThreadListItemState,\n ThreadListItemRuntimePath\n>;\n\nexport class ThreadListItemRuntimeImpl implements ThreadListItemRuntime {\n public get path() {\n return this._core.path;\n }\n\n constructor(\n private _core: ThreadListItemStateBinding,\n private _threadListBinding: ThreadListRuntimeCoreBinding,\n ) {\n this.__internal_bindMethods();\n }\n\n protected __internal_bindMethods() {\n this.switchTo = this.switchTo.bind(this);\n this.rename = this.rename.bind(this);\n this.archive = this.archive.bind(this);\n this.unarchive = this.unarchive.bind(this);\n this.delete = this.delete.bind(this);\n this.initialize = this.initialize.bind(this);\n this.generateTitle = this.generateTitle.bind(this);\n this.subscribe = this.subscribe.bind(this);\n this.unstable_on = this.unstable_on.bind(this);\n this.getState = this.getState.bind(this);\n this.detach = this.detach.bind(this);\n }\n\n public getState(): ThreadListItemState {\n return this._core.getState();\n }\n\n public switchTo(options?: { unarchive?: boolean }): Promise<void> {\n const state = this._core.getState();\n return this._threadListBinding.switchToThread(state.id, options);\n }\n\n public rename(newTitle: string): Promise<void> {\n const state = this._core.getState();\n\n return this._threadListBinding.rename(state.id, newTitle);\n }\n\n public archive(): Promise<void> {\n const state = this._core.getState();\n\n return this._threadListBinding.archive(state.id);\n }\n\n public unarchive(): Promise<void> {\n const state = this._core.getState();\n\n return this._threadListBinding.unarchive(state.id);\n }\n\n public delete(): Promise<void> {\n const state = this._core.getState();\n\n return this._threadListBinding.delete(state.id);\n }\n\n public initialize(): Promise<{\n remoteId: string;\n externalId: string | undefined;\n }> {\n const state = this._core.getState();\n return this._threadListBinding.initialize(state.id);\n }\n\n public generateTitle(): Promise<void> {\n const state = this._core.getState();\n return this._threadListBinding.generateTitle(state.id);\n }\n\n public unstable_on<E extends ThreadListItemEventType>(\n event: E,\n callback: ThreadListItemEventCallback<E>,\n ) {\n let prevIsMain = this._core.getState().isMain;\n let prevThreadId = this._core.getState().id;\n return this.subscribe(() => {\n const currentState = this._core.getState();\n const newIsMain = currentState.isMain;\n const newThreadId = currentState.id;\n if (prevIsMain === newIsMain && prevThreadId === newThreadId) return;\n prevIsMain = newIsMain;\n prevThreadId = newThreadId;\n\n if (event === \"switchedTo\" && !newIsMain) return;\n if (event === \"switchedAway\" && newIsMain) return;\n (callback as (payload?: unknown) => void)({});\n });\n }\n\n public subscribe(callback: () => void): Unsubscribe {\n return this._core.subscribe(callback);\n }\n\n public detach(): void {\n const state = this._core.getState();\n\n this._threadListBinding.detach(state.id);\n }\n\n public __internal_getRuntime(): ThreadListItemRuntime {\n return this;\n }\n}\n"],"mappings":";AA6DA,IAAa,4BAAb,MAAwE;CAM5D;CACA;CANV,IAAW,OAAO;EAChB,OAAO,KAAK,MAAM;CACpB;CAEA,YACE,OACA,oBACA;EAFQ,KAAA,QAAA;EACA,KAAA,qBAAA;EAER,KAAK,uBAAuB;CAC9B;CAEA,yBAAmC;EACjC,KAAK,WAAW,KAAK,SAAS,KAAK,IAAI;EACvC,KAAK,SAAS,KAAK,OAAO,KAAK,IAAI;EACnC,KAAK,UAAU,KAAK,QAAQ,KAAK,IAAI;EACrC,KAAK,YAAY,KAAK,UAAU,KAAK,IAAI;EACzC,KAAK,SAAS,KAAK,OAAO,KAAK,IAAI;EACnC,KAAK,aAAa,KAAK,WAAW,KAAK,IAAI;EAC3C,KAAK,gBAAgB,KAAK,cAAc,KAAK,IAAI;EACjD,KAAK,YAAY,KAAK,UAAU,KAAK,IAAI;EACzC,KAAK,cAAc,KAAK,YAAY,KAAK,IAAI;EAC7C,KAAK,WAAW,KAAK,SAAS,KAAK,IAAI;EACvC,KAAK,SAAS,KAAK,OAAO,KAAK,IAAI;CACrC;CAEA,WAAuC;EACrC,OAAO,KAAK,MAAM,SAAS;CAC7B;CAEA,SAAgB,SAAkD;EAChE,MAAM,QAAQ,KAAK,MAAM,SAAS;EAClC,OAAO,KAAK,mBAAmB,eAAe,MAAM,IAAI,OAAO;CACjE;CAEA,OAAc,UAAiC;EAC7C,MAAM,QAAQ,KAAK,MAAM,SAAS;EAElC,OAAO,KAAK,mBAAmB,OAAO,MAAM,IAAI,QAAQ;CAC1D;CAEA,UAAgC;EAC9B,MAAM,QAAQ,KAAK,MAAM,SAAS;EAElC,OAAO,KAAK,mBAAmB,QAAQ,MAAM,EAAE;CACjD;CAEA,YAAkC;EAChC,MAAM,QAAQ,KAAK,MAAM,SAAS;EAElC,OAAO,KAAK,mBAAmB,UAAU,MAAM,EAAE;CACnD;CAEA,SAA+B;EAC7B,MAAM,QAAQ,KAAK,MAAM,SAAS;EAElC,OAAO,KAAK,mBAAmB,OAAO,MAAM,EAAE;CAChD;CAEA,aAGG;EACD,MAAM,QAAQ,KAAK,MAAM,SAAS;EAClC,OAAO,KAAK,mBAAmB,WAAW,MAAM,EAAE;CACpD;CAEA,gBAAsC;EACpC,MAAM,QAAQ,KAAK,MAAM,SAAS;EAClC,OAAO,KAAK,mBAAmB,cAAc,MAAM,EAAE;CACvD;CAEA,YACE,OACA,UACA;EACA,IAAI,aAAa,KAAK,MAAM,SAAS,EAAE;EACvC,IAAI,eAAe,KAAK,MAAM,SAAS,EAAE;EACzC,OAAO,KAAK,gBAAgB;GAC1B,MAAM,eAAe,KAAK,MAAM,SAAS;GACzC,MAAM,YAAY,aAAa;GAC/B,MAAM,cAAc,aAAa;GACjC,IAAI,eAAe,aAAa,iBAAiB,aAAa;GAC9D,aAAa;GACb,eAAe;GAEf,IAAI,UAAU,gBAAgB,CAAC,WAAW;GAC1C,IAAI,UAAU,kBAAkB,WAAW;GAC3C,SAA0C,CAAC,CAAC;EAC9C,CAAC;CACH;CAEA,UAAiB,UAAmC;EAClD,OAAO,KAAK,MAAM,UAAU,QAAQ;CACtC;CAEA,SAAsB;EACpB,MAAM,QAAQ,KAAK,MAAM,SAAS;EAElC,KAAK,mBAAmB,OAAO,MAAM,EAAE;CACzC;CAEA,wBAAsD;EACpD,OAAO;CACT;AACF"}
1
+ {"version":3,"file":"thread-list-item-runtime.js","names":[],"sources":["../../../src/runtime/api/thread-list-item-runtime.ts"],"sourcesContent":["import type { Unsubscribe } from \"../../types/unsubscribe\";\nimport type { SubscribableWithState } from \"../../subscribable/subscribable\";\nimport type { ThreadListItemRuntimePath } from \"./paths\";\nimport type { ThreadListRuntimeCoreBinding } from \"./thread-list-runtime\";\n\nexport type ThreadListItemEventPayload = {\n /**\n * @deprecated State-derivable. Compare `s.threads.mainThreadId` against the\n * item's `s.threadListItem.id` via `useAuiState` instead. Kept for backward\n * compatibility.\n */\n switchedTo: Record<string, never>;\n /**\n * @deprecated State-derivable. Compare `s.threads.mainThreadId` against the\n * item's `s.threadListItem.id` via `useAuiState` instead. Kept for backward\n * compatibility.\n */\n switchedAway: Record<string, never>;\n};\n\nexport type ThreadListItemEventType = keyof ThreadListItemEventPayload;\n\nexport type ThreadListItemEventCallback<E extends ThreadListItemEventType> = (\n payload: ThreadListItemEventPayload[E],\n) => void;\n\nimport type { ThreadListItemState } from \"./bindings\";\nimport type { ThreadListItemStatus } from \"../interfaces/thread-list-runtime-core\";\n\nexport type { ThreadListItemState, ThreadListItemStatus };\n\nexport type ThreadListItemRuntime = {\n readonly path: ThreadListItemRuntimePath;\n getState(): ThreadListItemState;\n\n initialize(): Promise<{ remoteId: string; externalId: string | undefined }>;\n generateTitle(): Promise<void>;\n\n switchTo(options?: { unarchive?: boolean }): Promise<void>;\n rename(newTitle: string): Promise<void>;\n updateCustom(custom: Record<string, unknown> | undefined): Promise<void>;\n archive(): Promise<void>;\n unarchive(): Promise<void>;\n delete(): Promise<void>;\n\n detach(): void;\n\n subscribe(callback: () => void): Unsubscribe;\n\n unstable_on<E extends ThreadListItemEventType>(\n event: E,\n callback: ThreadListItemEventCallback<E>,\n ): Unsubscribe;\n\n __internal_getRuntime(): ThreadListItemRuntime;\n};\n\nexport type ThreadListItemStateBinding = SubscribableWithState<\n ThreadListItemState,\n ThreadListItemRuntimePath\n>;\n\nexport class ThreadListItemRuntimeImpl implements ThreadListItemRuntime {\n public get path() {\n return this._core.path;\n }\n\n constructor(\n private _core: ThreadListItemStateBinding,\n private _threadListBinding: ThreadListRuntimeCoreBinding,\n ) {\n this.__internal_bindMethods();\n }\n\n protected __internal_bindMethods() {\n this.switchTo = this.switchTo.bind(this);\n this.rename = this.rename.bind(this);\n this.updateCustom = this.updateCustom.bind(this);\n this.archive = this.archive.bind(this);\n this.unarchive = this.unarchive.bind(this);\n this.delete = this.delete.bind(this);\n this.initialize = this.initialize.bind(this);\n this.generateTitle = this.generateTitle.bind(this);\n this.subscribe = this.subscribe.bind(this);\n this.unstable_on = this.unstable_on.bind(this);\n this.getState = this.getState.bind(this);\n this.detach = this.detach.bind(this);\n }\n\n public getState(): ThreadListItemState {\n return this._core.getState();\n }\n\n public switchTo(options?: { unarchive?: boolean }): Promise<void> {\n const state = this._core.getState();\n return this._threadListBinding.switchToThread(state.id, options);\n }\n\n public rename(newTitle: string): Promise<void> {\n const state = this._core.getState();\n\n return this._threadListBinding.rename(state.id, newTitle);\n }\n\n public updateCustom(\n custom: Record<string, unknown> | undefined,\n ): Promise<void> {\n const state = this._core.getState();\n if (!this._threadListBinding.updateCustom) {\n throw new Error(\n \"Thread list runtime does not support updating custom metadata\",\n );\n }\n\n return this._threadListBinding.updateCustom(state.id, custom);\n }\n\n public archive(): Promise<void> {\n const state = this._core.getState();\n\n return this._threadListBinding.archive(state.id);\n }\n\n public unarchive(): Promise<void> {\n const state = this._core.getState();\n\n return this._threadListBinding.unarchive(state.id);\n }\n\n public delete(): Promise<void> {\n const state = this._core.getState();\n\n return this._threadListBinding.delete(state.id);\n }\n\n public initialize(): Promise<{\n remoteId: string;\n externalId: string | undefined;\n }> {\n const state = this._core.getState();\n return this._threadListBinding.initialize(state.id);\n }\n\n public generateTitle(): Promise<void> {\n const state = this._core.getState();\n return this._threadListBinding.generateTitle(state.id);\n }\n\n public unstable_on<E extends ThreadListItemEventType>(\n event: E,\n callback: ThreadListItemEventCallback<E>,\n ) {\n let prevIsMain = this._core.getState().isMain;\n let prevThreadId = this._core.getState().id;\n return this.subscribe(() => {\n const currentState = this._core.getState();\n const newIsMain = currentState.isMain;\n const newThreadId = currentState.id;\n if (prevIsMain === newIsMain && prevThreadId === newThreadId) return;\n prevIsMain = newIsMain;\n prevThreadId = newThreadId;\n\n if (event === \"switchedTo\" && !newIsMain) return;\n if (event === \"switchedAway\" && newIsMain) return;\n (callback as (payload?: unknown) => void)({});\n });\n }\n\n public subscribe(callback: () => void): Unsubscribe {\n return this._core.subscribe(callback);\n }\n\n public detach(): void {\n const state = this._core.getState();\n\n this._threadListBinding.detach(state.id);\n }\n\n public __internal_getRuntime(): ThreadListItemRuntime {\n return this;\n }\n}\n"],"mappings":";AA8DA,IAAa,4BAAb,MAAwE;CAM5D;CACA;CANV,IAAW,OAAO;EAChB,OAAO,KAAK,MAAM;CACpB;CAEA,YACE,OACA,oBACA;EAFQ,KAAA,QAAA;EACA,KAAA,qBAAA;EAER,KAAK,uBAAuB;CAC9B;CAEA,yBAAmC;EACjC,KAAK,WAAW,KAAK,SAAS,KAAK,IAAI;EACvC,KAAK,SAAS,KAAK,OAAO,KAAK,IAAI;EACnC,KAAK,eAAe,KAAK,aAAa,KAAK,IAAI;EAC/C,KAAK,UAAU,KAAK,QAAQ,KAAK,IAAI;EACrC,KAAK,YAAY,KAAK,UAAU,KAAK,IAAI;EACzC,KAAK,SAAS,KAAK,OAAO,KAAK,IAAI;EACnC,KAAK,aAAa,KAAK,WAAW,KAAK,IAAI;EAC3C,KAAK,gBAAgB,KAAK,cAAc,KAAK,IAAI;EACjD,KAAK,YAAY,KAAK,UAAU,KAAK,IAAI;EACzC,KAAK,cAAc,KAAK,YAAY,KAAK,IAAI;EAC7C,KAAK,WAAW,KAAK,SAAS,KAAK,IAAI;EACvC,KAAK,SAAS,KAAK,OAAO,KAAK,IAAI;CACrC;CAEA,WAAuC;EACrC,OAAO,KAAK,MAAM,SAAS;CAC7B;CAEA,SAAgB,SAAkD;EAChE,MAAM,QAAQ,KAAK,MAAM,SAAS;EAClC,OAAO,KAAK,mBAAmB,eAAe,MAAM,IAAI,OAAO;CACjE;CAEA,OAAc,UAAiC;EAC7C,MAAM,QAAQ,KAAK,MAAM,SAAS;EAElC,OAAO,KAAK,mBAAmB,OAAO,MAAM,IAAI,QAAQ;CAC1D;CAEA,aACE,QACe;EACf,MAAM,QAAQ,KAAK,MAAM,SAAS;EAClC,IAAI,CAAC,KAAK,mBAAmB,cAC3B,MAAM,IAAI,MACR,+DACF;EAGF,OAAO,KAAK,mBAAmB,aAAa,MAAM,IAAI,MAAM;CAC9D;CAEA,UAAgC;EAC9B,MAAM,QAAQ,KAAK,MAAM,SAAS;EAElC,OAAO,KAAK,mBAAmB,QAAQ,MAAM,EAAE;CACjD;CAEA,YAAkC;EAChC,MAAM,QAAQ,KAAK,MAAM,SAAS;EAElC,OAAO,KAAK,mBAAmB,UAAU,MAAM,EAAE;CACnD;CAEA,SAA+B;EAC7B,MAAM,QAAQ,KAAK,MAAM,SAAS;EAElC,OAAO,KAAK,mBAAmB,OAAO,MAAM,EAAE;CAChD;CAEA,aAGG;EACD,MAAM,QAAQ,KAAK,MAAM,SAAS;EAClC,OAAO,KAAK,mBAAmB,WAAW,MAAM,EAAE;CACpD;CAEA,gBAAsC;EACpC,MAAM,QAAQ,KAAK,MAAM,SAAS;EAClC,OAAO,KAAK,mBAAmB,cAAc,MAAM,EAAE;CACvD;CAEA,YACE,OACA,UACA;EACA,IAAI,aAAa,KAAK,MAAM,SAAS,EAAE;EACvC,IAAI,eAAe,KAAK,MAAM,SAAS,EAAE;EACzC,OAAO,KAAK,gBAAgB;GAC1B,MAAM,eAAe,KAAK,MAAM,SAAS;GACzC,MAAM,YAAY,aAAa;GAC/B,MAAM,cAAc,aAAa;GACjC,IAAI,eAAe,aAAa,iBAAiB,aAAa;GAC9D,aAAa;GACb,eAAe;GAEf,IAAI,UAAU,gBAAgB,CAAC,WAAW;GAC1C,IAAI,UAAU,kBAAkB,WAAW;GAC3C,SAA0C,CAAC,CAAC;EAC9C,CAAC;CACH;CAEA,UAAiB,UAAmC;EAClD,OAAO,KAAK,MAAM,UAAU,QAAQ;CACtC;CAEA,SAAsB;EACpB,MAAM,QAAQ,KAAK,MAAM,SAAS;EAElC,KAAK,mBAAmB,OAAO,MAAM,EAAE;CACzC;CAEA,wBAAsD;EACpD,OAAO;CACT;AACF"}
@@ -33,6 +33,7 @@ type ThreadListRuntimeCore = {
33
33
  loadMore?(): Promise<void>;
34
34
  detach(threadId: string): Promise<void>;
35
35
  rename(threadId: string, newTitle: string): Promise<void>;
36
+ updateCustom?(threadId: string, custom: Record<string, unknown> | undefined): Promise<void>;
36
37
  archive(threadId: string): Promise<void>;
37
38
  unarchive(threadId: string): Promise<void>;
38
39
  delete(threadId: string): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"thread-list-runtime-core.d.ts","names":[],"sources":["../../../src/runtime/interfaces/thread-list-runtime-core.ts"],"mappings":";;;;KAGY,oBAAA;AAAA,KAEA,uBAAA;EAAA,SACD,EAAA;EAAA,SACA,QAAA;EAAA,SACA,UAAA;EAAA,SAEA,MAAA,EAAQ,oBAAA;EAAA,SACR,KAAA;EAAA,SACA,MAAA,GAAS,MAAA;EAAA,SAET,OAAA,GAAU,iBAAA;AAAA;AAAA,KAGT,qBAAA;EAAA,SACD,SAAA;EAAA,SACA,aAAA;EAAA,SACA,OAAA;EACT,YAAA;EACA,WAAA;EAEA,SAAA;EACA,iBAAA;EAAA,SAES,WAAA,EAAa,QAAA,CAAS,MAAA,SAAe,uBAAA;EAE9C,wBAAA,IAA4B,iBAAA;EAC5B,oBAAA,CAAqB,QAAA,WAAmB,iBAAA;EAExC,WAAA,CAAY,QAAA,WAAmB,uBAAA;EAE/B,cAAA,CACE,QAAA,UACA,OAAA;IAAY,SAAA;EAAA,IACX,OAAA;EACH,iBAAA,IAAqB,OAAA;EAErB,qBAAA,IAAyB,OAAA;EACzB,MAAA,KAAW,OAAA;EACX,QAAA,KAAa,OAAA;EAEb,MAAA,CAAO,QAAA,WAAmB,OAAA;EAC1B,MAAA,CAAO,QAAA,UAAkB,QAAA,WAAmB,OAAA;EAC5C,OAAA,CAAQ,QAAA,WAAmB,OAAA;EAC3B,SAAA,CAAU,QAAA,WAAmB,OAAA;EAC7B,MAAA,CAAO,QAAA,WAAmB,OAAA;EAE1B,UAAA,CACE,QAAA,WACC,OAAA;IAAU,QAAA;IAAkB,UAAA;EAAA;EAC/B,aAAA,CAAc,QAAA,WAAmB,OAAA;EAEjC,SAAA,CAAU,QAAA,eAAuB,WAAA;AAAA"}
1
+ {"version":3,"file":"thread-list-runtime-core.d.ts","names":[],"sources":["../../../src/runtime/interfaces/thread-list-runtime-core.ts"],"mappings":";;;;KAGY,oBAAA;AAAA,KAEA,uBAAA;EAAA,SACD,EAAA;EAAA,SACA,QAAA;EAAA,SACA,UAAA;EAAA,SAEA,MAAA,EAAQ,oBAAA;EAAA,SACR,KAAA;EAAA,SACA,MAAA,GAAS,MAAA;EAAA,SAET,OAAA,GAAU,iBAAA;AAAA;AAAA,KAGT,qBAAA;EAAA,SACD,SAAA;EAAA,SACA,aAAA;EAAA,SACA,OAAA;EACT,YAAA;EACA,WAAA;EAEA,SAAA;EACA,iBAAA;EAAA,SAES,WAAA,EAAa,QAAA,CAAS,MAAA,SAAe,uBAAA;EAE9C,wBAAA,IAA4B,iBAAA;EAC5B,oBAAA,CAAqB,QAAA,WAAmB,iBAAA;EAExC,WAAA,CAAY,QAAA,WAAmB,uBAAA;EAE/B,cAAA,CACE,QAAA,UACA,OAAA;IAAY,SAAA;EAAA,IACX,OAAA;EACH,iBAAA,IAAqB,OAAA;EAErB,qBAAA,IAAyB,OAAA;EACzB,MAAA,KAAW,OAAA;EACX,QAAA,KAAa,OAAA;EAEb,MAAA,CAAO,QAAA,WAAmB,OAAA;EAC1B,MAAA,CAAO,QAAA,UAAkB,QAAA,WAAmB,OAAA;EAC5C,YAAA,EACE,QAAA,UACA,MAAA,EAAQ,MAAA,gCACP,OAAA;EACH,OAAA,CAAQ,QAAA,WAAmB,OAAA;EAC3B,SAAA,CAAU,QAAA,WAAmB,OAAA;EAC7B,MAAA,CAAO,QAAA,WAAmB,OAAA;EAE1B,UAAA,CACE,QAAA,WACC,OAAA;IAAU,QAAA;IAAkB,UAAA;EAAA;EAC/B,aAAA,CAAc,QAAA,WAAmB,OAAA;EAEjC,SAAA,CAAU,QAAA,eAAuB,WAAA;AAAA"}
@@ -16,6 +16,7 @@ type ExternalStoreThreadData<TState extends "regular" | "archived"> = {
16
16
  remoteId?: string | undefined;
17
17
  externalId?: string | undefined;
18
18
  title?: string | undefined;
19
+ custom?: Record<string, unknown> | undefined;
19
20
  };
20
21
  type ExternalStoreThreadListAdapter = {
21
22
  /**
@@ -34,6 +35,7 @@ type ExternalStoreThreadListAdapter = {
34
35
  */
35
36
  onSwitchToThread?: ((threadId: string) => Promise<void> | void) | undefined;
36
37
  onRename?: (threadId: string, newTitle: string) => (Promise<void> | void) | undefined;
38
+ onUpdateCustom?: ((threadId: string, custom: Record<string, unknown> | undefined) => Promise<void> | void) | undefined;
37
39
  onArchive?: ((threadId: string) => Promise<void> | void) | undefined;
38
40
  onUnarchive?: ((threadId: string) => Promise<void> | void) | undefined;
39
41
  onDelete?: ((threadId: string) => Promise<void> | void) | undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"external-store-adapter.d.ts","names":[],"sources":["../../../src/runtimes/external-store/external-store-adapter.ts"],"mappings":";;;;;;;;;;;;KAoBY,uBAAA;EACV,MAAA,EAAQ,MAAM;EACd,EAAA;EACA,QAAA;EACA,UAAA;EACA,KAAA;AAAA;AAAA,KAGU,8BAAA;EAPF;;;EAWR,QAAA;EACA,SAAA;EACA,OAAA,YAAmB,uBAAA;EACnB,eAAA,YAA2B,uBAAA;EAPjB;;;EAWV,mBAAA,UAA6B,OAAA;EAJF;;;EAQ3B,gBAAA,KAAqB,QAAA,aAAqB,OAAA;EAC1C,QAAA,IACE,QAAA,UACA,QAAA,cACI,OAAA;EACN,SAAA,KAAc,QAAA,aAAqB,OAAA;EACnC,WAAA,KAAgB,QAAA,aAAqB,OAAA;EACrC,QAAA,KAAa,QAAA,aAAqB,OAAA;AAAA;AAAA,KAGxB,6BAAA,OACV,OAAA,EAAS,CAAA,EACT,GAAA,aACG,iBAAiB;AAAA,KAEjB,oCAAA;EACH,cAAA,EAAgB,6BAA6B,CAAC,CAAA;AAAA;AAAA,KAG3C,wBAAA;EA3BwB;;;;;;EAkC3B,UAAA;EAxBE;;;;;;;;EAiCF,cAAA;EA5BA;;;;AAAyC;AAG3C;;;EAkCE,SAAA;EACA,SAAA;EACA,QAAA,YAAoB,CAAA;EACpB,iBAAA,GAAoB,yBAAA;EACpB,WAAA,YAAuB,gBAAA;EACvB,KAAA,GAAQ,iBAAA;EACR,MAAA;EAEA,WAAA,KAAgB,QAAA,WAAmB,CAAA;EACnC,QAAA,KAAa,QAAA,WAAmB,aAAA;EAChC,qBAAA;EACA,mBAAA,KAAwB,KAAA;EACxB,KAAA,GAAQ,OAAA,EAAS,aAAA,KAAkB,OAAA;EACnC,MAAA,KAAW,OAAA,EAAS,aAAA,KAAkB,OAAA;EACtC,QAAA,KACM,QAAA,iBAAyB,MAAA,EAAQ,cAAA,KAAmB,OAAA;EAE1D,QAAA,KAAa,MAAA,EAAQ,eAAA,KAAoB,OAAA;EACzC,QAAA,UAAkB,OAAA;EAClB,eAAA,KACM,OAAA,EAAS,oBAAA,KAAyB,OAAA;EAExC,gBAAA,KACM,OAAA;IAAW,UAAA;IAAoB,OAAA;EAAA;EAErC,uBAAA,KACM,OAAA,EAAS,4BAAA,KAAiC,OAAA;EAEhD,cAAA,GAAiB,6BAAA,CAA8B,CAAA;EAC/C,QAAA;IAEM,WAAA,GAAc,iBAAA;IACd,MAAA,GAAS,sBAAA;IACT,SAAA,GAAY,gBAAA;IACZ,KAAA,GAAQ,oBAAA;IACR,QAAA,GAAW,eAAA;IAtBG;;;IA0Bd,UAAA,GAAa,8BAAA;EAAA;EAGnB,qBAAA;IAEM,IAAA;EAAA;EAxBkC;;;;;;;;;;;;;;;;;;;EA8CxC,8BAAA;EAhEA;;;;;;;;;EA0EA,eAAA,KACM,QAAA,EAAU,MAAA,SAAe,mBAAA;AAAA;AAAA,KAIrB,oBAAA,KAAyB,aAAA,IACnC,wBAAA,CAAyB,CAAA,KACtB,CAAA,SAAU,aAAA,YAEP,oCAAA,CAAqC,CAAA"}
1
+ {"version":3,"file":"external-store-adapter.d.ts","names":[],"sources":["../../../src/runtimes/external-store/external-store-adapter.ts"],"mappings":";;;;;;;;;;;;KAoBY,uBAAA;EACV,MAAA,EAAQ,MAAA;EACR,EAAA;EACA,QAAA;EACA,UAAA;EACA,KAAA;EACA,MAAA,GAAS,MAAM;AAAA;AAAA,KAGL,8BAAA;EAPV;;;EAWA,QAAA;EACA,SAAA;EACA,OAAA,YAAmB,uBAAA;EACnB,eAAA,YAA2B,uBAAA;EAVZ;AAGjB;;EAWE,mBAAA,UAA6B,OAAA;EALV;;;EASnB,gBAAA,KAAqB,QAAA,aAAqB,OAAA;EAC1C,QAAA,IACE,QAAA,UACA,QAAA,cACI,OAAA;EACN,cAAA,KAEM,QAAA,UACA,MAAA,EAAQ,MAAA,kCACL,OAAA;EAET,SAAA,KAAc,QAAA,aAAqB,OAAA;EACnC,WAAA,KAAgB,QAAA,aAAqB,OAAA;EACrC,QAAA,KAAa,QAAA,aAAqB,OAAA;AAAA;AAAA,KAGxB,6BAAA,OACV,OAAA,EAAS,CAAA,EACT,GAAA,aACG,iBAAiB;AAAA,KAEjB,oCAAA;EACH,cAAA,EAAgB,6BAA6B,CAAC,CAAA;AAAA;AAAA,KAG3C,wBAAA;EAlCgB;;;;;;EAyCnB,UAAA;EAhC0C;;;;;;;;EAyC1C,cAAA;EAhCS;;;;;;;;EAyCT,SAAA;EACA,SAAA;EACA,QAAA,YAAoB,CAAA;EACpB,iBAAA,GAAoB,yBAAA;EACpB,WAAA,YAAuB,gBAAA;EACvB,KAAA,GAAQ,iBAAA;EACR,MAAA;EAEA,WAAA,KAAgB,QAAA,WAAmB,CAAA;EACnC,QAAA,KAAa,QAAA,WAAmB,aAAA;EAChC,qBAAA;EACA,mBAAA,KAAwB,KAAA;EACxB,KAAA,GAAQ,OAAA,EAAS,aAAA,KAAkB,OAAA;EACnC,MAAA,KAAW,OAAA,EAAS,aAAA,KAAkB,OAAA;EACtC,QAAA,KACM,QAAA,iBAAyB,MAAA,EAAQ,cAAA,KAAmB,OAAA;EAE1D,QAAA,KAAa,MAAA,EAAQ,eAAA,KAAoB,OAAA;EACzC,QAAA,UAAkB,OAAA;EAClB,eAAA,KACM,OAAA,EAAS,oBAAA,KAAyB,OAAA;EAExC,gBAAA,KACM,OAAA;IAAW,UAAA;IAAoB,OAAA;EAAA;EAErC,uBAAA,KACM,OAAA,EAAS,4BAAA,KAAiC,OAAA;EAEhD,cAAA,GAAiB,6BAAA,CAA8B,CAAA;EAC/C,QAAA;IAEM,WAAA,GAAc,iBAAA;IACd,MAAA,GAAS,sBAAA;IACT,SAAA,GAAY,gBAAA;IACZ,KAAA,GAAQ,oBAAA;IACR,QAAA,GAAW,eAAA;IAhCG;;;IAoCd,UAAA,GAAa,8BAAA;EAAA;EAGnB,qBAAA;IAEM,IAAA;EAAA;EA/BgC;;;;;;;;;;;;;;;;;;;EAqDtC,8BAAA;EAWsB;;;;;;;;;EADtB,eAAA,KACM,QAAA,EAAU,MAAA,SAAe,mBAAA;AAAA;AAAA,KAIrB,oBAAA,KAAyB,aAAA,IACnC,wBAAA,CAAyB,CAAA,KACtB,CAAA,SAAU,aAAA,YAEP,oCAAA,CAAqC,CAAA"}
@@ -30,6 +30,7 @@ declare class ExternalStoreThreadListRuntimeCore implements ThreadListRuntimeCor
30
30
  }): Promise<void>;
31
31
  switchToNewThread(): Promise<void>;
32
32
  rename(threadId: string, newTitle: string): Promise<void>;
33
+ updateCustom(threadId: string, custom: Record<string, unknown> | undefined): Promise<void>;
33
34
  detach(): Promise<void>;
34
35
  archive(threadId: string): Promise<void>;
35
36
  unarchive(threadId: string): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"external-store-thread-list-runtime-core.d.ts","names":[],"sources":["../../../src/runtimes/external-store/external-store-thread-list-runtime-core.ts"],"mappings":";;;;;;KAQY,0BAAA,SAAmC,8BAA8B;AAAA,cAgBhE,kCAAA,YAA8C,qBAAA;EAAA,QAwC/C,aAAA;EAAA,QAvCF,aAAA;EAAA,QACA,QAAA;EAAA,QACA,gBAAA;EAAA,QACA,WAAA;EAAA,QAEA,OAAA;EAAA,IAEG,SAAA;EAAA,IAIA,WAAA;EAAA,IAIA,SAAA;EAAA,IAIA,iBAAA;EAAA,IAIA,WAAA,IAAW,QAAA,CAAA,MAAA,SAAA,uBAAA;EAIf,qBAAA,IAAqB,OAAA;EAAA,QAIpB,WAAA;EAAA,IAEG,YAAA;cAKT,OAAA,EAAS,8BAAA,cACD,aAAA,EAAe,0BAAA;EAKlB,wBAAA,IAAwB,8BAAA;EAIxB,oBAAA;EAIA,WAAA,CAAY,QAAA,WAAgB,uBAAA;EAI5B,qBAAA,CACL,OAAA,EAAS,8BAAA,EACT,WAAA;EAqFW,cAAA,CACX,QAAA,UACA,QAAA;IAAa,SAAA;EAAA,IACZ,OAAA;EAUU,iBAAA,IAAqB,OAAA;EAUrB,MAAA,CAAO,QAAA,UAAkB,QAAA,WAAmB,OAAA;EAQ5C,MAAA,IAAU,OAAA;EAIV,OAAA,CAAQ,QAAA,WAAmB,OAAA;EAQ3B,SAAA,CAAU,QAAA,WAAmB,OAAA;EAQ7B,MAAA,CAAO,QAAA,WAAmB,OAAA;EAQhC,UAAA,CACL,QAAA,WACC,OAAA;IAAU,QAAA;IAAkB,UAAA;EAAA;EAIxB,aAAA;EAAA,QAIC,cAAA;EAED,SAAA,CAAU,QAAA,eAAuB,WAAA;EAAA,QAKhC,kBAAA;AAAA"}
1
+ {"version":3,"file":"external-store-thread-list-runtime-core.d.ts","names":[],"sources":["../../../src/runtimes/external-store/external-store-thread-list-runtime-core.ts"],"mappings":";;;;;;KAQY,0BAAA,SAAmC,8BAA8B;AAAA,cAgBhE,kCAAA,YAA8C,qBAAA;EAAA,QAwC/C,aAAA;EAAA,QAvCF,aAAA;EAAA,QACA,QAAA;EAAA,QACA,gBAAA;EAAA,QACA,WAAA;EAAA,QAEA,OAAA;EAAA,IAEG,SAAA;EAAA,IAIA,WAAA;EAAA,IAIA,SAAA;EAAA,IAIA,iBAAA;EAAA,IAIA,WAAA,IAAW,QAAA,CAAA,MAAA,SAAA,uBAAA;EAIf,qBAAA,IAAqB,OAAA;EAAA,QAIpB,WAAA;EAAA,IAEG,YAAA;cAKT,OAAA,EAAS,8BAAA,cACD,aAAA,EAAe,0BAAA;EAKlB,wBAAA,IAAwB,8BAAA;EAIxB,oBAAA;EAIA,WAAA,CAAY,QAAA,WAAgB,uBAAA;EAI5B,qBAAA,CACL,OAAA,EAAS,8BAAA,EACT,WAAA;EAqFW,cAAA,CACX,QAAA,UACA,QAAA;IAAa,SAAA;EAAA,IACZ,OAAA;EAUU,iBAAA,IAAqB,OAAA;EAUrB,MAAA,CAAO,QAAA,UAAkB,QAAA,WAAmB,OAAA;EAQ5C,YAAA,CACX,QAAA,UACA,MAAA,EAAQ,MAAA,gCACP,OAAA;EAUU,MAAA,IAAU,OAAA;EAIV,OAAA,CAAQ,QAAA,WAAmB,OAAA;EAQ3B,SAAA,CAAU,QAAA,WAAmB,OAAA;EAQ7B,MAAA,CAAO,QAAA,WAAmB,OAAA;EAQhC,UAAA,CACL,QAAA,WACC,OAAA;IAAU,QAAA;IAAkB,UAAA;EAAA;EAIxB,aAAA;EAAA,QAIC,cAAA;EAED,SAAA,CAAU,QAAA,eAAuB,WAAA;EAAA,QAKhC,kBAAA;AAAA"}
@@ -108,6 +108,11 @@ var ExternalStoreThreadListRuntimeCore = class {
108
108
  if (!onRename) throw new Error("External store adapter does not support renaming");
109
109
  await onRename(threadId, newTitle);
110
110
  }
111
+ async updateCustom(threadId, custom) {
112
+ const onUpdateCustom = this.adapter.onUpdateCustom;
113
+ if (!onUpdateCustom) throw new Error("External store adapter does not support updating custom metadata");
114
+ await onUpdateCustom(threadId, custom);
115
+ }
111
116
  async detach() {}
112
117
  async archive(threadId) {
113
118
  const onArchive = this.adapter.onArchive;
@@ -1 +1 @@
1
- {"version":3,"file":"external-store-thread-list-runtime-core.js","names":[],"sources":["../../../src/runtimes/external-store/external-store-thread-list-runtime-core.ts"],"sourcesContent":["import type { Unsubscribe } from \"../../types/unsubscribe\";\nimport type { ExternalStoreThreadRuntimeCore } from \"./external-store-thread-runtime-core\";\nimport type {\n ThreadListItemCoreState,\n ThreadListRuntimeCore,\n} from \"../../runtime/interfaces/thread-list-runtime-core\";\nimport type { ExternalStoreThreadListAdapter } from \"./external-store-adapter\";\n\nexport type ExternalStoreThreadFactory = () => ExternalStoreThreadRuntimeCore;\n\nconst EMPTY_ARRAY = Object.freeze([]);\nconst DEFAULT_THREAD_ID = \"DEFAULT_THREAD_ID\";\nconst DEFAULT_THREADS = Object.freeze([DEFAULT_THREAD_ID]);\nconst DEFAULT_THREAD = Object.freeze({\n id: DEFAULT_THREAD_ID,\n remoteId: undefined,\n externalId: undefined,\n status: \"regular\",\n});\nconst RESOLVED_PROMISE = Promise.resolve();\nconst DEFAULT_THREAD_DATA = Object.freeze({\n [DEFAULT_THREAD_ID]: DEFAULT_THREAD,\n});\n\nexport class ExternalStoreThreadListRuntimeCore implements ThreadListRuntimeCore {\n private _mainThreadId: string = DEFAULT_THREAD_ID;\n private _threads: readonly string[] = DEFAULT_THREADS;\n private _archivedThreads: readonly string[] = EMPTY_ARRAY;\n private _threadData: Readonly<Record<string, ThreadListItemCoreState>> =\n DEFAULT_THREAD_DATA;\n private adapter: ExternalStoreThreadListAdapter = {};\n\n public get isLoading() {\n return this.adapter.isLoading ?? false;\n }\n\n public get newThreadId() {\n return undefined;\n }\n\n public get threadIds() {\n return this._threads;\n }\n\n public get archivedThreadIds() {\n return this._archivedThreads;\n }\n\n public get threadItems() {\n return this._threadData;\n }\n\n public getLoadThreadsPromise() {\n return RESOLVED_PROMISE;\n }\n\n private _mainThread!: ExternalStoreThreadRuntimeCore;\n\n public get mainThreadId() {\n return this._mainThreadId;\n }\n\n constructor(\n adapter: ExternalStoreThreadListAdapter = {},\n private threadFactory: ExternalStoreThreadFactory,\n ) {\n this.__internal_setAdapter(adapter, true);\n }\n\n public getMainThreadRuntimeCore() {\n return this._mainThread;\n }\n\n public getThreadRuntimeCore(): never {\n throw new Error(\"Method not implemented.\");\n }\n\n public getItemById(threadId: string) {\n return this._threadData[threadId];\n }\n\n public __internal_setAdapter(\n adapter: ExternalStoreThreadListAdapter,\n initialLoad = false,\n ) {\n const previousAdapter = this.adapter;\n this.adapter = adapter;\n\n const newThreadId = adapter.threadId ?? DEFAULT_THREAD_ID;\n const newThreads = adapter.threads ?? EMPTY_ARRAY;\n const newArchivedThreads = adapter.archivedThreads ?? EMPTY_ARRAY;\n\n const previousThreadId = previousAdapter.threadId ?? DEFAULT_THREAD_ID;\n const previousThreads = previousAdapter.threads ?? EMPTY_ARRAY;\n const previousArchivedThreads =\n previousAdapter.archivedThreads ?? EMPTY_ARRAY;\n\n if (\n !initialLoad &&\n previousThreadId === newThreadId &&\n previousThreads === newThreads &&\n previousArchivedThreads === newArchivedThreads\n ) {\n return;\n }\n\n if (\n previousThreads !== newThreads ||\n previousArchivedThreads !== newArchivedThreads ||\n previousThreadId !== newThreadId\n ) {\n this._threadData = {\n ...DEFAULT_THREAD_DATA,\n ...Object.fromEntries(\n adapter.threads?.map((t) => [\n t.id,\n {\n ...t,\n remoteId: t.remoteId,\n externalId: t.externalId,\n status: \"regular\",\n },\n ]) ?? [],\n ),\n ...Object.fromEntries(\n adapter.archivedThreads?.map((t) => [\n t.id,\n {\n ...t,\n remoteId: t.remoteId,\n externalId: t.externalId,\n status: \"archived\",\n },\n ]) ?? [],\n ),\n };\n }\n\n if (previousThreads !== newThreads) {\n this._threads = this.adapter.threads?.map((t) => t.id) ?? EMPTY_ARRAY;\n }\n\n if (previousArchivedThreads !== newArchivedThreads) {\n this._archivedThreads =\n this.adapter.archivedThreads?.map((t) => t.id) ?? EMPTY_ARRAY;\n }\n\n // `initialLoad ||`: `_mainThread!` must be assigned on construction.\n if (initialLoad || previousThreadId !== newThreadId) {\n this._mainThreadId = newThreadId;\n this._mainThread = this.threadFactory();\n }\n\n if (!this._threadData[this._mainThreadId]) {\n this._threadData = {\n ...this._threadData,\n [this._mainThreadId]: {\n id: this._mainThreadId,\n remoteId: undefined,\n externalId: undefined,\n status: \"regular\",\n },\n };\n }\n\n this._notifySubscribers();\n }\n\n public async switchToThread(\n threadId: string,\n _options?: { unarchive?: boolean },\n ): Promise<void> {\n if (this._mainThreadId === threadId) return;\n const onSwitchToThread = this.adapter.onSwitchToThread;\n if (!onSwitchToThread)\n throw new Error(\n \"External store adapter does not support switching to thread\",\n );\n await onSwitchToThread(threadId);\n }\n\n public async switchToNewThread(): Promise<void> {\n const onSwitchToNewThread = this.adapter.onSwitchToNewThread;\n if (!onSwitchToNewThread)\n throw new Error(\n \"External store adapter does not support switching to new thread\",\n );\n\n await onSwitchToNewThread();\n }\n\n public async rename(threadId: string, newTitle: string): Promise<void> {\n const onRename = this.adapter.onRename;\n if (!onRename)\n throw new Error(\"External store adapter does not support renaming\");\n\n await onRename(threadId, newTitle);\n }\n\n public async detach(): Promise<void> {\n // no-op\n }\n\n public async archive(threadId: string): Promise<void> {\n const onArchive = this.adapter.onArchive;\n if (!onArchive)\n throw new Error(\"External store adapter does not support archiving\");\n\n await onArchive(threadId);\n }\n\n public async unarchive(threadId: string): Promise<void> {\n const onUnarchive = this.adapter.onUnarchive;\n if (!onUnarchive)\n throw new Error(\"External store adapter does not support unarchiving\");\n\n await onUnarchive(threadId);\n }\n\n public async delete(threadId: string): Promise<void> {\n const onDelete = this.adapter.onDelete;\n if (!onDelete)\n throw new Error(\"External store adapter does not support deleting\");\n\n await onDelete(threadId);\n }\n\n public initialize(\n threadId: string,\n ): Promise<{ remoteId: string; externalId: string | undefined }> {\n return Promise.resolve({ remoteId: threadId, externalId: undefined });\n }\n\n public generateTitle(): never {\n throw new Error(\"Method not implemented.\");\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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"}
1
+ {"version":3,"file":"external-store-thread-list-runtime-core.js","names":[],"sources":["../../../src/runtimes/external-store/external-store-thread-list-runtime-core.ts"],"sourcesContent":["import type { Unsubscribe } from \"../../types/unsubscribe\";\nimport type { ExternalStoreThreadRuntimeCore } from \"./external-store-thread-runtime-core\";\nimport type {\n ThreadListItemCoreState,\n ThreadListRuntimeCore,\n} from \"../../runtime/interfaces/thread-list-runtime-core\";\nimport type { ExternalStoreThreadListAdapter } from \"./external-store-adapter\";\n\nexport type ExternalStoreThreadFactory = () => ExternalStoreThreadRuntimeCore;\n\nconst EMPTY_ARRAY = Object.freeze([]);\nconst DEFAULT_THREAD_ID = \"DEFAULT_THREAD_ID\";\nconst DEFAULT_THREADS = Object.freeze([DEFAULT_THREAD_ID]);\nconst DEFAULT_THREAD = Object.freeze({\n id: DEFAULT_THREAD_ID,\n remoteId: undefined,\n externalId: undefined,\n status: \"regular\",\n});\nconst RESOLVED_PROMISE = Promise.resolve();\nconst DEFAULT_THREAD_DATA = Object.freeze({\n [DEFAULT_THREAD_ID]: DEFAULT_THREAD,\n});\n\nexport class ExternalStoreThreadListRuntimeCore implements ThreadListRuntimeCore {\n private _mainThreadId: string = DEFAULT_THREAD_ID;\n private _threads: readonly string[] = DEFAULT_THREADS;\n private _archivedThreads: readonly string[] = EMPTY_ARRAY;\n private _threadData: Readonly<Record<string, ThreadListItemCoreState>> =\n DEFAULT_THREAD_DATA;\n private adapter: ExternalStoreThreadListAdapter = {};\n\n public get isLoading() {\n return this.adapter.isLoading ?? false;\n }\n\n public get newThreadId() {\n return undefined;\n }\n\n public get threadIds() {\n return this._threads;\n }\n\n public get archivedThreadIds() {\n return this._archivedThreads;\n }\n\n public get threadItems() {\n return this._threadData;\n }\n\n public getLoadThreadsPromise() {\n return RESOLVED_PROMISE;\n }\n\n private _mainThread!: ExternalStoreThreadRuntimeCore;\n\n public get mainThreadId() {\n return this._mainThreadId;\n }\n\n constructor(\n adapter: ExternalStoreThreadListAdapter = {},\n private threadFactory: ExternalStoreThreadFactory,\n ) {\n this.__internal_setAdapter(adapter, true);\n }\n\n public getMainThreadRuntimeCore() {\n return this._mainThread;\n }\n\n public getThreadRuntimeCore(): never {\n throw new Error(\"Method not implemented.\");\n }\n\n public getItemById(threadId: string) {\n return this._threadData[threadId];\n }\n\n public __internal_setAdapter(\n adapter: ExternalStoreThreadListAdapter,\n initialLoad = false,\n ) {\n const previousAdapter = this.adapter;\n this.adapter = adapter;\n\n const newThreadId = adapter.threadId ?? DEFAULT_THREAD_ID;\n const newThreads = adapter.threads ?? EMPTY_ARRAY;\n const newArchivedThreads = adapter.archivedThreads ?? EMPTY_ARRAY;\n\n const previousThreadId = previousAdapter.threadId ?? DEFAULT_THREAD_ID;\n const previousThreads = previousAdapter.threads ?? EMPTY_ARRAY;\n const previousArchivedThreads =\n previousAdapter.archivedThreads ?? EMPTY_ARRAY;\n\n if (\n !initialLoad &&\n previousThreadId === newThreadId &&\n previousThreads === newThreads &&\n previousArchivedThreads === newArchivedThreads\n ) {\n return;\n }\n\n if (\n previousThreads !== newThreads ||\n previousArchivedThreads !== newArchivedThreads ||\n previousThreadId !== newThreadId\n ) {\n this._threadData = {\n ...DEFAULT_THREAD_DATA,\n ...Object.fromEntries(\n adapter.threads?.map((t) => [\n t.id,\n {\n ...t,\n remoteId: t.remoteId,\n externalId: t.externalId,\n status: \"regular\",\n },\n ]) ?? [],\n ),\n ...Object.fromEntries(\n adapter.archivedThreads?.map((t) => [\n t.id,\n {\n ...t,\n remoteId: t.remoteId,\n externalId: t.externalId,\n status: \"archived\",\n },\n ]) ?? [],\n ),\n };\n }\n\n if (previousThreads !== newThreads) {\n this._threads = this.adapter.threads?.map((t) => t.id) ?? EMPTY_ARRAY;\n }\n\n if (previousArchivedThreads !== newArchivedThreads) {\n this._archivedThreads =\n this.adapter.archivedThreads?.map((t) => t.id) ?? EMPTY_ARRAY;\n }\n\n // `initialLoad ||`: `_mainThread!` must be assigned on construction.\n if (initialLoad || previousThreadId !== newThreadId) {\n this._mainThreadId = newThreadId;\n this._mainThread = this.threadFactory();\n }\n\n if (!this._threadData[this._mainThreadId]) {\n this._threadData = {\n ...this._threadData,\n [this._mainThreadId]: {\n id: this._mainThreadId,\n remoteId: undefined,\n externalId: undefined,\n status: \"regular\",\n },\n };\n }\n\n this._notifySubscribers();\n }\n\n public async switchToThread(\n threadId: string,\n _options?: { unarchive?: boolean },\n ): Promise<void> {\n if (this._mainThreadId === threadId) return;\n const onSwitchToThread = this.adapter.onSwitchToThread;\n if (!onSwitchToThread)\n throw new Error(\n \"External store adapter does not support switching to thread\",\n );\n await onSwitchToThread(threadId);\n }\n\n public async switchToNewThread(): Promise<void> {\n const onSwitchToNewThread = this.adapter.onSwitchToNewThread;\n if (!onSwitchToNewThread)\n throw new Error(\n \"External store adapter does not support switching to new thread\",\n );\n\n await onSwitchToNewThread();\n }\n\n public async rename(threadId: string, newTitle: string): Promise<void> {\n const onRename = this.adapter.onRename;\n if (!onRename)\n throw new Error(\"External store adapter does not support renaming\");\n\n await onRename(threadId, newTitle);\n }\n\n public async updateCustom(\n threadId: string,\n custom: Record<string, unknown> | undefined,\n ): Promise<void> {\n const onUpdateCustom = this.adapter.onUpdateCustom;\n if (!onUpdateCustom)\n throw new Error(\n \"External store adapter does not support updating custom metadata\",\n );\n\n await onUpdateCustom(threadId, custom);\n }\n\n public async detach(): Promise<void> {\n // no-op\n }\n\n public async archive(threadId: string): Promise<void> {\n const onArchive = this.adapter.onArchive;\n if (!onArchive)\n throw new Error(\"External store adapter does not support archiving\");\n\n await onArchive(threadId);\n }\n\n public async unarchive(threadId: string): Promise<void> {\n const onUnarchive = this.adapter.onUnarchive;\n if (!onUnarchive)\n throw new Error(\"External store adapter does not support unarchiving\");\n\n await onUnarchive(threadId);\n }\n\n public async delete(threadId: string): Promise<void> {\n const onDelete = this.adapter.onDelete;\n if (!onDelete)\n throw new Error(\"External store adapter does not support deleting\");\n\n await onDelete(threadId);\n }\n\n public initialize(\n threadId: string,\n ): Promise<{ remoteId: string; externalId: string | undefined }> {\n return Promise.resolve({ remoteId: threadId, externalId: undefined });\n }\n\n public generateTitle(): never {\n throw new Error(\"Method not implemented.\");\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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"}
@@ -5,6 +5,7 @@ import { AssistantStream } from "assistant-stream";
5
5
  declare class InMemoryThreadListAdapter implements RemoteThreadListAdapter {
6
6
  list(): Promise<RemoteThreadListResponse>;
7
7
  rename(): Promise<void>;
8
+ updateCustom(): Promise<void>;
8
9
  archive(): Promise<void>;
9
10
  unarchive(): Promise<void>;
10
11
  delete(): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"in-memory.d.ts","names":[],"sources":["../../../../src/runtimes/remote-thread-list/adapter/in-memory.ts"],"mappings":";;;;cAQa,yBAAA,YAAqC,uBAAA;EAChD,IAAA,IAAQ,OAAA,CAAQ,wBAAA;EAMhB,MAAA,IAAU,OAAA;EAIV,OAAA,IAAW,OAAA;EAIX,SAAA,IAAa,OAAA;EAIb,MAAA,IAAU,OAAA;EAIV,UAAA,CAAW,QAAA,WAAmB,OAAA,CAAQ,8BAAA;EAItC,aAAA,IAAiB,OAAA,CAAQ,eAAA;EAIzB,KAAA,CAAM,SAAA,WAAoB,OAAA,CAAQ,oBAAA;AAAA"}
1
+ {"version":3,"file":"in-memory.d.ts","names":[],"sources":["../../../../src/runtimes/remote-thread-list/adapter/in-memory.ts"],"mappings":";;;;cAQa,yBAAA,YAAqC,uBAAA;EAChD,IAAA,IAAQ,OAAA,CAAQ,wBAAA;EAMhB,MAAA,IAAU,OAAA;EAIV,YAAA,IAAgB,OAAA;EAIhB,OAAA,IAAW,OAAA;EAIX,SAAA,IAAa,OAAA;EAIb,MAAA,IAAU,OAAA;EAIV,UAAA,CAAW,QAAA,WAAmB,OAAA,CAAQ,8BAAA;EAItC,aAAA,IAAiB,OAAA,CAAQ,eAAA;EAIzB,KAAA,CAAM,SAAA,WAAoB,OAAA,CAAQ,oBAAA;AAAA"}
@@ -6,6 +6,9 @@ var InMemoryThreadListAdapter = class {
6
6
  rename() {
7
7
  return Promise.resolve();
8
8
  }
9
+ updateCustom() {
10
+ return Promise.resolve();
11
+ }
9
12
  archive() {
10
13
  return Promise.resolve();
11
14
  }
@@ -1 +1 @@
1
- {"version":3,"file":"in-memory.js","names":[],"sources":["../../../../src/runtimes/remote-thread-list/adapter/in-memory.ts"],"sourcesContent":["import type { AssistantStream, AssistantStreamChunk } from \"assistant-stream\";\nimport type {\n RemoteThreadInitializeResponse,\n RemoteThreadListAdapter,\n RemoteThreadListResponse,\n RemoteThreadMetadata,\n} from \"../types\";\n\nexport class InMemoryThreadListAdapter implements RemoteThreadListAdapter {\n list(): Promise<RemoteThreadListResponse> {\n return Promise.resolve({\n threads: [],\n });\n }\n\n rename(): Promise<void> {\n return Promise.resolve();\n }\n\n archive(): Promise<void> {\n return Promise.resolve();\n }\n\n unarchive(): Promise<void> {\n return Promise.resolve();\n }\n\n delete(): Promise<void> {\n return Promise.resolve();\n }\n\n initialize(threadId: string): Promise<RemoteThreadInitializeResponse> {\n return Promise.resolve({ remoteId: threadId, externalId: undefined });\n }\n\n generateTitle(): Promise<AssistantStream> {\n return Promise.resolve(new ReadableStream<AssistantStreamChunk>());\n }\n\n fetch(_threadId: string): Promise<RemoteThreadMetadata> {\n return Promise.reject(new Error(\"Thread not found\"));\n }\n}\n"],"mappings":";AAQA,IAAa,4BAAb,MAA0E;CACxE,OAA0C;EACxC,OAAO,QAAQ,QAAQ,EACrB,SAAS,CAAC,EACZ,CAAC;CACH;CAEA,SAAwB;EACtB,OAAO,QAAQ,QAAQ;CACzB;CAEA,UAAyB;EACvB,OAAO,QAAQ,QAAQ;CACzB;CAEA,YAA2B;EACzB,OAAO,QAAQ,QAAQ;CACzB;CAEA,SAAwB;EACtB,OAAO,QAAQ,QAAQ;CACzB;CAEA,WAAW,UAA2D;EACpE,OAAO,QAAQ,QAAQ;GAAE,UAAU;GAAU,YAAY,KAAA;EAAU,CAAC;CACtE;CAEA,gBAA0C;EACxC,OAAO,QAAQ,QAAQ,IAAI,eAAqC,CAAC;CACnE;CAEA,MAAM,WAAkD;EACtD,OAAO,QAAQ,uBAAO,IAAI,MAAM,kBAAkB,CAAC;CACrD;AACF"}
1
+ {"version":3,"file":"in-memory.js","names":[],"sources":["../../../../src/runtimes/remote-thread-list/adapter/in-memory.ts"],"sourcesContent":["import type { AssistantStream, AssistantStreamChunk } from \"assistant-stream\";\nimport type {\n RemoteThreadInitializeResponse,\n RemoteThreadListAdapter,\n RemoteThreadListResponse,\n RemoteThreadMetadata,\n} from \"../types\";\n\nexport class InMemoryThreadListAdapter implements RemoteThreadListAdapter {\n list(): Promise<RemoteThreadListResponse> {\n return Promise.resolve({\n threads: [],\n });\n }\n\n rename(): Promise<void> {\n return Promise.resolve();\n }\n\n updateCustom(): Promise<void> {\n return Promise.resolve();\n }\n\n archive(): Promise<void> {\n return Promise.resolve();\n }\n\n unarchive(): Promise<void> {\n return Promise.resolve();\n }\n\n delete(): Promise<void> {\n return Promise.resolve();\n }\n\n initialize(threadId: string): Promise<RemoteThreadInitializeResponse> {\n return Promise.resolve({ remoteId: threadId, externalId: undefined });\n }\n\n generateTitle(): Promise<AssistantStream> {\n return Promise.resolve(new ReadableStream<AssistantStreamChunk>());\n }\n\n fetch(_threadId: string): Promise<RemoteThreadMetadata> {\n return Promise.reject(new Error(\"Thread not found\"));\n }\n}\n"],"mappings":";AAQA,IAAa,4BAAb,MAA0E;CACxE,OAA0C;EACxC,OAAO,QAAQ,QAAQ,EACrB,SAAS,CAAC,EACZ,CAAC;CACH;CAEA,SAAwB;EACtB,OAAO,QAAQ,QAAQ;CACzB;CAEA,eAA8B;EAC5B,OAAO,QAAQ,QAAQ;CACzB;CAEA,UAAyB;EACvB,OAAO,QAAQ,QAAQ;CACzB;CAEA,YAA2B;EACzB,OAAO,QAAQ,QAAQ;CACzB;CAEA,SAAwB;EACtB,OAAO,QAAQ,QAAQ;CACzB;CAEA,WAAW,UAA2D;EACpE,OAAO,QAAQ,QAAQ;GAAE,UAAU;GAAU,YAAY,KAAA;EAAU,CAAC;CACtE;CAEA,gBAA0C;EACxC,OAAO,QAAQ,QAAQ,IAAI,eAAqC,CAAC;CACnE;CAEA,MAAM,WAAkD;EACtD,OAAO,QAAQ,uBAAO,IAAI,MAAM,kBAAkB,CAAC;CACrD;AACF"}
@@ -25,6 +25,7 @@ type RemoteThreadListPageOptions = {
25
25
  type RemoteThreadListAdapter = {
26
26
  list(params?: RemoteThreadListPageOptions): Promise<RemoteThreadListResponse>;
27
27
  rename(remoteId: string, newTitle: string): Promise<void>;
28
+ updateCustom?(remoteId: string, custom: Record<string, unknown> | undefined): Promise<void>;
28
29
  archive(remoteId: string): Promise<void>;
29
30
  unarchive(remoteId: string): Promise<void>;
30
31
  delete(remoteId: string): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","names":[],"sources":["../../../src/runtimes/remote-thread-list/types.ts"],"mappings":";;;;;;KAKY,8BAAA;EACV,QAAA;EACA,UAAU;AAAA;AAAA,KAGA,oBAAA;EAAA,SACD,MAAA;EAAA,SACA,QAAA;EAAA,SACA,UAAA;EAAA,SACA,KAAA;EAAA,SACA,MAAA,GAAS,MAAM;AAAA;AAAA,KAGd,wBAAA;EACV,OAAA,EAAS,oBAAoB;EAC7B,UAAA;AAAA;AAAA,KAGU,2BAAA;EACV,KAAK;AAAA;AAAA,KAGK,uBAAA;EACV,IAAA,CAAK,MAAA,GAAS,2BAAA,GAA8B,OAAA,CAAQ,wBAAA;EAEpD,MAAA,CAAO,QAAA,UAAkB,QAAA,WAAmB,OAAA;EAC5C,OAAA,CAAQ,QAAA,WAAmB,OAAA;EAC3B,SAAA,CAAU,QAAA,WAAmB,OAAA;EAC7B,MAAA,CAAO,QAAA,WAAmB,OAAA;EAC1B,UAAA,CAAW,QAAA,WAAmB,OAAA,CAAQ,8BAAA;EACtC,aAAA,CACE,QAAA,UACA,iBAAA,WAA4B,aAAA,KAC3B,OAAA,CAAQ,eAAA;EACX,KAAA,CAAM,QAAA,WAAmB,OAAA,CAAQ,oBAAA;EAnBvB;AAGZ;;;;AACO;AAGP;;;;EAwBE,iBAAA,GAAoB,aAAA,CAAc,iBAAA;AAAA;AAAA,KAGxB,uBAAA;EACV,WAAA,QAAmB,gBAAA;EACnB,OAAA,EAAS,uBAAuB;EAvBN;;;;;;;EAgC1B,eAAA;EAdkC;;;;;EAqBlC,QAAA;EA5CK;;;;;EAmDL,YAAA;AAAA"}
1
+ {"version":3,"file":"types.d.ts","names":[],"sources":["../../../src/runtimes/remote-thread-list/types.ts"],"mappings":";;;;;;KAKY,8BAAA;EACV,QAAA;EACA,UAAU;AAAA;AAAA,KAGA,oBAAA;EAAA,SACD,MAAA;EAAA,SACA,QAAA;EAAA,SACA,UAAA;EAAA,SACA,KAAA;EAAA,SACA,MAAA,GAAS,MAAM;AAAA;AAAA,KAGd,wBAAA;EACV,OAAA,EAAS,oBAAoB;EAC7B,UAAA;AAAA;AAAA,KAGU,2BAAA;EACV,KAAK;AAAA;AAAA,KAGK,uBAAA;EACV,IAAA,CAAK,MAAA,GAAS,2BAAA,GAA8B,OAAA,CAAQ,wBAAA;EAEpD,MAAA,CAAO,QAAA,UAAkB,QAAA,WAAmB,OAAA;EAC5C,YAAA,EACE,QAAA,UACA,MAAA,EAAQ,MAAA,gCACP,OAAA;EACH,OAAA,CAAQ,QAAA,WAAmB,OAAA;EAC3B,SAAA,CAAU,QAAA,WAAmB,OAAA;EAC7B,MAAA,CAAO,QAAA,WAAmB,OAAA;EAC1B,UAAA,CAAW,QAAA,WAAmB,OAAA,CAAQ,8BAAA;EACtC,aAAA,CACE,QAAA,UACA,iBAAA,WAA4B,aAAA,KAC3B,OAAA,CAAQ,eAAA;EACX,KAAA,CAAM,QAAA,WAAmB,OAAA,CAAQ,oBAAA;EApBvB;;;;AACL;AAGP;;;;;EA4BE,iBAAA,GAAoB,aAAA,CAAc,iBAAA;AAAA;AAAA,KAGxB,uBAAA;EACV,WAAA,QAAmB,gBAAA;EACnB,OAAA,EAAS,uBAAuB;EAxBH;;;;;;;EAiC7B,eAAA;EA1ByB;;;;;EAiCzB,QAAA;EAhDc;;;;;EAuDd,YAAA;AAAA"}
@@ -21,6 +21,7 @@ const ThreadListItemClient = resource(({ runtime }) => {
21
21
  getState: () => state,
22
22
  switchTo: runtime.switchTo,
23
23
  rename: runtime.rename,
24
+ updateCustom: runtime.updateCustom,
24
25
  archive: runtime.archive,
25
26
  unarchive: runtime.unarchive,
26
27
  delete: runtime.delete,
@@ -1 +1 @@
1
- {"version":3,"file":"thread-list-item-runtime-client.js","names":[],"sources":["../../../src/store/runtime-clients/thread-list-item-runtime-client.ts"],"sourcesContent":["import type { Unsubscribe } from \"../../types/unsubscribe\";\nimport { resource, tapEffect } from \"@assistant-ui/tap\";\nimport { type ClientOutput, tapAssistantEmit } from \"@assistant-ui/store\";\nimport type {\n ThreadListItemEventType,\n ThreadListItemRuntime,\n} from \"../../runtime/api/thread-list-item-runtime\";\nimport { tapSubscribable } from \"./tap-subscribable\";\n\nexport const ThreadListItemClient = resource(\n ({\n runtime,\n }: {\n runtime: ThreadListItemRuntime;\n }): ClientOutput<\"threadListItem\"> => {\n const state = tapSubscribable(runtime);\n const emit = tapAssistantEmit();\n\n // Bind thread list item events to event manager\n tapEffect(() => {\n const unsubscribers: Unsubscribe[] = [];\n\n // Subscribe to thread list item events\n const threadListItemEvents: ThreadListItemEventType[] = [\n \"switchedTo\",\n \"switchedAway\",\n ];\n\n for (const event of threadListItemEvents) {\n const unsubscribe = runtime.unstable_on(event, () => {\n emit(`threadListItem.${event}`, {\n threadId: runtime.getState()!.id,\n });\n });\n unsubscribers.push(unsubscribe);\n }\n\n return () => {\n for (const unsub of unsubscribers) unsub();\n };\n }, [runtime, emit]);\n\n return {\n getState: () => state,\n switchTo: runtime.switchTo,\n rename: runtime.rename,\n archive: runtime.archive,\n unarchive: runtime.unarchive,\n delete: runtime.delete,\n generateTitle: runtime.generateTitle,\n initialize: runtime.initialize,\n detach: runtime.detach,\n __internal_getRuntime: () => runtime,\n };\n },\n);\n"],"mappings":";;;;AASA,MAAa,uBAAuB,UACjC,EACC,cAGoC;CACpC,MAAM,QAAQ,gBAAgB,OAAO;CACrC,MAAM,OAAO,iBAAiB;CAG9B,gBAAgB;EACd,MAAM,gBAA+B,CAAC;EAQtC,KAAK,MAAM,SAAS,CAJlB,cACA,cAGqC,GAAG;GACxC,MAAM,cAAc,QAAQ,YAAY,aAAa;IACnD,KAAK,kBAAkB,SAAS,EAC9B,UAAU,QAAQ,SAAS,EAAG,GAChC,CAAC;GACH,CAAC;GACD,cAAc,KAAK,WAAW;EAChC;EAEA,aAAa;GACX,KAAK,MAAM,SAAS,eAAe,MAAM;EAC3C;CACF,GAAG,CAAC,SAAS,IAAI,CAAC;CAElB,OAAO;EACL,gBAAgB;EAChB,UAAU,QAAQ;EAClB,QAAQ,QAAQ;EAChB,SAAS,QAAQ;EACjB,WAAW,QAAQ;EACnB,QAAQ,QAAQ;EAChB,eAAe,QAAQ;EACvB,YAAY,QAAQ;EACpB,QAAQ,QAAQ;EAChB,6BAA6B;CAC/B;AACF,CACF"}
1
+ {"version":3,"file":"thread-list-item-runtime-client.js","names":[],"sources":["../../../src/store/runtime-clients/thread-list-item-runtime-client.ts"],"sourcesContent":["import type { Unsubscribe } from \"../../types/unsubscribe\";\nimport { resource, tapEffect } from \"@assistant-ui/tap\";\nimport { type ClientOutput, tapAssistantEmit } from \"@assistant-ui/store\";\nimport type {\n ThreadListItemEventType,\n ThreadListItemRuntime,\n} from \"../../runtime/api/thread-list-item-runtime\";\nimport { tapSubscribable } from \"./tap-subscribable\";\n\nexport const ThreadListItemClient = resource(\n ({\n runtime,\n }: {\n runtime: ThreadListItemRuntime;\n }): ClientOutput<\"threadListItem\"> => {\n const state = tapSubscribable(runtime);\n const emit = tapAssistantEmit();\n\n // Bind thread list item events to event manager\n tapEffect(() => {\n const unsubscribers: Unsubscribe[] = [];\n\n // Subscribe to thread list item events\n const threadListItemEvents: ThreadListItemEventType[] = [\n \"switchedTo\",\n \"switchedAway\",\n ];\n\n for (const event of threadListItemEvents) {\n const unsubscribe = runtime.unstable_on(event, () => {\n emit(`threadListItem.${event}`, {\n threadId: runtime.getState()!.id,\n });\n });\n unsubscribers.push(unsubscribe);\n }\n\n return () => {\n for (const unsub of unsubscribers) unsub();\n };\n }, [runtime, emit]);\n\n return {\n getState: () => state,\n switchTo: runtime.switchTo,\n rename: runtime.rename,\n updateCustom: runtime.updateCustom,\n archive: runtime.archive,\n unarchive: runtime.unarchive,\n delete: runtime.delete,\n generateTitle: runtime.generateTitle,\n initialize: runtime.initialize,\n detach: runtime.detach,\n __internal_getRuntime: () => runtime,\n };\n },\n);\n"],"mappings":";;;;AASA,MAAa,uBAAuB,UACjC,EACC,cAGoC;CACpC,MAAM,QAAQ,gBAAgB,OAAO;CACrC,MAAM,OAAO,iBAAiB;CAG9B,gBAAgB;EACd,MAAM,gBAA+B,CAAC;EAQtC,KAAK,MAAM,SAAS,CAJlB,cACA,cAGqC,GAAG;GACxC,MAAM,cAAc,QAAQ,YAAY,aAAa;IACnD,KAAK,kBAAkB,SAAS,EAC9B,UAAU,QAAQ,SAAS,EAAG,GAChC,CAAC;GACH,CAAC;GACD,cAAc,KAAK,WAAW;EAChC;EAEA,aAAa;GACX,KAAK,MAAM,SAAS,eAAe,MAAM;EAC3C;CACF,GAAG,CAAC,SAAS,IAAI,CAAC;CAElB,OAAO;EACL,gBAAgB;EAChB,UAAU,QAAQ;EAClB,QAAQ,QAAQ;EAChB,cAAc,QAAQ;EACtB,SAAS,QAAQ;EACjB,WAAW,QAAQ;EACnB,QAAQ,QAAQ;EAChB,eAAe,QAAQ;EACvB,YAAY,QAAQ;EACpB,QAAQ,QAAQ;EAChB,6BAA6B;CAC/B;AACF,CACF"}
@@ -16,6 +16,7 @@ type ThreadListItemMethods = {
16
16
  unarchive?: boolean;
17
17
  }): void;
18
18
  rename(newTitle: string): void;
19
+ updateCustom(custom: Record<string, unknown> | undefined): void;
19
20
  archive(): void;
20
21
  unarchive(): void;
21
22
  delete(): void;
@@ -1 +1 @@
1
- {"version":3,"file":"thread-list-item.d.ts","names":[],"sources":["../../../src/store/scopes/thread-list-item.ts"],"mappings":";;;;KAGY,mBAAA;EAAA,SACD,EAAA;EAAA,SACA,QAAA;EAAA,SACA,UAAA;EAAA,SACA,KAAA;EAAA,SACA,MAAA,EAAQ,oBAAA;EAAA,SACR,MAAA,GAAS,MAAM;AAAA;AAAA,KAGd,qBAAA;EACV,QAAA,IAAY,mBAAA;EACZ,QAAA,CAAS,OAAA;IAAY,SAAA;EAAA;EACrB,MAAA,CAAO,QAAA;EACP,OAAA;EACA,SAAA;EACA,MAAA;EACA,aAAA;EACA,UAAA,IAAc,OAAA;IAAU,QAAA;IAAkB,UAAA;EAAA;EAC1C,MAAA;EACA,qBAAA,KAA0B,qBAAA;AAAA;AAAA,KAGhB,kBAAA;EACV,MAAA;EACA,KAAA;IACM,IAAA;EAAA;IACA,IAAA;IAAY,EAAA;EAAA;IACZ,IAAA;IAAe,KAAA;IAAe,QAAA;EAAA;AAAA;AAAA,KAG1B,oBAAA;EAZV;;;;AAC+C;EAiB/C,2BAAA;IAA+B,QAAA;EAAA;EAdH;;;;;EAoB5B,6BAAA;IAAiC,QAAA;EAAA;AAAA;AAAA,KAGvB,0BAAA;EACV,OAAA,EAAS,qBAAA;EACT,IAAA,EAAM,kBAAA;EACN,MAAA,EAAQ,oBAAA;AAAA"}
1
+ {"version":3,"file":"thread-list-item.d.ts","names":[],"sources":["../../../src/store/scopes/thread-list-item.ts"],"mappings":";;;;KAGY,mBAAA;EAAA,SACD,EAAA;EAAA,SACA,QAAA;EAAA,SACA,UAAA;EAAA,SACA,KAAA;EAAA,SACA,MAAA,EAAQ,oBAAA;EAAA,SACR,MAAA,GAAS,MAAM;AAAA;AAAA,KAGd,qBAAA;EACV,QAAA,IAAY,mBAAA;EACZ,QAAA,CAAS,OAAA;IAAY,SAAA;EAAA;EACrB,MAAA,CAAO,QAAA;EACP,YAAA,CAAa,MAAA,EAAQ,MAAA;EACrB,OAAA;EACA,SAAA;EACA,MAAA;EACA,aAAA;EACA,UAAA,IAAc,OAAA;IAAU,QAAA;IAAkB,UAAA;EAAA;EAC1C,MAAA;EACA,qBAAA,KAA0B,qBAAA;AAAA;AAAA,KAGhB,kBAAA;EACV,MAAA;EACA,KAAA;IACM,IAAA;EAAA;IACA,IAAA;IAAY,EAAA;EAAA;IACZ,IAAA;IAAe,KAAA;IAAe,QAAA;EAAA;AAAA;AAAA,KAG1B,oBAAA;EAbI;;;;;EAmBd,2BAAA;IAA+B,QAAA;EAAA;EAdrB;;;;;EAoBV,6BAAA;IAAiC,QAAA;EAAA;AAAA;AAAA,KAGvB,0BAAA;EACV,OAAA,EAAS,qBAAA;EACT,IAAA,EAAM,kBAAA;EACN,MAAA,EAAQ,oBAAA;AAAA"}