@assistant-ui/react 0.14.20 → 0.14.22

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 (36) hide show
  1. package/dist/context/react/utils/createContextStoreHook.d.ts.map +1 -1
  2. package/dist/context/react/utils/createContextStoreHook.js +3 -18
  3. package/dist/context/react/utils/createContextStoreHook.js.map +1 -1
  4. package/dist/index.d.ts +3 -2
  5. package/dist/index.js +3 -2
  6. package/dist/internal.d.ts +3 -3
  7. package/dist/internal.js +2 -4
  8. package/dist/internal.js.map +1 -1
  9. package/dist/primitives/composer/trigger/TriggerPopover.d.ts +4 -2
  10. package/dist/primitives/composer/trigger/TriggerPopover.d.ts.map +1 -1
  11. package/dist/primitives/composer/trigger/TriggerPopover.js +125 -119
  12. package/dist/primitives/composer/trigger/TriggerPopover.js.map +1 -1
  13. package/dist/primitives/composer/trigger/TriggerPopoverResource.d.ts +3 -1
  14. package/dist/primitives/composer/trigger/TriggerPopoverResource.d.ts.map +1 -1
  15. package/dist/primitives/composer/trigger/TriggerPopoverResource.js +22 -20
  16. package/dist/primitives/composer/trigger/TriggerPopoverResource.js.map +1 -1
  17. package/dist/primitives/composer/trigger/index.d.ts +1 -0
  18. package/dist/unstable/useLiveCompletionAdapter.d.ts +47 -0
  19. package/dist/unstable/useLiveCompletionAdapter.d.ts.map +1 -0
  20. package/dist/unstable/useLiveCompletionAdapter.js +116 -0
  21. package/dist/unstable/useLiveCompletionAdapter.js.map +1 -0
  22. package/dist/utils/smooth/useSmooth.d.ts +8 -0
  23. package/dist/utils/smooth/useSmooth.d.ts.map +1 -1
  24. package/dist/utils/smooth/useSmooth.js +11 -2
  25. package/dist/utils/smooth/useSmooth.js.map +1 -1
  26. package/package.json +4 -4
  27. package/src/context/react/utils/createContextStoreHook.ts +4 -3
  28. package/src/index.ts +7 -0
  29. package/src/internal.ts +0 -2
  30. package/src/primitives/composer/trigger/TriggerPopover.tsx +11 -1
  31. package/src/primitives/composer/trigger/TriggerPopoverResource.ts +5 -0
  32. package/src/tests/ExternalStoreThreadRuntimeCore.test.ts +113 -0
  33. package/src/unstable/useLiveCompletionAdapter.test.tsx +176 -0
  34. package/src/unstable/useLiveCompletionAdapter.ts +145 -0
  35. package/src/utils/smooth/useSmooth.test.tsx +106 -2
  36. package/src/utils/smooth/useSmooth.ts +20 -2
@@ -33,6 +33,14 @@ export type SmoothOptions = {
33
33
  * @default Infinity
34
34
  */
35
35
  maxCharsPerFrame?: number | undefined;
36
+ /**
37
+ * Minimum time in milliseconds between committed updates. The reveal keeps
38
+ * advancing every frame, but the visible text (and the downstream re-render
39
+ * and markdown re-parse it triggers) is committed at most once per interval.
40
+ * The final frame always commits. `0` commits every frame.
41
+ * @default 0
42
+ */
43
+ minCommitMs?: number | undefined;
36
44
  };
37
45
 
38
46
  const DEFAULT_DRAIN_MS = 250;
@@ -41,11 +49,13 @@ const DEFAULT_MAX_CHAR_INTERVAL_MS = 5;
41
49
  class TextStreamAnimator {
42
50
  private animationFrameId: number | null = null;
43
51
  private lastUpdateTime: number = Date.now();
52
+ public lastCommitTime: number = 0;
44
53
 
45
54
  public targetText: string = "";
46
55
  public drainMs: number = DEFAULT_DRAIN_MS;
47
56
  public maxCharIntervalMs: number = DEFAULT_MAX_CHAR_INTERVAL_MS;
48
57
  public maxCharsPerFrame: number = Infinity;
58
+ public minCommitMs: number = 0;
49
59
 
50
60
  constructor(
51
61
  public currentText: string,
@@ -100,7 +110,12 @@ class TextStreamAnimator {
100
110
  this.currentText.length + charsToAdd,
101
111
  );
102
112
  this.lastUpdateTime = currentTime - timeToConsume;
103
- this.setText(this.currentText);
113
+
114
+ const isComplete = charsToAdd === remainingChars;
115
+ if (isComplete || currentTime - this.lastCommitTime >= this.minCommitMs) {
116
+ this.lastCommitTime = currentTime;
117
+ this.setText(this.currentText);
118
+ }
104
119
  };
105
120
  }
106
121
 
@@ -141,6 +156,7 @@ export const useSmooth = (
141
156
  DEFAULT_MAX_CHAR_INTERVAL_MS,
142
157
  );
143
158
  const maxCharsPerFrame = positiveOr(options?.maxCharsPerFrame, Infinity);
159
+ const minCommitMs = positiveOr(options?.minCommitMs, 0);
144
160
 
145
161
  const [displayedText, setDisplayedText] = useState(
146
162
  state.status.type === "running" ? "" : text,
@@ -194,7 +210,8 @@ export const useSmooth = (
194
210
  animatorRef.drainMs = drainMs;
195
211
  animatorRef.maxCharIntervalMs = maxCharIntervalMs;
196
212
  animatorRef.maxCharsPerFrame = maxCharsPerFrame;
197
- }, [animatorRef, drainMs, maxCharIntervalMs, maxCharsPerFrame]);
213
+ animatorRef.minCommitMs = minCommitMs;
214
+ }, [animatorRef, drainMs, maxCharIntervalMs, maxCharsPerFrame, minCommitMs]);
198
215
 
199
216
  const animatorPartRef = useRef(part);
200
217
  useEffect(() => {
@@ -214,6 +231,7 @@ export const useSmooth = (
214
231
  if (state.status.type === "running") {
215
232
  animatorRef.currentText = "";
216
233
  animatorRef.targetText = text;
234
+ animatorRef.lastCommitTime = 0;
217
235
  animatorRef.start();
218
236
  } else {
219
237
  animatorRef.currentText = text;