@assistant-ui/react 0.7.9 → 0.7.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 (133) hide show
  1. package/dist/api/AssistantRuntime.d.ts +4 -5
  2. package/dist/api/AssistantRuntime.d.ts.map +1 -1
  3. package/dist/api/AssistantRuntime.js +16 -19
  4. package/dist/api/AssistantRuntime.js.map +1 -1
  5. package/dist/api/AssistantRuntime.mjs +16 -19
  6. package/dist/api/AssistantRuntime.mjs.map +1 -1
  7. package/dist/api/ThreadListItemRuntime.d.ts +11 -2
  8. package/dist/api/ThreadListItemRuntime.d.ts.map +1 -1
  9. package/dist/api/ThreadListItemRuntime.js +16 -5
  10. package/dist/api/ThreadListItemRuntime.js.map +1 -1
  11. package/dist/api/ThreadListItemRuntime.mjs +16 -5
  12. package/dist/api/ThreadListItemRuntime.mjs.map +1 -1
  13. package/dist/api/ThreadListRuntime.d.ts +3 -0
  14. package/dist/api/ThreadListRuntime.d.ts.map +1 -1
  15. package/dist/api/ThreadListRuntime.js +27 -8
  16. package/dist/api/ThreadListRuntime.js.map +1 -1
  17. package/dist/api/ThreadListRuntime.mjs +27 -8
  18. package/dist/api/ThreadListRuntime.mjs.map +1 -1
  19. package/dist/api/ThreadRuntime.d.ts +10 -7
  20. package/dist/api/ThreadRuntime.d.ts.map +1 -1
  21. package/dist/api/ThreadRuntime.js +16 -6
  22. package/dist/api/ThreadRuntime.js.map +1 -1
  23. package/dist/api/ThreadRuntime.mjs +16 -6
  24. package/dist/api/ThreadRuntime.mjs.map +1 -1
  25. package/dist/context/providers/AssistantRuntimeProvider.d.ts.map +1 -1
  26. package/dist/context/providers/AssistantRuntimeProvider.js +8 -1
  27. package/dist/context/providers/AssistantRuntimeProvider.js.map +1 -1
  28. package/dist/context/providers/AssistantRuntimeProvider.mjs +8 -1
  29. package/dist/context/providers/AssistantRuntimeProvider.mjs.map +1 -1
  30. package/dist/context/providers/ThreadRuntimeProvider.d.ts +2 -0
  31. package/dist/context/providers/ThreadRuntimeProvider.d.ts.map +1 -1
  32. package/dist/context/providers/ThreadRuntimeProvider.js +3 -2
  33. package/dist/context/providers/ThreadRuntimeProvider.js.map +1 -1
  34. package/dist/context/providers/ThreadRuntimeProvider.mjs +3 -2
  35. package/dist/context/providers/ThreadRuntimeProvider.mjs.map +1 -1
  36. package/dist/internal.d.ts +1 -2
  37. package/dist/internal.d.ts.map +1 -1
  38. package/dist/internal.js +0 -3
  39. package/dist/internal.js.map +1 -1
  40. package/dist/internal.mjs +0 -2
  41. package/dist/internal.mjs.map +1 -1
  42. package/dist/primitives/composer/ComposerInput.d.ts.map +1 -1
  43. package/dist/primitives/composer/ComposerInput.js +3 -1
  44. package/dist/primitives/composer/ComposerInput.js.map +1 -1
  45. package/dist/primitives/composer/ComposerInput.mjs +3 -1
  46. package/dist/primitives/composer/ComposerInput.mjs.map +1 -1
  47. package/dist/runtimes/core/BaseThreadRuntimeCore.d.ts +2 -4
  48. package/dist/runtimes/core/BaseThreadRuntimeCore.d.ts.map +1 -1
  49. package/dist/runtimes/core/BaseThreadRuntimeCore.js +1 -5
  50. package/dist/runtimes/core/BaseThreadRuntimeCore.js.map +1 -1
  51. package/dist/runtimes/core/BaseThreadRuntimeCore.mjs +1 -5
  52. package/dist/runtimes/core/BaseThreadRuntimeCore.mjs.map +1 -1
  53. package/dist/runtimes/core/ThreadListRuntimeCore.d.ts +14 -6
  54. package/dist/runtimes/core/ThreadListRuntimeCore.d.ts.map +1 -1
  55. package/dist/runtimes/core/ThreadListRuntimeCore.js.map +1 -1
  56. package/dist/runtimes/core/ThreadRuntimeCore.d.ts +1 -15
  57. package/dist/runtimes/core/ThreadRuntimeCore.d.ts.map +1 -1
  58. package/dist/runtimes/core/ThreadRuntimeCore.js.map +1 -1
  59. package/dist/runtimes/core/index.d.ts +1 -1
  60. package/dist/runtimes/core/index.d.ts.map +1 -1
  61. package/dist/runtimes/core/index.js.map +1 -1
  62. package/dist/runtimes/external-store/ExternalStoreAdapter.d.ts +20 -3
  63. package/dist/runtimes/external-store/ExternalStoreAdapter.d.ts.map +1 -1
  64. package/dist/runtimes/external-store/ExternalStoreAdapter.js.map +1 -1
  65. package/dist/runtimes/external-store/ExternalStoreRuntimeCore.d.ts +0 -1
  66. package/dist/runtimes/external-store/ExternalStoreRuntimeCore.d.ts.map +1 -1
  67. package/dist/runtimes/external-store/ExternalStoreRuntimeCore.js +3 -10
  68. package/dist/runtimes/external-store/ExternalStoreRuntimeCore.js.map +1 -1
  69. package/dist/runtimes/external-store/ExternalStoreRuntimeCore.mjs +3 -10
  70. package/dist/runtimes/external-store/ExternalStoreRuntimeCore.mjs.map +1 -1
  71. package/dist/runtimes/external-store/ExternalStoreThreadListRuntimeCore.d.ts +9 -11
  72. package/dist/runtimes/external-store/ExternalStoreThreadListRuntimeCore.d.ts.map +1 -1
  73. package/dist/runtimes/external-store/ExternalStoreThreadListRuntimeCore.js +19 -27
  74. package/dist/runtimes/external-store/ExternalStoreThreadListRuntimeCore.js.map +1 -1
  75. package/dist/runtimes/external-store/ExternalStoreThreadListRuntimeCore.mjs +19 -27
  76. package/dist/runtimes/external-store/ExternalStoreThreadListRuntimeCore.mjs.map +1 -1
  77. package/dist/runtimes/external-store/ExternalStoreThreadRuntimeCore.d.ts +2 -2
  78. package/dist/runtimes/external-store/ExternalStoreThreadRuntimeCore.d.ts.map +1 -1
  79. package/dist/runtimes/external-store/ExternalStoreThreadRuntimeCore.js +4 -7
  80. package/dist/runtimes/external-store/ExternalStoreThreadRuntimeCore.js.map +1 -1
  81. package/dist/runtimes/external-store/ExternalStoreThreadRuntimeCore.mjs +4 -7
  82. package/dist/runtimes/external-store/ExternalStoreThreadRuntimeCore.mjs.map +1 -1
  83. package/dist/runtimes/local/LocalRuntimeCore.d.ts +0 -1
  84. package/dist/runtimes/local/LocalRuntimeCore.d.ts.map +1 -1
  85. package/dist/runtimes/local/LocalRuntimeCore.js +3 -12
  86. package/dist/runtimes/local/LocalRuntimeCore.js.map +1 -1
  87. package/dist/runtimes/local/LocalRuntimeCore.mjs +3 -12
  88. package/dist/runtimes/local/LocalRuntimeCore.mjs.map +1 -1
  89. package/dist/runtimes/local/LocalThreadListRuntimeCore.d.ts +17 -15
  90. package/dist/runtimes/local/LocalThreadListRuntimeCore.d.ts.map +1 -1
  91. package/dist/runtimes/local/LocalThreadListRuntimeCore.js +94 -92
  92. package/dist/runtimes/local/LocalThreadListRuntimeCore.js.map +1 -1
  93. package/dist/runtimes/local/LocalThreadListRuntimeCore.mjs +94 -92
  94. package/dist/runtimes/local/LocalThreadListRuntimeCore.mjs.map +1 -1
  95. package/dist/runtimes/local/LocalThreadRuntimeCore.d.ts +4 -3
  96. package/dist/runtimes/local/LocalThreadRuntimeCore.d.ts.map +1 -1
  97. package/dist/runtimes/local/LocalThreadRuntimeCore.js +11 -10
  98. package/dist/runtimes/local/LocalThreadRuntimeCore.js.map +1 -1
  99. package/dist/runtimes/local/LocalThreadRuntimeCore.mjs +11 -10
  100. package/dist/runtimes/local/LocalThreadRuntimeCore.mjs.map +1 -1
  101. package/dist/runtimes/local/useLocalRuntime.d.ts.map +1 -1
  102. package/dist/runtimes/local/useLocalRuntime.js +4 -7
  103. package/dist/runtimes/local/useLocalRuntime.js.map +1 -1
  104. package/dist/runtimes/local/useLocalRuntime.mjs +4 -7
  105. package/dist/runtimes/local/useLocalRuntime.mjs.map +1 -1
  106. package/package.json +1 -1
  107. package/src/api/AssistantRuntime.ts +21 -25
  108. package/src/api/ThreadListItemRuntime.ts +36 -7
  109. package/src/api/ThreadListRuntime.ts +31 -9
  110. package/src/api/ThreadRuntime.ts +38 -10
  111. package/src/context/providers/AssistantRuntimeProvider.tsx +4 -1
  112. package/src/context/providers/ThreadRuntimeProvider.tsx +9 -2
  113. package/src/internal.ts +1 -1
  114. package/src/primitives/composer/ComposerInput.tsx +3 -1
  115. package/src/runtimes/core/BaseThreadRuntimeCore.tsx +1 -9
  116. package/src/runtimes/core/ThreadListRuntimeCore.tsx +16 -7
  117. package/src/runtimes/core/ThreadRuntimeCore.tsx +1 -19
  118. package/src/runtimes/core/index.ts +0 -1
  119. package/src/runtimes/external-store/ExternalStoreAdapter.tsx +20 -3
  120. package/src/runtimes/external-store/ExternalStoreRuntimeCore.tsx +5 -12
  121. package/src/runtimes/external-store/ExternalStoreThreadListRuntimeCore.tsx +22 -35
  122. package/src/runtimes/external-store/ExternalStoreThreadRuntimeCore.tsx +3 -7
  123. package/src/runtimes/local/LocalRuntimeCore.tsx +7 -14
  124. package/src/runtimes/local/LocalThreadListRuntimeCore.tsx +110 -103
  125. package/src/runtimes/local/LocalThreadRuntimeCore.tsx +11 -10
  126. package/src/runtimes/local/useLocalRuntime.tsx +5 -12
  127. package/dist/runtimes/local/LocalThreadMetadataRuntimeCore.d.ts +0 -19
  128. package/dist/runtimes/local/LocalThreadMetadataRuntimeCore.d.ts.map +0 -1
  129. package/dist/runtimes/local/LocalThreadMetadataRuntimeCore.js +0 -87
  130. package/dist/runtimes/local/LocalThreadMetadataRuntimeCore.js.map +0 -1
  131. package/dist/runtimes/local/LocalThreadMetadataRuntimeCore.mjs +0 -62
  132. package/dist/runtimes/local/LocalThreadMetadataRuntimeCore.mjs.map +0 -1
  133. package/src/runtimes/local/LocalThreadMetadataRuntimeCore.tsx +0 -79
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/runtimes/local/LocalRuntimeCore.tsx"],"sourcesContent":["import type { CoreMessage } from \"../../types/AssistantTypes\";\nimport { BaseAssistantRuntimeCore } from \"../core/BaseAssistantRuntimeCore\";\nimport { LocalThreadRuntimeCore } from \"./LocalThreadRuntimeCore\";\nimport { LocalRuntimeOptionsBase } from \"./LocalRuntimeOptions\";\nimport { fromCoreMessages } from \"../edge/converters/fromCoreMessage\";\nimport { LocalThreadListRuntimeCore } from \"./LocalThreadListRuntimeCore\";\nimport { ExportedMessageRepository } from \"../utils/MessageRepository\";\n\nconst getExportFromInitialMessages = (\n initialMessages: readonly CoreMessage[],\n): ExportedMessageRepository => {\n const messages = fromCoreMessages(initialMessages);\n return {\n messages: messages.map((m, idx) => ({\n parentId: messages[idx - 1]?.id ?? null,\n message: m,\n })),\n };\n};\n\nexport class LocalRuntimeCore extends BaseAssistantRuntimeCore {\n public readonly threadList;\n\n private _options: LocalRuntimeOptionsBase;\n\n constructor(\n options: LocalRuntimeOptionsBase,\n initialMessages: readonly CoreMessage[] | undefined,\n ) {\n super();\n\n this._options = options;\n\n this.threadList = new LocalThreadListRuntimeCore((threadId, data) => {\n const thread = new LocalThreadRuntimeCore(\n this._proxyConfigProvider,\n threadId,\n this._options,\n );\n thread.import(data);\n return thread;\n });\n\n if (initialMessages) {\n this.threadList.mainThread.import(\n getExportFromInitialMessages(initialMessages),\n );\n }\n }\n\n public setOptions(options: LocalRuntimeOptionsBase) {\n this._options = options;\n\n this.threadList.mainThread.setOptions(options);\n }\n\n public reset({\n initialMessages,\n }: {\n initialMessages?: readonly CoreMessage[] | undefined;\n } = {}) {\n this.threadList.switchToNewThread();\n if (!initialMessages) return;\n\n this.threadList.mainThread.import(\n getExportFromInitialMessages(initialMessages),\n );\n }\n}\n"],"mappings":";AACA,SAAS,gCAAgC;AACzC,SAAS,8BAA8B;AAEvC,SAAS,wBAAwB;AACjC,SAAS,kCAAkC;AAG3C,IAAM,+BAA+B,CACnC,oBAC8B;AAC9B,QAAM,WAAW,iBAAiB,eAAe;AACjD,SAAO;AAAA,IACL,UAAU,SAAS,IAAI,CAAC,GAAG,SAAS;AAAA,MAClC,UAAU,SAAS,MAAM,CAAC,GAAG,MAAM;AAAA,MACnC,SAAS;AAAA,IACX,EAAE;AAAA,EACJ;AACF;AAEO,IAAM,mBAAN,cAA+B,yBAAyB;AAAA,EAC7C;AAAA,EAER;AAAA,EAER,YACE,SACA,iBACA;AACA,UAAM;AAEN,SAAK,WAAW;AAEhB,SAAK,aAAa,IAAI,2BAA2B,CAAC,UAAU,SAAS;AACnE,YAAM,SAAS,IAAI;AAAA,QACjB,KAAK;AAAA,QACL;AAAA,QACA,KAAK;AAAA,MACP;AACA,aAAO,OAAO,IAAI;AAClB,aAAO;AAAA,IACT,CAAC;AAED,QAAI,iBAAiB;AACnB,WAAK,WAAW,WAAW;AAAA,QACzB,6BAA6B,eAAe;AAAA,MAC9C;AAAA,IACF;AAAA,EACF;AAAA,EAEO,WAAW,SAAkC;AAClD,SAAK,WAAW;AAEhB,SAAK,WAAW,WAAW,WAAW,OAAO;AAAA,EAC/C;AAAA,EAEO,MAAM;AAAA,IACX;AAAA,EACF,IAEI,CAAC,GAAG;AACN,SAAK,WAAW,kBAAkB;AAClC,QAAI,CAAC,gBAAiB;AAEtB,SAAK,WAAW,WAAW;AAAA,MACzB,6BAA6B,eAAe;AAAA,IAC9C;AAAA,EACF;AACF;","names":[]}
1
+ {"version":3,"sources":["../../../src/runtimes/local/LocalRuntimeCore.tsx"],"sourcesContent":["import type { CoreMessage } from \"../../types/AssistantTypes\";\nimport { BaseAssistantRuntimeCore } from \"../core/BaseAssistantRuntimeCore\";\nimport { LocalThreadRuntimeCore } from \"./LocalThreadRuntimeCore\";\nimport { LocalRuntimeOptionsBase } from \"./LocalRuntimeOptions\";\nimport { fromCoreMessages } from \"../edge/converters/fromCoreMessage\";\nimport { LocalThreadListRuntimeCore } from \"./LocalThreadListRuntimeCore\";\nimport { ExportedMessageRepository } from \"../utils/MessageRepository\";\n\nconst getExportFromInitialMessages = (\n initialMessages: readonly CoreMessage[],\n): ExportedMessageRepository => {\n const messages = fromCoreMessages(initialMessages);\n return {\n messages: messages.map((m, idx) => ({\n parentId: messages[idx - 1]?.id ?? null,\n message: m,\n })),\n };\n};\n\nexport class LocalRuntimeCore extends BaseAssistantRuntimeCore {\n public readonly threadList;\n\n private _options: LocalRuntimeOptionsBase;\n\n constructor(\n options: LocalRuntimeOptionsBase,\n initialMessages: readonly CoreMessage[] | undefined,\n ) {\n super();\n\n this._options = options;\n\n this.threadList = new LocalThreadListRuntimeCore((data) => {\n const thread = new LocalThreadRuntimeCore(\n this._proxyConfigProvider,\n this._options,\n );\n thread.import(data);\n return thread;\n });\n\n if (initialMessages) {\n this.threadList\n .getMainThreadRuntimeCore()\n .import(getExportFromInitialMessages(initialMessages));\n }\n }\n\n public reset({\n initialMessages,\n }: {\n initialMessages?: readonly CoreMessage[] | undefined;\n } = {}) {\n this.threadList.switchToNewThread();\n if (!initialMessages) return;\n\n this.threadList\n .getMainThreadRuntimeCore()\n .import(getExportFromInitialMessages(initialMessages));\n }\n}\n"],"mappings":";AACA,SAAS,gCAAgC;AACzC,SAAS,8BAA8B;AAEvC,SAAS,wBAAwB;AACjC,SAAS,kCAAkC;AAG3C,IAAM,+BAA+B,CACnC,oBAC8B;AAC9B,QAAM,WAAW,iBAAiB,eAAe;AACjD,SAAO;AAAA,IACL,UAAU,SAAS,IAAI,CAAC,GAAG,SAAS;AAAA,MAClC,UAAU,SAAS,MAAM,CAAC,GAAG,MAAM;AAAA,MACnC,SAAS;AAAA,IACX,EAAE;AAAA,EACJ;AACF;AAEO,IAAM,mBAAN,cAA+B,yBAAyB;AAAA,EAC7C;AAAA,EAER;AAAA,EAER,YACE,SACA,iBACA;AACA,UAAM;AAEN,SAAK,WAAW;AAEhB,SAAK,aAAa,IAAI,2BAA2B,CAAC,SAAS;AACzD,YAAM,SAAS,IAAI;AAAA,QACjB,KAAK;AAAA,QACL,KAAK;AAAA,MACP;AACA,aAAO,OAAO,IAAI;AAClB,aAAO;AAAA,IACT,CAAC;AAED,QAAI,iBAAiB;AACnB,WAAK,WACF,yBAAyB,EACzB,OAAO,6BAA6B,eAAe,CAAC;AAAA,IACzD;AAAA,EACF;AAAA,EAEO,MAAM;AAAA,IACX;AAAA,EACF,IAEI,CAAC,GAAG;AACN,SAAK,WAAW,kBAAkB;AAClC,QAAI,CAAC,gBAAiB;AAEtB,SAAK,WACF,yBAAyB,EACzB,OAAO,6BAA6B,eAAe,CAAC;AAAA,EACzD;AACF;","names":[]}
@@ -2,32 +2,34 @@ import type { Unsubscribe } from "../../types";
2
2
  import { ThreadListRuntimeCore } from "../core/ThreadListRuntimeCore";
3
3
  import { ExportedMessageRepository } from "../utils/MessageRepository";
4
4
  import { LocalThreadRuntimeCore } from "./LocalThreadRuntimeCore";
5
- import { ThreadMetadata } from "../core/ThreadRuntimeCore";
6
5
  export type ThreadListAdapter = {
7
6
  subscribe(callback: () => void): Unsubscribe;
8
7
  };
9
8
  export type LocalThreadData = {
10
- runtime: LocalThreadRuntimeCore;
11
- lastState: ThreadMetadata["state"];
12
- dispose: Unsubscribe;
9
+ readonly runtime: LocalThreadRuntimeCore;
10
+ readonly state: "new" | "regular" | "archived";
11
+ readonly threadId: string;
12
+ readonly title?: string | undefined;
13
+ dispose(): void;
13
14
  };
14
- export type LocalThreadFactory = (threadId: string, data: ExportedMessageRepository) => LocalThreadRuntimeCore;
15
+ export type LocalThreadFactory = (data: ExportedMessageRepository) => LocalThreadRuntimeCore;
15
16
  export declare class LocalThreadListRuntimeCore implements ThreadListRuntimeCore {
16
17
  private _threadFactory;
17
18
  private _threadData;
18
- private _threads;
19
- private _archivedThreads;
20
- private _newThread;
21
- get newThread(): string | undefined;
22
- get threads(): readonly string[];
23
- get archivedThreads(): readonly string[];
24
- private _mainThread;
25
- get mainThread(): LocalThreadRuntimeCore;
19
+ private _threadIds;
20
+ private _archivedThreadIds;
21
+ private _newThreadId;
22
+ get newThreadId(): string | undefined;
23
+ get threadIds(): readonly string[];
24
+ get archivedThreadIds(): readonly string[];
25
+ private _mainThreadId;
26
+ get mainThreadId(): string;
26
27
  constructor(_threadFactory: LocalThreadFactory);
27
- getThreadMetadataById(threadId: string): import("..").ThreadMetadataRuntimeCore | undefined;
28
+ getMainThreadRuntimeCore(): LocalThreadRuntimeCore;
29
+ getItemById(threadId: string): LocalThreadData | undefined;
28
30
  switchToThread(threadId: string): Promise<void>;
29
31
  switchToNewThread(): Promise<void>;
30
- private _syncState;
32
+ private _stateOp;
31
33
  rename(threadId: string, newTitle: string): Promise<void>;
32
34
  archive(threadId: string): Promise<void>;
33
35
  unarchive(threadId: string): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"LocalThreadListRuntimeCore.d.ts","sourceRoot":"","sources":["../../../src/runtimes/local/LocalThreadListRuntimeCore.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AACtE,OAAO,EAAE,yBAAyB,EAAE,MAAM,4BAA4B,CAAC;AAEvE,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAE3D,MAAM,MAAM,iBAAiB,GAAG;IAC9B,SAAS,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,WAAW,CAAC;CAC9C,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,OAAO,EAAE,sBAAsB,CAAC;IAChC,SAAS,EAAE,cAAc,CAAC,OAAO,CAAC,CAAC;IACnC,OAAO,EAAE,WAAW,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG,CAC/B,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,yBAAyB,KAC5B,sBAAsB,CAAC;AAE5B,qBAAa,0BAA2B,YAAW,qBAAqB;IAwB1D,OAAO,CAAC,cAAc;IAvBlC,OAAO,CAAC,WAAW,CAAsC;IACzD,OAAO,CAAC,QAAQ,CAAyB;IACzC,OAAO,CAAC,gBAAgB,CAAyB;IACjD,OAAO,CAAC,UAAU,CAAqB;IAEvC,IAAW,SAAS,uBAEnB;IAED,IAAW,OAAO,sBAEjB;IAED,IAAW,eAAe,sBAEzB;IAED,OAAO,CAAC,WAAW,CAA0B;IAE7C,IAAW,UAAU,IAAI,sBAAsB,CAE9C;gBAEmB,cAAc,EAAE,kBAAkB;IAI/C,qBAAqB,CAAC,QAAQ,EAAE,MAAM;IAItC,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAiB/C,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC;YAoB3B,UAAU;IA+EjB,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQzD,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAUxC,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAU1C,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAU9C,OAAO,CAAC,cAAc,CAAyB;IAExC,SAAS,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,WAAW;IAKnD,OAAO,CAAC,kBAAkB;CAG3B"}
1
+ {"version":3,"file":"LocalThreadListRuntimeCore.d.ts","sourceRoot":"","sources":["../../../src/runtimes/local/LocalThreadListRuntimeCore.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AACtE,OAAO,EAAE,yBAAyB,EAAE,MAAM,4BAA4B,CAAC;AAEvE,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAElE,MAAM,MAAM,iBAAiB,GAAG;IAC9B,SAAS,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,WAAW,CAAC;CAC9C,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,QAAQ,CAAC,OAAO,EAAE,sBAAsB,CAAC;IACzC,QAAQ,CAAC,KAAK,EAAE,KAAK,GAAG,SAAS,GAAG,UAAU,CAAC;IAC/C,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAEpC,OAAO,IAAI,IAAI,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG,CAC/B,IAAI,EAAE,yBAAyB,KAC5B,sBAAsB,CAAC;AAE5B,qBAAa,0BAA2B,YAAW,qBAAqB;IAwB1D,OAAO,CAAC,cAAc;IAvBlC,OAAO,CAAC,WAAW,CAAsC;IACzD,OAAO,CAAC,UAAU,CAAyB;IAC3C,OAAO,CAAC,kBAAkB,CAAyB;IACnD,OAAO,CAAC,YAAY,CAAqB;IAEzC,IAAW,WAAW,uBAErB;IAED,IAAW,SAAS,sBAEnB;IAED,IAAW,iBAAiB,sBAE3B;IAED,OAAO,CAAC,aAAa,CAAU;IAE/B,IAAW,YAAY,IAAI,MAAM,CAEhC;gBAEmB,cAAc,EAAE,kBAAkB;IAI/C,wBAAwB;IAOxB,WAAW,CAAC,QAAQ,EAAE,MAAM;IAItB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAYrD,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC;YA2B3B,QAAQ;IAyEf,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAYzD,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAUxC,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAS1C,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAU9C,OAAO,CAAC,cAAc,CAAyB;IAExC,SAAS,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,WAAW;IAKnD,OAAO,CAAC,kBAAkB;CAG3B"}
@@ -30,146 +30,148 @@ var LocalThreadListRuntimeCore = class {
30
30
  this.switchToNewThread();
31
31
  }
32
32
  _threadData = /* @__PURE__ */ new Map();
33
- _threads = [];
34
- _archivedThreads = [];
35
- _newThread;
36
- get newThread() {
37
- return this._newThread;
33
+ _threadIds = [];
34
+ _archivedThreadIds = [];
35
+ _newThreadId;
36
+ get newThreadId() {
37
+ return this._newThreadId;
38
38
  }
39
- get threads() {
40
- return this._threads;
39
+ get threadIds() {
40
+ return this._threadIds;
41
41
  }
42
- get archivedThreads() {
43
- return this._archivedThreads;
42
+ get archivedThreadIds() {
43
+ return this._archivedThreadIds;
44
44
  }
45
- _mainThread;
46
- get mainThread() {
47
- return this._mainThread;
45
+ _mainThreadId;
46
+ get mainThreadId() {
47
+ return this._mainThreadId;
48
48
  }
49
- getThreadMetadataById(threadId) {
50
- return this._threadData.get(threadId)?.runtime.metadata;
49
+ getMainThreadRuntimeCore() {
50
+ const result = this._threadData.get(this._mainThreadId)?.runtime;
51
+ if (!result)
52
+ throw new Error("Main thread not found. This is a bug in assistant-ui.");
53
+ return result;
51
54
  }
52
- switchToThread(threadId) {
53
- if (this._mainThread?.metadata.threadId === threadId)
54
- return Promise.resolve();
55
+ getItemById(threadId) {
56
+ return this._threadData.get(threadId);
57
+ }
58
+ async switchToThread(threadId) {
59
+ if (this._mainThreadId === threadId) return;
55
60
  const data = this._threadData.get(threadId);
56
61
  if (!data) throw new Error("Thread not found");
57
- if (data.runtime.metadata.state === "archived") this.unarchive(threadId);
58
- this._mainThread?._notifyEventSubscribers("switched-away");
59
- this._mainThread = data.runtime;
62
+ if (data.state === "archived") await this.unarchive(threadId);
63
+ this._mainThreadId = data.threadId;
60
64
  this._notifySubscribers();
61
- data.runtime._notifyEventSubscribers("switched-to");
62
- return Promise.resolve();
63
65
  }
64
66
  switchToNewThread() {
65
- if (this._newThread === void 0) {
67
+ if (this._newThreadId === void 0) {
66
68
  let threadId;
67
69
  do {
68
70
  threadId = (0, import_idUtils.generateId)();
69
71
  } while (this._threadData.has(threadId));
70
- const runtime = this._threadFactory(threadId, { messages: [] });
71
- const dispose = runtime.metadata.subscribe(() => {
72
- this._syncState(threadId, runtime.metadata);
73
- threadId = runtime.metadata.threadId;
72
+ const runtime = this._threadFactory({ messages: [] });
73
+ const dispose = runtime.unstable_on("initialize", () => {
74
+ const data = this._threadData.get(threadId);
75
+ if (!data) throw new Error("Thread not found");
76
+ this._stateOp(threadId, "regular");
77
+ });
78
+ this._threadData.set(threadId, {
79
+ runtime,
80
+ state: "new",
81
+ threadId,
82
+ dispose
74
83
  });
75
- this._threadData.set(threadId, { runtime, lastState: "new", dispose });
76
- this._newThread = threadId;
84
+ this._newThreadId = threadId;
77
85
  }
78
- this.switchToThread(this._newThread);
86
+ this.switchToThread(this._newThreadId);
79
87
  return Promise.resolve();
80
88
  }
81
- async _syncState(lastThreadId, { state, threadId }) {
82
- const data = this._threadData.get(lastThreadId);
89
+ async _stateOp(threadId, newState) {
90
+ const data = this._threadData.get(threadId);
83
91
  if (!data) throw new Error("Thread not found");
84
- const lastState = data.lastState;
85
- if (lastState === state && lastThreadId === threadId) return;
86
- if (lastThreadId !== threadId) {
87
- this._threadData.delete(lastThreadId);
88
- if (lastState === "new") {
89
- this._newThread = threadId;
90
- }
91
- if (lastState === "regular") {
92
- this._threads = this._threads.map(
93
- (t) => t === lastThreadId ? threadId : t
94
- );
95
- }
96
- if (lastState === "archived") {
97
- this._archivedThreads = this._archivedThreads.map(
98
- (t) => t === lastThreadId ? threadId : t
99
- );
100
- }
101
- }
102
- if (lastState !== state) {
103
- if (lastState === "new") {
104
- this._newThread = void 0;
105
- }
106
- if (lastState === "regular") {
107
- this._threads = this._threads.filter((t) => t !== threadId);
108
- }
109
- if (lastState === "archived") {
110
- this._archivedThreads = this._archivedThreads.filter(
92
+ const { state: lastState } = data;
93
+ if (lastState === newState) return;
94
+ switch (lastState) {
95
+ case "new":
96
+ this._newThreadId = void 0;
97
+ break;
98
+ case "regular":
99
+ this._threadIds = this._threadIds.filter((t) => t !== threadId);
100
+ break;
101
+ case "archived":
102
+ this._archivedThreadIds = this._archivedThreadIds.filter(
111
103
  (t) => t !== threadId
112
104
  );
105
+ break;
106
+ default: {
107
+ const _exhaustiveCheck = lastState;
108
+ throw new Error(`Unsupported state: ${_exhaustiveCheck}`);
113
109
  }
114
- if (state === "new") {
115
- if (this._newThread) {
116
- this.delete(this._newThread);
117
- }
118
- this._newThread = threadId;
119
- }
120
- if (state === "archived") {
121
- this._archivedThreads = [
122
- ...this._archivedThreads,
123
- data.runtime.metadata.threadId
124
- ];
125
- }
126
- if (state === "regular") {
127
- this._threads = [...this._threads, data.runtime.metadata.threadId];
128
- }
129
- if (state === "deleted") {
130
- data.dispose();
110
+ }
111
+ switch (newState) {
112
+ case "regular":
113
+ this._threadIds = [...this._threadIds, data.threadId];
114
+ break;
115
+ case "archived":
116
+ this._archivedThreadIds = [...this._archivedThreadIds, data.threadId];
117
+ break;
118
+ case "deleted":
131
119
  this._threadData.delete(threadId);
120
+ data.dispose();
121
+ break;
122
+ default: {
123
+ const _exhaustiveCheck = newState;
124
+ throw new Error(`Unsupported state: ${_exhaustiveCheck}`);
132
125
  }
133
- data.lastState = state;
134
126
  }
135
- this._notifySubscribers();
136
- if (threadId === this._mainThread.metadata.threadId && (state === "archived" || state === "deleted")) {
137
- const lastThread = this._threads[0];
138
- if (lastThread) {
139
- await this.switchToThread(lastThread);
127
+ if (newState !== "deleted") {
128
+ this._threadData.set(threadId, {
129
+ ...data,
130
+ state: newState
131
+ });
132
+ }
133
+ if (threadId === this._mainThreadId && (newState === "archived" || newState === "deleted")) {
134
+ const lastThreadId = this._threadIds[0];
135
+ if (lastThreadId) {
136
+ await this.switchToThread(lastThreadId);
140
137
  } else {
141
138
  await this.switchToNewThread();
142
139
  }
140
+ } else {
141
+ this._notifySubscribers();
143
142
  }
144
143
  }
145
144
  rename(threadId, newTitle) {
146
145
  const data = this._threadData.get(threadId);
147
146
  if (!data) throw new Error("Thread not found");
148
- data.runtime.metadata.rename(newTitle);
147
+ this._threadData.set(threadId, {
148
+ ...data,
149
+ title: newTitle
150
+ });
151
+ this._notifySubscribers();
149
152
  return Promise.resolve();
150
153
  }
151
154
  archive(threadId) {
152
155
  const data = this._threadData.get(threadId);
153
156
  if (!data) throw new Error("Thread not found");
154
- if (data.lastState !== "regular")
155
- throw new Error("Thread is not yet created or archived");
156
- data.runtime.metadata.archive();
157
+ if (data.state !== "regular")
158
+ throw new Error("Thread is not yet initialized or already archived");
159
+ this._stateOp(threadId, "archived");
157
160
  return Promise.resolve();
158
161
  }
159
162
  unarchive(threadId) {
160
163
  const data = this._threadData.get(threadId);
161
164
  if (!data) throw new Error("Thread not found");
162
- if (data.lastState !== "archived")
163
- throw new Error("Thread is not archived");
164
- data.runtime.metadata.unarchive();
165
+ if (data.state !== "archived") throw new Error("Thread is not archived");
166
+ this._stateOp(threadId, "regular");
165
167
  return Promise.resolve();
166
168
  }
167
169
  delete(threadId) {
168
170
  const data = this._threadData.get(threadId);
169
171
  if (!data) throw new Error("Thread not found");
170
- if (data.lastState !== "regular" && data.lastState !== "archived")
171
- throw new Error("Thread is not yet created or already deleted");
172
- data.runtime.metadata.delete();
172
+ if (data.state !== "regular" && data.state !== "archived")
173
+ throw new Error("Thread is not yet initalized");
174
+ this._stateOp(threadId, "deleted");
173
175
  return Promise.resolve();
174
176
  }
175
177
  _subscriptions = /* @__PURE__ */ new Set();
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/runtimes/local/LocalThreadListRuntimeCore.tsx"],"sourcesContent":["import type { Unsubscribe } from \"../../types\";\nimport { ThreadListRuntimeCore } from \"../core/ThreadListRuntimeCore\";\nimport { ExportedMessageRepository } from \"../utils/MessageRepository\";\nimport { generateId } from \"../../utils/idUtils\";\nimport { LocalThreadRuntimeCore } from \"./LocalThreadRuntimeCore\";\nimport { ThreadMetadata } from \"../core/ThreadRuntimeCore\";\n\nexport type ThreadListAdapter = {\n subscribe(callback: () => void): Unsubscribe;\n};\n\nexport type LocalThreadData = {\n runtime: LocalThreadRuntimeCore;\n lastState: ThreadMetadata[\"state\"];\n dispose: Unsubscribe;\n};\n\nexport type LocalThreadFactory = (\n threadId: string,\n data: ExportedMessageRepository,\n) => LocalThreadRuntimeCore;\n\nexport class LocalThreadListRuntimeCore implements ThreadListRuntimeCore {\n private _threadData = new Map<string, LocalThreadData>();\n private _threads: readonly string[] = [];\n private _archivedThreads: readonly string[] = [];\n private _newThread: string | undefined;\n\n public get newThread() {\n return this._newThread;\n }\n\n public get threads() {\n return this._threads;\n }\n\n public get archivedThreads() {\n return this._archivedThreads;\n }\n\n private _mainThread!: LocalThreadRuntimeCore;\n\n public get mainThread(): LocalThreadRuntimeCore {\n return this._mainThread;\n }\n\n constructor(private _threadFactory: LocalThreadFactory) {\n this.switchToNewThread();\n }\n\n public getThreadMetadataById(threadId: string) {\n return this._threadData.get(threadId)?.runtime.metadata;\n }\n\n public switchToThread(threadId: string): Promise<void> {\n if (this._mainThread?.metadata.threadId === threadId)\n return Promise.resolve();\n\n const data = this._threadData.get(threadId);\n if (!data) throw new Error(\"Thread not found\");\n\n if (data.runtime.metadata.state === \"archived\") this.unarchive(threadId);\n\n this._mainThread?._notifyEventSubscribers(\"switched-away\");\n this._mainThread = data.runtime;\n this._notifySubscribers();\n\n data.runtime._notifyEventSubscribers(\"switched-to\");\n return Promise.resolve();\n }\n\n public switchToNewThread(): Promise<void> {\n if (this._newThread === undefined) {\n let threadId: string;\n do {\n threadId = generateId();\n } while (this._threadData.has(threadId));\n\n const runtime = this._threadFactory(threadId, { messages: [] });\n const dispose = runtime.metadata.subscribe(() => {\n this._syncState(threadId, runtime.metadata);\n threadId = runtime.metadata.threadId;\n });\n this._threadData.set(threadId, { runtime, lastState: \"new\", dispose });\n this._newThread = threadId;\n }\n\n this.switchToThread(this._newThread);\n return Promise.resolve();\n }\n\n private async _syncState(\n lastThreadId: string,\n { state, threadId }: ThreadMetadata,\n ) {\n const data = this._threadData.get(lastThreadId);\n if (!data) throw new Error(\"Thread not found\");\n const lastState = data.lastState;\n if (lastState === state && lastThreadId === threadId) return;\n\n if (lastThreadId !== threadId) {\n this._threadData.delete(lastThreadId);\n if (lastState === \"new\") {\n this._newThread = threadId;\n }\n if (lastState === \"regular\") {\n this._threads = this._threads.map((t) =>\n t === lastThreadId ? threadId : t,\n );\n }\n if (lastState === \"archived\") {\n this._archivedThreads = this._archivedThreads.map((t) =>\n t === lastThreadId ? threadId : t,\n );\n }\n }\n\n if (lastState !== state) {\n if (lastState === \"new\") {\n this._newThread = undefined;\n }\n\n if (lastState === \"regular\") {\n this._threads = this._threads.filter((t) => t !== threadId);\n }\n\n if (lastState === \"archived\") {\n this._archivedThreads = this._archivedThreads.filter(\n (t) => t !== threadId,\n );\n }\n\n if (state === \"new\") {\n if (this._newThread) {\n this.delete(this._newThread);\n }\n this._newThread = threadId;\n }\n if (state === \"archived\") {\n this._archivedThreads = [\n ...this._archivedThreads,\n data.runtime.metadata.threadId,\n ];\n }\n if (state === \"regular\") {\n this._threads = [...this._threads, data.runtime.metadata.threadId];\n }\n if (state === \"deleted\") {\n data.dispose();\n this._threadData.delete(threadId);\n }\n\n data.lastState = state;\n }\n\n this._notifySubscribers();\n\n if (\n threadId === this._mainThread.metadata.threadId &&\n (state === \"archived\" || state === \"deleted\")\n ) {\n const lastThread = this._threads[0];\n if (lastThread) {\n await this.switchToThread(lastThread);\n } else {\n await this.switchToNewThread();\n }\n }\n }\n\n public rename(threadId: string, newTitle: string): Promise<void> {\n const data = this._threadData.get(threadId);\n if (!data) throw new Error(\"Thread not found\");\n data.runtime.metadata.rename(newTitle);\n\n return Promise.resolve();\n }\n\n public archive(threadId: string): Promise<void> {\n const data = this._threadData.get(threadId);\n if (!data) throw new Error(\"Thread not found\");\n if (data.lastState !== \"regular\")\n throw new Error(\"Thread is not yet created or archived\");\n data.runtime.metadata.archive();\n\n return Promise.resolve();\n }\n\n public unarchive(threadId: string): Promise<void> {\n const data = this._threadData.get(threadId);\n if (!data) throw new Error(\"Thread not found\");\n if (data.lastState !== \"archived\")\n throw new Error(\"Thread is not archived\");\n data.runtime.metadata.unarchive();\n\n return Promise.resolve();\n }\n\n public delete(threadId: string): Promise<void> {\n const data = this._threadData.get(threadId);\n if (!data) throw new Error(\"Thread not found\");\n if (data.lastState !== \"regular\" && data.lastState !== \"archived\")\n throw new Error(\"Thread is not yet created or already deleted\");\n data.runtime.metadata.delete();\n\n return Promise.resolve();\n }\n\n private _subscriptions = new Set<() => void>();\n\n public subscribe(callback: () => void): Unsubscribe {\n this._subscriptions.add(callback);\n return () => this._subscriptions.delete(callback);\n }\n\n private _notifySubscribers() {\n for (const callback of this._subscriptions) callback();\n }\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../src/runtimes/local/LocalThreadListRuntimeCore.tsx"],"sourcesContent":["import type { Unsubscribe } from \"../../types\";\nimport { ThreadListRuntimeCore } from \"../core/ThreadListRuntimeCore\";\nimport { ExportedMessageRepository } from \"../utils/MessageRepository\";\nimport { generateId } from \"../../utils/idUtils\";\nimport { LocalThreadRuntimeCore } from \"./LocalThreadRuntimeCore\";\n\nexport type ThreadListAdapter = {\n subscribe(callback: () => void): Unsubscribe;\n};\n\nexport type LocalThreadData = {\n readonly runtime: LocalThreadRuntimeCore;\n readonly state: \"new\" | \"regular\" | \"archived\";\n readonly threadId: string;\n readonly title?: string | undefined;\n\n dispose(): void;\n};\n\nexport type LocalThreadFactory = (\n data: ExportedMessageRepository,\n) => LocalThreadRuntimeCore;\n\nexport class LocalThreadListRuntimeCore implements ThreadListRuntimeCore {\n private _threadData = new Map<string, LocalThreadData>();\n private _threadIds: readonly string[] = [];\n private _archivedThreadIds: readonly string[] = [];\n private _newThreadId: string | undefined;\n\n public get newThreadId() {\n return this._newThreadId;\n }\n\n public get threadIds() {\n return this._threadIds;\n }\n\n public get archivedThreadIds() {\n return this._archivedThreadIds;\n }\n\n private _mainThreadId!: string;\n\n public get mainThreadId(): string {\n return this._mainThreadId;\n }\n\n constructor(private _threadFactory: LocalThreadFactory) {\n this.switchToNewThread();\n }\n\n public getMainThreadRuntimeCore() {\n const result = this._threadData.get(this._mainThreadId)?.runtime;\n if (!result)\n throw new Error(\"Main thread not found. This is a bug in assistant-ui.\");\n return result;\n }\n\n public getItemById(threadId: string) {\n return this._threadData.get(threadId);\n }\n\n public async switchToThread(threadId: string): Promise<void> {\n if (this._mainThreadId === threadId) return;\n\n const data = this._threadData.get(threadId);\n if (!data) throw new Error(\"Thread not found\");\n\n if (data.state === \"archived\") await this.unarchive(threadId);\n\n this._mainThreadId = data.threadId;\n this._notifySubscribers();\n }\n\n public switchToNewThread(): Promise<void> {\n if (this._newThreadId === undefined) {\n let threadId: string;\n do {\n threadId = generateId();\n } while (this._threadData.has(threadId));\n\n const runtime = this._threadFactory({ messages: [] });\n const dispose = runtime.unstable_on(\"initialize\", () => {\n const data = this._threadData.get(threadId);\n if (!data) throw new Error(\"Thread not found\");\n\n this._stateOp(threadId, \"regular\");\n });\n this._threadData.set(threadId, {\n runtime,\n state: \"new\",\n threadId,\n dispose,\n });\n this._newThreadId = threadId;\n }\n\n this.switchToThread(this._newThreadId);\n return Promise.resolve();\n }\n\n private async _stateOp(\n threadId: string,\n newState: \"regular\" | \"archived\" | \"deleted\",\n ) {\n const data = this._threadData.get(threadId);\n if (!data) throw new Error(\"Thread not found\");\n\n const { state: lastState } = data;\n if (lastState === newState) return;\n\n // lastState\n switch (lastState) {\n case \"new\":\n this._newThreadId = undefined;\n break;\n case \"regular\":\n this._threadIds = this._threadIds.filter((t) => t !== threadId);\n break;\n case \"archived\":\n this._archivedThreadIds = this._archivedThreadIds.filter(\n (t) => t !== threadId,\n );\n break;\n\n default: {\n const _exhaustiveCheck: never = lastState;\n throw new Error(`Unsupported state: ${_exhaustiveCheck}`);\n }\n }\n\n // newState\n switch (newState) {\n case \"regular\":\n this._threadIds = [...this._threadIds, data.threadId];\n break;\n\n case \"archived\":\n this._archivedThreadIds = [...this._archivedThreadIds, data.threadId];\n break;\n\n case \"deleted\":\n this._threadData.delete(threadId);\n data.dispose();\n break;\n\n default: {\n const _exhaustiveCheck: never = newState;\n throw new Error(`Unsupported state: ${_exhaustiveCheck}`);\n }\n }\n\n if (newState !== \"deleted\") {\n this._threadData.set(threadId, {\n ...data,\n state: newState,\n });\n }\n\n if (\n threadId === this._mainThreadId &&\n (newState === \"archived\" || newState === \"deleted\")\n ) {\n const lastThreadId = this._threadIds[0];\n if (lastThreadId) {\n await this.switchToThread(lastThreadId);\n } else {\n await this.switchToNewThread();\n }\n } else {\n this._notifySubscribers();\n }\n }\n\n public rename(threadId: string, newTitle: string): Promise<void> {\n const data = this._threadData.get(threadId);\n if (!data) throw new Error(\"Thread not found\");\n\n this._threadData.set(threadId, {\n ...data,\n title: newTitle,\n });\n this._notifySubscribers();\n return Promise.resolve();\n }\n\n public archive(threadId: string): Promise<void> {\n const data = this._threadData.get(threadId);\n if (!data) throw new Error(\"Thread not found\");\n if (data.state !== \"regular\")\n throw new Error(\"Thread is not yet initialized or already archived\");\n\n this._stateOp(threadId, \"archived\");\n return Promise.resolve();\n }\n\n public unarchive(threadId: string): Promise<void> {\n const data = this._threadData.get(threadId);\n if (!data) throw new Error(\"Thread not found\");\n if (data.state !== \"archived\") throw new Error(\"Thread is not archived\");\n\n this._stateOp(threadId, \"regular\");\n return Promise.resolve();\n }\n\n public delete(threadId: string): Promise<void> {\n const data = this._threadData.get(threadId);\n if (!data) throw new Error(\"Thread not found\");\n if (data.state !== \"regular\" && data.state !== \"archived\")\n throw new Error(\"Thread is not yet initalized\");\n\n this._stateOp(threadId, \"deleted\");\n return Promise.resolve();\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":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAGA,qBAA2B;AAoBpB,IAAM,6BAAN,MAAkE;AAAA,EAwBvE,YAAoB,gBAAoC;AAApC;AAClB,SAAK,kBAAkB;AAAA,EACzB;AAAA,EAzBQ,cAAc,oBAAI,IAA6B;AAAA,EAC/C,aAAgC,CAAC;AAAA,EACjC,qBAAwC,CAAC;AAAA,EACzC;AAAA,EAER,IAAW,cAAc;AACvB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAW,YAAY;AACrB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAW,oBAAoB;AAC7B,WAAO,KAAK;AAAA,EACd;AAAA,EAEQ;AAAA,EAER,IAAW,eAAuB;AAChC,WAAO,KAAK;AAAA,EACd;AAAA,EAMO,2BAA2B;AAChC,UAAM,SAAS,KAAK,YAAY,IAAI,KAAK,aAAa,GAAG;AACzD,QAAI,CAAC;AACH,YAAM,IAAI,MAAM,uDAAuD;AACzE,WAAO;AAAA,EACT;AAAA,EAEO,YAAY,UAAkB;AACnC,WAAO,KAAK,YAAY,IAAI,QAAQ;AAAA,EACtC;AAAA,EAEA,MAAa,eAAe,UAAiC;AAC3D,QAAI,KAAK,kBAAkB,SAAU;AAErC,UAAM,OAAO,KAAK,YAAY,IAAI,QAAQ;AAC1C,QAAI,CAAC,KAAM,OAAM,IAAI,MAAM,kBAAkB;AAE7C,QAAI,KAAK,UAAU,WAAY,OAAM,KAAK,UAAU,QAAQ;AAE5D,SAAK,gBAAgB,KAAK;AAC1B,SAAK,mBAAmB;AAAA,EAC1B;AAAA,EAEO,oBAAmC;AACxC,QAAI,KAAK,iBAAiB,QAAW;AACnC,UAAI;AACJ,SAAG;AACD,uBAAW,2BAAW;AAAA,MACxB,SAAS,KAAK,YAAY,IAAI,QAAQ;AAEtC,YAAM,UAAU,KAAK,eAAe,EAAE,UAAU,CAAC,EAAE,CAAC;AACpD,YAAM,UAAU,QAAQ,YAAY,cAAc,MAAM;AACtD,cAAM,OAAO,KAAK,YAAY,IAAI,QAAQ;AAC1C,YAAI,CAAC,KAAM,OAAM,IAAI,MAAM,kBAAkB;AAE7C,aAAK,SAAS,UAAU,SAAS;AAAA,MACnC,CAAC;AACD,WAAK,YAAY,IAAI,UAAU;AAAA,QAC7B;AAAA,QACA,OAAO;AAAA,QACP;AAAA,QACA;AAAA,MACF,CAAC;AACD,WAAK,eAAe;AAAA,IACtB;AAEA,SAAK,eAAe,KAAK,YAAY;AACrC,WAAO,QAAQ,QAAQ;AAAA,EACzB;AAAA,EAEA,MAAc,SACZ,UACA,UACA;AACA,UAAM,OAAO,KAAK,YAAY,IAAI,QAAQ;AAC1C,QAAI,CAAC,KAAM,OAAM,IAAI,MAAM,kBAAkB;AAE7C,UAAM,EAAE,OAAO,UAAU,IAAI;AAC7B,QAAI,cAAc,SAAU;AAG5B,YAAQ,WAAW;AAAA,MACjB,KAAK;AACH,aAAK,eAAe;AACpB;AAAA,MACF,KAAK;AACH,aAAK,aAAa,KAAK,WAAW,OAAO,CAAC,MAAM,MAAM,QAAQ;AAC9D;AAAA,MACF,KAAK;AACH,aAAK,qBAAqB,KAAK,mBAAmB;AAAA,UAChD,CAAC,MAAM,MAAM;AAAA,QACf;AACA;AAAA,MAEF,SAAS;AACP,cAAM,mBAA0B;AAChC,cAAM,IAAI,MAAM,sBAAsB,gBAAgB,EAAE;AAAA,MAC1D;AAAA,IACF;AAGA,YAAQ,UAAU;AAAA,MAChB,KAAK;AACH,aAAK,aAAa,CAAC,GAAG,KAAK,YAAY,KAAK,QAAQ;AACpD;AAAA,MAEF,KAAK;AACH,aAAK,qBAAqB,CAAC,GAAG,KAAK,oBAAoB,KAAK,QAAQ;AACpE;AAAA,MAEF,KAAK;AACH,aAAK,YAAY,OAAO,QAAQ;AAChC,aAAK,QAAQ;AACb;AAAA,MAEF,SAAS;AACP,cAAM,mBAA0B;AAChC,cAAM,IAAI,MAAM,sBAAsB,gBAAgB,EAAE;AAAA,MAC1D;AAAA,IACF;AAEA,QAAI,aAAa,WAAW;AAC1B,WAAK,YAAY,IAAI,UAAU;AAAA,QAC7B,GAAG;AAAA,QACH,OAAO;AAAA,MACT,CAAC;AAAA,IACH;AAEA,QACE,aAAa,KAAK,kBACjB,aAAa,cAAc,aAAa,YACzC;AACA,YAAM,eAAe,KAAK,WAAW,CAAC;AACtC,UAAI,cAAc;AAChB,cAAM,KAAK,eAAe,YAAY;AAAA,MACxC,OAAO;AACL,cAAM,KAAK,kBAAkB;AAAA,MAC/B;AAAA,IACF,OAAO;AACL,WAAK,mBAAmB;AAAA,IAC1B;AAAA,EACF;AAAA,EAEO,OAAO,UAAkB,UAAiC;AAC/D,UAAM,OAAO,KAAK,YAAY,IAAI,QAAQ;AAC1C,QAAI,CAAC,KAAM,OAAM,IAAI,MAAM,kBAAkB;AAE7C,SAAK,YAAY,IAAI,UAAU;AAAA,MAC7B,GAAG;AAAA,MACH,OAAO;AAAA,IACT,CAAC;AACD,SAAK,mBAAmB;AACxB,WAAO,QAAQ,QAAQ;AAAA,EACzB;AAAA,EAEO,QAAQ,UAAiC;AAC9C,UAAM,OAAO,KAAK,YAAY,IAAI,QAAQ;AAC1C,QAAI,CAAC,KAAM,OAAM,IAAI,MAAM,kBAAkB;AAC7C,QAAI,KAAK,UAAU;AACjB,YAAM,IAAI,MAAM,mDAAmD;AAErE,SAAK,SAAS,UAAU,UAAU;AAClC,WAAO,QAAQ,QAAQ;AAAA,EACzB;AAAA,EAEO,UAAU,UAAiC;AAChD,UAAM,OAAO,KAAK,YAAY,IAAI,QAAQ;AAC1C,QAAI,CAAC,KAAM,OAAM,IAAI,MAAM,kBAAkB;AAC7C,QAAI,KAAK,UAAU,WAAY,OAAM,IAAI,MAAM,wBAAwB;AAEvE,SAAK,SAAS,UAAU,SAAS;AACjC,WAAO,QAAQ,QAAQ;AAAA,EACzB;AAAA,EAEO,OAAO,UAAiC;AAC7C,UAAM,OAAO,KAAK,YAAY,IAAI,QAAQ;AAC1C,QAAI,CAAC,KAAM,OAAM,IAAI,MAAM,kBAAkB;AAC7C,QAAI,KAAK,UAAU,aAAa,KAAK,UAAU;AAC7C,YAAM,IAAI,MAAM,8BAA8B;AAEhD,SAAK,SAAS,UAAU,SAAS;AACjC,WAAO,QAAQ,QAAQ;AAAA,EACzB;AAAA,EAEQ,iBAAiB,oBAAI,IAAgB;AAAA,EAEtC,UAAU,UAAmC;AAClD,SAAK,eAAe,IAAI,QAAQ;AAChC,WAAO,MAAM,KAAK,eAAe,OAAO,QAAQ;AAAA,EAClD;AAAA,EAEQ,qBAAqB;AAC3B,eAAW,YAAY,KAAK,eAAgB,UAAS;AAAA,EACvD;AACF;","names":[]}
@@ -6,146 +6,148 @@ var LocalThreadListRuntimeCore = class {
6
6
  this.switchToNewThread();
7
7
  }
8
8
  _threadData = /* @__PURE__ */ new Map();
9
- _threads = [];
10
- _archivedThreads = [];
11
- _newThread;
12
- get newThread() {
13
- return this._newThread;
9
+ _threadIds = [];
10
+ _archivedThreadIds = [];
11
+ _newThreadId;
12
+ get newThreadId() {
13
+ return this._newThreadId;
14
14
  }
15
- get threads() {
16
- return this._threads;
15
+ get threadIds() {
16
+ return this._threadIds;
17
17
  }
18
- get archivedThreads() {
19
- return this._archivedThreads;
18
+ get archivedThreadIds() {
19
+ return this._archivedThreadIds;
20
20
  }
21
- _mainThread;
22
- get mainThread() {
23
- return this._mainThread;
21
+ _mainThreadId;
22
+ get mainThreadId() {
23
+ return this._mainThreadId;
24
24
  }
25
- getThreadMetadataById(threadId) {
26
- return this._threadData.get(threadId)?.runtime.metadata;
25
+ getMainThreadRuntimeCore() {
26
+ const result = this._threadData.get(this._mainThreadId)?.runtime;
27
+ if (!result)
28
+ throw new Error("Main thread not found. This is a bug in assistant-ui.");
29
+ return result;
27
30
  }
28
- switchToThread(threadId) {
29
- if (this._mainThread?.metadata.threadId === threadId)
30
- return Promise.resolve();
31
+ getItemById(threadId) {
32
+ return this._threadData.get(threadId);
33
+ }
34
+ async switchToThread(threadId) {
35
+ if (this._mainThreadId === threadId) return;
31
36
  const data = this._threadData.get(threadId);
32
37
  if (!data) throw new Error("Thread not found");
33
- if (data.runtime.metadata.state === "archived") this.unarchive(threadId);
34
- this._mainThread?._notifyEventSubscribers("switched-away");
35
- this._mainThread = data.runtime;
38
+ if (data.state === "archived") await this.unarchive(threadId);
39
+ this._mainThreadId = data.threadId;
36
40
  this._notifySubscribers();
37
- data.runtime._notifyEventSubscribers("switched-to");
38
- return Promise.resolve();
39
41
  }
40
42
  switchToNewThread() {
41
- if (this._newThread === void 0) {
43
+ if (this._newThreadId === void 0) {
42
44
  let threadId;
43
45
  do {
44
46
  threadId = generateId();
45
47
  } while (this._threadData.has(threadId));
46
- const runtime = this._threadFactory(threadId, { messages: [] });
47
- const dispose = runtime.metadata.subscribe(() => {
48
- this._syncState(threadId, runtime.metadata);
49
- threadId = runtime.metadata.threadId;
48
+ const runtime = this._threadFactory({ messages: [] });
49
+ const dispose = runtime.unstable_on("initialize", () => {
50
+ const data = this._threadData.get(threadId);
51
+ if (!data) throw new Error("Thread not found");
52
+ this._stateOp(threadId, "regular");
53
+ });
54
+ this._threadData.set(threadId, {
55
+ runtime,
56
+ state: "new",
57
+ threadId,
58
+ dispose
50
59
  });
51
- this._threadData.set(threadId, { runtime, lastState: "new", dispose });
52
- this._newThread = threadId;
60
+ this._newThreadId = threadId;
53
61
  }
54
- this.switchToThread(this._newThread);
62
+ this.switchToThread(this._newThreadId);
55
63
  return Promise.resolve();
56
64
  }
57
- async _syncState(lastThreadId, { state, threadId }) {
58
- const data = this._threadData.get(lastThreadId);
65
+ async _stateOp(threadId, newState) {
66
+ const data = this._threadData.get(threadId);
59
67
  if (!data) throw new Error("Thread not found");
60
- const lastState = data.lastState;
61
- if (lastState === state && lastThreadId === threadId) return;
62
- if (lastThreadId !== threadId) {
63
- this._threadData.delete(lastThreadId);
64
- if (lastState === "new") {
65
- this._newThread = threadId;
66
- }
67
- if (lastState === "regular") {
68
- this._threads = this._threads.map(
69
- (t) => t === lastThreadId ? threadId : t
70
- );
71
- }
72
- if (lastState === "archived") {
73
- this._archivedThreads = this._archivedThreads.map(
74
- (t) => t === lastThreadId ? threadId : t
75
- );
76
- }
77
- }
78
- if (lastState !== state) {
79
- if (lastState === "new") {
80
- this._newThread = void 0;
81
- }
82
- if (lastState === "regular") {
83
- this._threads = this._threads.filter((t) => t !== threadId);
84
- }
85
- if (lastState === "archived") {
86
- this._archivedThreads = this._archivedThreads.filter(
68
+ const { state: lastState } = data;
69
+ if (lastState === newState) return;
70
+ switch (lastState) {
71
+ case "new":
72
+ this._newThreadId = void 0;
73
+ break;
74
+ case "regular":
75
+ this._threadIds = this._threadIds.filter((t) => t !== threadId);
76
+ break;
77
+ case "archived":
78
+ this._archivedThreadIds = this._archivedThreadIds.filter(
87
79
  (t) => t !== threadId
88
80
  );
81
+ break;
82
+ default: {
83
+ const _exhaustiveCheck = lastState;
84
+ throw new Error(`Unsupported state: ${_exhaustiveCheck}`);
89
85
  }
90
- if (state === "new") {
91
- if (this._newThread) {
92
- this.delete(this._newThread);
93
- }
94
- this._newThread = threadId;
95
- }
96
- if (state === "archived") {
97
- this._archivedThreads = [
98
- ...this._archivedThreads,
99
- data.runtime.metadata.threadId
100
- ];
101
- }
102
- if (state === "regular") {
103
- this._threads = [...this._threads, data.runtime.metadata.threadId];
104
- }
105
- if (state === "deleted") {
106
- data.dispose();
86
+ }
87
+ switch (newState) {
88
+ case "regular":
89
+ this._threadIds = [...this._threadIds, data.threadId];
90
+ break;
91
+ case "archived":
92
+ this._archivedThreadIds = [...this._archivedThreadIds, data.threadId];
93
+ break;
94
+ case "deleted":
107
95
  this._threadData.delete(threadId);
96
+ data.dispose();
97
+ break;
98
+ default: {
99
+ const _exhaustiveCheck = newState;
100
+ throw new Error(`Unsupported state: ${_exhaustiveCheck}`);
108
101
  }
109
- data.lastState = state;
110
102
  }
111
- this._notifySubscribers();
112
- if (threadId === this._mainThread.metadata.threadId && (state === "archived" || state === "deleted")) {
113
- const lastThread = this._threads[0];
114
- if (lastThread) {
115
- await this.switchToThread(lastThread);
103
+ if (newState !== "deleted") {
104
+ this._threadData.set(threadId, {
105
+ ...data,
106
+ state: newState
107
+ });
108
+ }
109
+ if (threadId === this._mainThreadId && (newState === "archived" || newState === "deleted")) {
110
+ const lastThreadId = this._threadIds[0];
111
+ if (lastThreadId) {
112
+ await this.switchToThread(lastThreadId);
116
113
  } else {
117
114
  await this.switchToNewThread();
118
115
  }
116
+ } else {
117
+ this._notifySubscribers();
119
118
  }
120
119
  }
121
120
  rename(threadId, newTitle) {
122
121
  const data = this._threadData.get(threadId);
123
122
  if (!data) throw new Error("Thread not found");
124
- data.runtime.metadata.rename(newTitle);
123
+ this._threadData.set(threadId, {
124
+ ...data,
125
+ title: newTitle
126
+ });
127
+ this._notifySubscribers();
125
128
  return Promise.resolve();
126
129
  }
127
130
  archive(threadId) {
128
131
  const data = this._threadData.get(threadId);
129
132
  if (!data) throw new Error("Thread not found");
130
- if (data.lastState !== "regular")
131
- throw new Error("Thread is not yet created or archived");
132
- data.runtime.metadata.archive();
133
+ if (data.state !== "regular")
134
+ throw new Error("Thread is not yet initialized or already archived");
135
+ this._stateOp(threadId, "archived");
133
136
  return Promise.resolve();
134
137
  }
135
138
  unarchive(threadId) {
136
139
  const data = this._threadData.get(threadId);
137
140
  if (!data) throw new Error("Thread not found");
138
- if (data.lastState !== "archived")
139
- throw new Error("Thread is not archived");
140
- data.runtime.metadata.unarchive();
141
+ if (data.state !== "archived") throw new Error("Thread is not archived");
142
+ this._stateOp(threadId, "regular");
141
143
  return Promise.resolve();
142
144
  }
143
145
  delete(threadId) {
144
146
  const data = this._threadData.get(threadId);
145
147
  if (!data) throw new Error("Thread not found");
146
- if (data.lastState !== "regular" && data.lastState !== "archived")
147
- throw new Error("Thread is not yet created or already deleted");
148
- data.runtime.metadata.delete();
148
+ if (data.state !== "regular" && data.state !== "archived")
149
+ throw new Error("Thread is not yet initalized");
150
+ this._stateOp(threadId, "deleted");
149
151
  return Promise.resolve();
150
152
  }
151
153
  _subscriptions = /* @__PURE__ */ new Set();