ugly-app 0.1.621 → 0.1.623

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.
@@ -1,2 +1,2 @@
1
- export declare const CLI_VERSION = "0.1.621";
1
+ export declare const CLI_VERSION = "0.1.623";
2
2
  //# sourceMappingURL=version.d.ts.map
@@ -1,3 +1,3 @@
1
1
  // Auto-generated by prebuild — do not edit manually
2
- export const CLI_VERSION = "0.1.621";
2
+ export const CLI_VERSION = "0.1.623";
3
3
  //# sourceMappingURL=version.js.map
@@ -15,7 +15,17 @@ export interface ScrollAnimationStyle {
15
15
  opacity: number;
16
16
  transform: string;
17
17
  transition?: string;
18
+ willChange?: string;
18
19
  }
20
+ /**
21
+ * Reveal-on-scroll hook driven entirely by CSS transitions.
22
+ *
23
+ * The element renders ONCE in its hidden state and ONCE in its visible state;
24
+ * the GPU interpolates opacity/transform between them. There is no per-frame
25
+ * React re-render (the previous implementation ran a requestAnimationFrame loop
26
+ * that called forceUpdate() every frame, per instance — with several staggered
27
+ * items on screen that re-render storm caused the visible jank).
28
+ */
19
29
  export declare function useScrollAnimation<T extends HTMLElement = HTMLDivElement>(config?: ScrollAnimationConfig): {
20
30
  ref: import("react").RefObject<T | null>;
21
31
  style: ScrollAnimationStyle;
@@ -1 +1 @@
1
- {"version":3,"file":"useScrollAnimation.d.ts","sourceRoot":"","sources":["../../../src/client/animation/useScrollAnimation.ts"],"names":[],"mappings":"AAaA,MAAM,MAAM,mBAAmB,GAC3B,QAAQ,GACR,SAAS,GACT,WAAW,GACX,WAAW,GACX,YAAY,GACZ,OAAO,GACP,MAAM,CAAC;AAEX,MAAM,WAAW,qBAAqB;IACpC,8BAA8B;IAC9B,SAAS,CAAC,EAAE,mBAAmB,CAAC;IAChC,uDAAuD;IACvD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,8CAA8C;IAC9C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,kEAAkE;IAClE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,wCAAwC;IACxC,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,wBAAgB,kBAAkB,CAAC,CAAC,SAAS,WAAW,GAAG,cAAc,EACvE,MAAM,GAAE,qBAA0B;;;;;EAiFnC;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE;IAC1C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,mBAAmB,CAAC;IAChC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,WAUW,MAAM,KAAG,qBAAqB,CAQzC"}
1
+ {"version":3,"file":"useScrollAnimation.d.ts","sourceRoot":"","sources":["../../../src/client/animation/useScrollAnimation.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,mBAAmB,GAC3B,QAAQ,GACR,SAAS,GACT,WAAW,GACX,WAAW,GACX,YAAY,GACZ,OAAO,GACP,MAAM,CAAC;AAEX,MAAM,WAAW,qBAAqB;IACpC,8BAA8B;IAC9B,SAAS,CAAC,EAAE,mBAAmB,CAAC;IAChC,uDAAuD;IACvD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,8CAA8C;IAC9C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,kEAAkE;IAClE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,wCAAwC;IACxC,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAiCD;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,SAAS,WAAW,GAAG,cAAc,EACvE,MAAM,GAAE,qBAA0B;;;;;EAoDnC;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE;IAC1C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,mBAAmB,CAAC;IAChC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,IASS,OAAO,MAAM,KAAG,qBAAqB,CAM9C"}
@@ -1,82 +1,87 @@
1
- import { useCallback, useEffect, useLayoutEffect, useRef, useState, } from 'react';
2
- import { easingFunctions, useAnimatedValue, useAnimatedValueTracker, } from './animatedValue.js';
1
+ import { useEffect, useRef, useState } from 'react';
2
+ // Smooth ease-out (no overshoot/bounce the old springBouncy easing read as
3
+ // "jerky" once many items animated at once). Compositor-friendly.
4
+ const EASE = 'cubic-bezier(0.16, 1, 0.3, 1)';
5
+ function hiddenTransform(animation) {
6
+ switch (animation) {
7
+ case 'slideUp':
8
+ return 'translateY(40px)';
9
+ case 'slideDown':
10
+ return 'translateY(-40px)';
11
+ case 'slideLeft':
12
+ return 'translateX(40px)';
13
+ case 'slideRight':
14
+ return 'translateX(-40px)';
15
+ case 'scale':
16
+ return 'scale(0.92)';
17
+ case 'fadeIn':
18
+ case 'none':
19
+ default:
20
+ return 'none';
21
+ }
22
+ }
23
+ function prefersReducedMotion() {
24
+ return (typeof window !== 'undefined' &&
25
+ typeof window.matchMedia === 'function' &&
26
+ window.matchMedia('(prefers-reduced-motion: reduce)').matches);
27
+ }
28
+ /**
29
+ * Reveal-on-scroll hook driven entirely by CSS transitions.
30
+ *
31
+ * The element renders ONCE in its hidden state and ONCE in its visible state;
32
+ * the GPU interpolates opacity/transform between them. There is no per-frame
33
+ * React re-render (the previous implementation ran a requestAnimationFrame loop
34
+ * that called forceUpdate() every frame, per instance — with several staggered
35
+ * items on screen that re-render storm caused the visible jank).
36
+ */
3
37
  export function useScrollAnimation(config = {}) {
4
- const { animation = 'fadeIn', delay = 0, duration, threshold = 0.2, once = true, } = config;
38
+ const { animation = 'fadeIn', delay = 0, duration = 600, threshold = 0.2, once = true, } = config;
5
39
  const ref = useRef(null);
6
- const [isVisible, setIsVisible] = useState(true);
7
- const hasAnimated = useRef(false);
8
- const animatedValue = useAnimatedValue(1);
9
- const progress = useAnimatedValueTracker(animatedValue);
10
- useLayoutEffect(() => {
11
- const element = ref.current;
12
- if (!element)
13
- return;
14
- const rect = element.getBoundingClientRect();
15
- if (rect.top >= window.innerHeight) {
16
- animatedValue.set(0);
17
- setIsVisible(false);
18
- hasAnimated.current = false;
19
- }
20
- else {
21
- hasAnimated.current = true;
22
- }
23
- }, [animatedValue]);
40
+ const reduce = animation === 'none' || prefersReducedMotion();
41
+ // Hidden until revealed (unless there's nothing to animate).
42
+ const [visible, setVisible] = useState(reduce);
43
+ const hasAnimated = useRef(reduce);
24
44
  useEffect(() => {
45
+ if (reduce)
46
+ return;
25
47
  const element = ref.current;
26
48
  if (!element)
27
49
  return;
28
50
  const observer = new IntersectionObserver((entries) => {
29
- entries.forEach((entry) => {
51
+ for (const entry of entries) {
30
52
  if (entry.isIntersecting) {
31
- if (once && hasAnimated.current)
32
- return;
33
53
  hasAnimated.current = true;
34
- setIsVisible(true);
35
- setTimeout(() => {
36
- void animatedValue.start(1, {
37
- duration,
38
- easing: easingFunctions.springBouncy,
39
- });
40
- }, delay);
54
+ setVisible(true);
55
+ if (once)
56
+ observer.disconnect();
41
57
  }
42
- else if (!once) {
43
- setIsVisible(false);
44
- animatedValue.set(0);
58
+ else if (!once && !hasAnimated.current) {
59
+ setVisible(false);
45
60
  }
46
- });
61
+ }
47
62
  }, { threshold });
48
63
  observer.observe(element);
49
64
  return () => observer.disconnect();
50
- }, [animatedValue, delay, duration, once, threshold]);
51
- const getStyle = useCallback(() => {
52
- const p = progress;
53
- switch (animation) {
54
- case 'fadeIn':
55
- return { opacity: p, transform: 'none' };
56
- case 'slideUp':
57
- return { opacity: p, transform: `translateY(${40 * (1 - p)}px)` };
58
- case 'slideDown':
59
- return { opacity: p, transform: `translateY(${-40 * (1 - p)}px)` };
60
- case 'slideLeft':
61
- return { opacity: p, transform: `translateX(${40 * (1 - p)}px)` };
62
- case 'slideRight':
63
- return { opacity: p, transform: `translateX(${-40 * (1 - p)}px)` };
64
- case 'scale':
65
- return { opacity: p, transform: `scale(${0.9 + 0.1 * p})` };
66
- case 'none':
67
- default:
68
- return { opacity: 1, transform: 'none' };
69
- }
70
- }, [animation, progress]);
71
- return { ref, style: getStyle(), isVisible, progress };
65
+ }, [reduce, once, threshold]);
66
+ const transitionDelay = delay > 0 ? ` ${delay}ms` : '';
67
+ const style = {
68
+ opacity: visible ? 1 : 0,
69
+ transform: visible ? 'none' : hiddenTransform(animation),
70
+ transition: reduce
71
+ ? undefined
72
+ : `opacity ${duration}ms ${EASE}${transitionDelay}, transform ${duration}ms ${EASE}${transitionDelay}`,
73
+ // GPU-hint only while waiting to animate in; drop it once shown.
74
+ willChange: visible ? undefined : 'opacity, transform',
75
+ };
76
+ return { ref, style, isVisible: visible, progress: visible ? 1 : 0 };
72
77
  }
73
78
  export function useStaggerAnimation(config) {
74
79
  const { baseDelay = 100, startDelay = 0, animation = 'slideUp', duration = 600, threshold = 0.2, } = config;
75
- return useCallback((index) => ({
80
+ return (index) => ({
76
81
  animation,
77
82
  delay: startDelay + index * baseDelay,
78
83
  duration,
79
84
  threshold,
80
- }), [animation, baseDelay, duration, startDelay, threshold]);
85
+ });
81
86
  }
82
87
  //# sourceMappingURL=useScrollAnimation.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useScrollAnimation.js","sourceRoot":"","sources":["../../../src/client/animation/useScrollAnimation.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"useScrollAnimation.js","sourceRoot":"","sources":["../../../src/client/animation/useScrollAnimation.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"ScrollAnimatedView.d.ts","sourceRoot":"","sources":["../../../src/client/components/ScrollAnimatedView.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EACL,qBAAqB,EAEtB,MAAM,oCAAoC,CAAC;AAG5C,MAAM,WAAW,uBAAwB,SAAQ,qBAAqB;IACpE,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;CAC7B;AAED,wBAAgB,kBAAkB,CAAC,EACjC,QAAQ,EACR,KAAK,EACL,SAAoB,EACpB,KAAS,EACT,QAAQ,EACR,SAAe,EACf,IAAW,GACZ,EAAE,uBAAuB,qBA4BzB;AAED,wBAAgB,2BAA2B,CAAC,EAC1C,QAAQ,EACR,SAAqB,EACrB,SAAe,EACf,UAAc,EACd,QAAQ,EACR,SAAe,EACf,KAAK,GACN,EAAE;IACD,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,SAAS,CAAC,EAAE,qBAAqB,CAAC,WAAW,CAAC,CAAC;IAC/C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;CAC7B,qBAkBA"}
1
+ {"version":3,"file":"ScrollAnimatedView.d.ts","sourceRoot":"","sources":["../../../src/client/components/ScrollAnimatedView.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EACL,qBAAqB,EAEtB,MAAM,oCAAoC,CAAC;AAG5C,MAAM,WAAW,uBAAwB,SAAQ,qBAAqB;IACpE,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;CAC7B;AAED,wBAAgB,kBAAkB,CAAC,EACjC,QAAQ,EACR,KAAK,EACL,SAAoB,EACpB,KAAS,EACT,QAAQ,EACR,SAAe,EACf,IAAW,GACZ,EAAE,uBAAuB,qBAyBzB;AAED,wBAAgB,2BAA2B,CAAC,EAC1C,QAAQ,EACR,SAAqB,EACrB,SAAe,EACf,UAAc,EACd,QAAQ,EACR,SAAe,EACf,KAAK,GACN,EAAE;IACD,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,SAAS,CAAC,EAAE,qBAAqB,CAAC,WAAW,CAAC,CAAC;IAC/C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;CAC7B,qBAkBA"}
@@ -3,7 +3,7 @@ import React from 'react';
3
3
  import { useScrollAnimation, } from '../animation/useScrollAnimation.js';
4
4
  import { View } from './View.js';
5
5
  export function ScrollAnimatedView({ children, style, animation = 'fadeIn', delay = 0, duration, threshold = 0.2, once = true, }) {
6
- const { ref, style: animationStyle, isVisible, } = useScrollAnimation({
6
+ const { ref, style: animationStyle } = useScrollAnimation({
7
7
  animation,
8
8
  delay,
9
9
  duration,
@@ -14,7 +14,8 @@ export function ScrollAnimatedView({ children, style, animation = 'fadeIn', dela
14
14
  ...Object(style),
15
15
  opacity: animationStyle.opacity,
16
16
  transform: animationStyle.transform,
17
- willChange: isVisible ? 'auto' : 'opacity, transform',
17
+ transition: animationStyle.transition,
18
+ willChange: animationStyle.willChange,
18
19
  width: '100%',
19
20
  alignItems: 'center',
20
21
  }, children: children }));
@@ -1 +1 @@
1
- {"version":3,"file":"ScrollAnimatedView.js","sourceRoot":"","sources":["../../../src/client/components/ScrollAnimatedView.tsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAEL,kBAAkB,GACnB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAOjC,MAAM,UAAU,kBAAkB,CAAC,EACjC,QAAQ,EACR,KAAK,EACL,SAAS,GAAG,QAAQ,EACpB,KAAK,GAAG,CAAC,EACT,QAAQ,EACR,SAAS,GAAG,GAAG,EACf,IAAI,GAAG,IAAI,GACa;IACxB,MAAM,EACJ,GAAG,EACH,KAAK,EAAE,cAAc,EACrB,SAAS,GACV,GAAG,kBAAkB,CAAC;QACrB,SAAS;QACT,KAAK;QACL,QAAQ;QACR,SAAS;QACT,IAAI;KACL,CAAC,CAAC;IAEH,OAAO,CACL,KAAC,IAAI,IACH,OAAO,EAAE,GAAG,EACZ,KAAK,EAAE;YACL,GAAG,MAAM,CAAC,KAAK,CAAC;YAChB,OAAO,EAAE,cAAc,CAAC,OAAO;YAC/B,SAAS,EAAE,cAAc,CAAC,SAAS;YACnC,UAAU,EAAE,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,oBAAoB;YACrD,KAAK,EAAE,MAAM;YACb,UAAU,EAAE,QAAQ;SACrB,YAEA,QAAQ,GACJ,CACR,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,2BAA2B,CAAC,EAC1C,QAAQ,EACR,SAAS,GAAG,SAAS,EACrB,SAAS,GAAG,GAAG,EACf,UAAU,GAAG,CAAC,EACd,QAAQ,EACR,SAAS,GAAG,GAAG,EACf,KAAK,GASN;IACC,MAAM,UAAU,GAAG,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAEpD,OAAO,CACL,KAAC,IAAI,IAAC,KAAK,EAAE,KAAK,YACf,UAAU,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,CAChC,KAAC,kBAAkB,IAEjB,SAAS,EAAE,SAAS,EACpB,KAAK,EAAE,UAAU,GAAG,KAAK,GAAG,SAAS,EACrC,QAAQ,EAAE,QAAQ,EAClB,SAAS,EAAE,SAAS,YAEnB,KAAK,IAND,KAAK,CAOS,CACtB,CAAC,GACG,CACR,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"ScrollAnimatedView.js","sourceRoot":"","sources":["../../../src/client/components/ScrollAnimatedView.tsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAEL,kBAAkB,GACnB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAOjC,MAAM,UAAU,kBAAkB,CAAC,EACjC,QAAQ,EACR,KAAK,EACL,SAAS,GAAG,QAAQ,EACpB,KAAK,GAAG,CAAC,EACT,QAAQ,EACR,SAAS,GAAG,GAAG,EACf,IAAI,GAAG,IAAI,GACa;IACxB,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,cAAc,EAAE,GAAG,kBAAkB,CAAC;QACxD,SAAS;QACT,KAAK;QACL,QAAQ;QACR,SAAS;QACT,IAAI;KACL,CAAC,CAAC;IAEH,OAAO,CACL,KAAC,IAAI,IACH,OAAO,EAAE,GAAG,EACZ,KAAK,EAAE;YACL,GAAG,MAAM,CAAC,KAAK,CAAC;YAChB,OAAO,EAAE,cAAc,CAAC,OAAO;YAC/B,SAAS,EAAE,cAAc,CAAC,SAAS;YACnC,UAAU,EAAE,cAAc,CAAC,UAAU;YACrC,UAAU,EAAE,cAAc,CAAC,UAAU;YACrC,KAAK,EAAE,MAAM;YACb,UAAU,EAAE,QAAQ;SACrB,YAEA,QAAQ,GACJ,CACR,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,2BAA2B,CAAC,EAC1C,QAAQ,EACR,SAAS,GAAG,SAAS,EACrB,SAAS,GAAG,GAAG,EACf,UAAU,GAAG,CAAC,EACd,QAAQ,EACR,SAAS,GAAG,GAAG,EACf,KAAK,GASN;IACC,MAAM,UAAU,GAAG,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAEpD,OAAO,CACL,KAAC,IAAI,IAAC,KAAK,EAAE,KAAK,YACf,UAAU,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,CAChC,KAAC,kBAAkB,IAEjB,SAAS,EAAE,SAAS,EACpB,KAAK,EAAE,UAAU,GAAG,KAAK,GAAG,SAAS,EACrC,QAAQ,EAAE,QAAQ,EAClB,SAAS,EAAE,SAAS,YAEnB,KAAK,IAND,KAAK,CAOS,CACtB,CAAC,GACG,CACR,CAAC;AACJ,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"AnswerEngine.d.ts","sourceRoot":"","sources":["../../../src/search/server/AnswerEngine.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iDAAiD,CAAC;AACpF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iDAAiD,CAAC;AAClF,OAAO,KAAK,EACV,SAAS,EAET,UAAU,EACX,MAAM,wBAAwB,CAAC;AAEhC,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,WAAW,CAAC;IACtC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,gEAAgE;IAChE,QAAQ,CAAC,GAAG,EAAE;QACZ,KAAK,EAAE,MAAM,CAAC;QACd,QAAQ,EAAE,YAAY,EAAE,CAAC;QACzB,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,GAAG,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,YAAY,CAAA;KAAE,CAAC,CAAC;IACxD,wEAAwE;IACxE,MAAM,CAAC,CACL,GAAG,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,YAAY,EAAE,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,EACpE,OAAO,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,GAC3B,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,YAAY,CAAA;KAAE,CAAC,CAAC;CACxD;AAED,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,WAAW,CAAC;IACnB,UAAU,EAAE,SAAS,EAAE,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,qEAAqE;IACrE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,8CAA8C;IAC9C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,2DAA2D;IAC3D,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,0CAA0C;IAC1C,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;;OAGG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,YAAY,EAAE,CAAC;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,qEAAqE;IACrE,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;CAClB;AAOD,qBAAa,YAAY;IACX,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,EAAE,kBAAkB;IAEjD,GAAG,CACP,IAAI,EAAE,UAAU,EAChB,GAAG,EAAE,aAAa,GACjB,OAAO,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,YAAY,CAAA;KAAE,CAAC;YA8C7C,MAAM;IA+BpB,OAAO,CAAC,gBAAgB;YAKV,WAAW;YA2BX,WAAW;IAqBzB,OAAO,CAAC,sBAAsB;YAqBhB,UAAU;CAoBzB"}
1
+ {"version":3,"file":"AnswerEngine.d.ts","sourceRoot":"","sources":["../../../src/search/server/AnswerEngine.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iDAAiD,CAAC;AACpF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iDAAiD,CAAC;AAClF,OAAO,KAAK,EACV,SAAS,EAET,UAAU,EACX,MAAM,wBAAwB,CAAC;AAEhC,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,WAAW,CAAC;IACtC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,gEAAgE;IAChE,QAAQ,CAAC,GAAG,EAAE;QACZ,KAAK,EAAE,MAAM,CAAC;QACd,QAAQ,EAAE,YAAY,EAAE,CAAC;QACzB,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,GAAG,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,YAAY,CAAA;KAAE,CAAC,CAAC;IACxD,wEAAwE;IACxE,MAAM,CAAC,CACL,GAAG,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,YAAY,EAAE,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,EACpE,OAAO,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,GAC3B,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,YAAY,CAAA;KAAE,CAAC,CAAC;CACxD;AAED,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,WAAW,CAAC;IACnB,UAAU,EAAE,SAAS,EAAE,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,qEAAqE;IACrE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,8CAA8C;IAC9C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,2DAA2D;IAC3D,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,0CAA0C;IAC1C,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;;OAGG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,YAAY,EAAE,CAAC;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,qEAAqE;IACrE,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;CAClB;AAwBD,qBAAa,YAAY;IACX,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,EAAE,kBAAkB;IAEjD,GAAG,CACP,IAAI,EAAE,UAAU,EAChB,GAAG,EAAE,aAAa,GACjB,OAAO,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,YAAY,CAAA;KAAE,CAAC;YAmD7C,MAAM;IA+BpB,OAAO,CAAC,gBAAgB;YAKV,WAAW;YA2BX,WAAW;IAqBzB,OAAO,CAAC,sBAAsB;YAqBhB,UAAU;CAoBzB"}
@@ -8,19 +8,38 @@
8
8
  // It's transport-agnostic: it pushes output through a StreamEmit (delta/sources)
9
9
  // so it composes with runStreamedMessage. The model is injected (ModelCaller) so
10
10
  // it's provider-neutral and unit-testable with stubs — no real AI in tests.
11
+ /**
12
+ * Heuristic: is this a multi-part question worth decomposing into sub-queries?
13
+ * Cheap (no model call) so the merged single pipeline can adapt its depth
14
+ * without a user-facing quick/deep toggle. Matches comparisons, conjunctions,
15
+ * multi-clause questions, and long queries.
16
+ */
17
+ function isComplexQuery(query) {
18
+ const q = query.trim();
19
+ const words = q.split(/\s+/).length;
20
+ const questionMarks = (q.match(/\?/g) ?? []).length;
21
+ return (words > 14 ||
22
+ questionMarks > 1 ||
23
+ /\b(compare|comparison|versus|vs\.?|difference|differences|differ|relationship|both|as well as|pros and cons|trade-?offs?|influence[ds]?|how (?:did|do|does).+(?:and|vs))\b/i.test(q));
24
+ }
11
25
  export class AnswerEngine {
12
26
  config;
13
27
  constructor(config) {
14
28
  this.config = config;
15
29
  }
16
30
  async run(emit, req) {
17
- const mode = req.mode ?? 'quick';
31
+ // No mode the merged adaptive pipeline (depth chosen per query). An
32
+ // explicit 'quick'/'deep' overrides (back-compat for callers that still set it).
33
+ const mode = req.mode;
18
34
  const model = req.model ?? this.config.defaultModel;
19
35
  const retrievers = this.activeRetrievers(req.focus);
20
- // 1. Plan
21
- const subQueries = mode === 'deep' && retrievers.length > 0
22
- ? await this.planQueries(req.query)
23
- : [req.query];
36
+ // 1. Plan (adaptive) — decompose when the question is multi-part. With no
37
+ // explicit mode this is automatic (the merged "single system"); `deep`
38
+ // forces it and `quick` suppresses it (back-compat for callers that still
39
+ // pass a mode).
40
+ const wantDecompose = retrievers.length > 0 &&
41
+ (mode === 'deep' || (mode !== 'quick' && isComplexQuery(req.query)));
42
+ const subQueries = wantDecompose ? await this.planQueries(req.query) : [req.query];
24
43
  // 2. Retrieve + merge
25
44
  const merged = await this.retrieveAll(subQueries, retrievers);
26
45
  const top = merged.slice(0, this.config.maxResults ?? 8);
@@ -1 +1 @@
1
- {"version":3,"file":"AnswerEngine.js","sourceRoot":"","sources":["../../../src/search/server/AnswerEngine.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,EAAE;AACF,2DAA2D;AAC3D,kFAAkF;AAClF,2EAA2E;AAC3E,0EAA0E;AAC1E,EAAE;AACF,iFAAiF;AACjF,iFAAiF;AACjF,4EAA4E;AA8D5E,MAAM,OAAO,YAAY;IACM;IAA7B,YAA6B,MAA0B;QAA1B,WAAM,GAAN,MAAM,CAAoB;IAAG,CAAC;IAE3D,KAAK,CAAC,GAAG,CACP,IAAgB,EAChB,GAAkB;QAElB,MAAM,IAAI,GAAe,GAAG,CAAC,IAAI,IAAI,OAAO,CAAC;QAC7C,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC;QACpD,MAAM,UAAU,GAAG,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAEpD,UAAU;QACV,MAAM,UAAU,GACd,IAAI,KAAK,MAAM,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC;YACtC,CAAC,CAAC,MAAM,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC;YACnC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAElB,sBAAsB;QACtB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;QAC9D,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,UAAU,IAAI,CAAC,CAAC,CAAC;QACzD,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC;YAAE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;QAElE,sBAAsB;QACtB,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,IAAI,CAAC,CAAC;QACxC,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,GAAG,CAChC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE;YACrC,MAAM,IAAI,GAAG,CAAC,CAAC,SAAS,CAAC,IAAI;gBAC3B,CAAC,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC;gBAC7D,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC;YAClB,OAAO,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,KAAK,IAAI,EAAE,CAAC;QACxD,CAAC,CAAC,CACH,CAAC;QAEF,qCAAqC;QACrC,MAAM,QAAQ,GAAG,IAAI,CAAC,sBAAsB,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QAC5D,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;QAE3D,sEAAsE;QACtE,IACE,IAAI,KAAK,MAAM;YACf,IAAI,CAAC,MAAM,CAAC,YAAY,KAAK,KAAK;YAClC,QAAQ,CAAC,MAAM,GAAG,CAAC;YACnB,KAAK,CAAC,SAAS,CAAC,IAAI,EAAE,EACtB,CAAC;YACD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;YACrE,IAAI,QAAQ,IAAI,QAAQ,KAAK,KAAK,CAAC,SAAS,EAAE,CAAC;gBAC7C,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;YAC7F,CAAC;QACH,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAEO,KAAK,CAAC,MAAM,CAClB,KAAa,EACb,QAAkB,EAClB,KAAa;QAEb,IAAI,CAAC;YACH,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC;gBAChD,KAAK;gBACL,QAAQ,EAAE;oBACR;wBACE,IAAI,EAAE,QAAQ;wBACd,OAAO,EACL,kEAAkE;4BAClE,iEAAiE;4BACjE,oEAAoE;4BACpE,mEAAmE;4BACnE,sDAAsD;qBACzD;oBACD;wBACE,IAAI,EAAE,MAAM;wBACZ,OAAO,EAAE,aAAa,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,eAAe,KAAK,EAAE;qBAClE;iBACF;gBACD,SAAS,EAAE,IAAI;aAChB,CAAC,CAAC;YACH,OAAO,IAAI,CAAC,IAAI,EAAE,IAAI,KAAK,CAAC;QAC9B,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAEO,gBAAgB,CAAC,KAAgB;QACvC,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC;QAChE,OAAO,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IACtE,CAAC;IAEO,KAAK,CAAC,WAAW,CAAC,KAAa;QACrC,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,aAAa,IAAI,CAAC,CAAC;QAC3C,IAAI,CAAC;YACH,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC;gBAChD,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS,IAAI,IAAI,CAAC,MAAM,CAAC,YAAY;gBACxD,QAAQ,EAAE;oBACR;wBACE,IAAI,EAAE,QAAQ;wBACd,OAAO,EACL,mEAAmE;4BACnE,yCAAyC,GAAG,iBAAiB;qBAChE;oBACD,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE;iBACjC;gBACD,SAAS,EAAE,GAAG;aACf,CAAC,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAY,CAAC;YAC3C,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC1B,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;gBAClF,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC;oBAAE,OAAO,EAAE,CAAC;YAC/B,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,kBAAkB;QACpB,CAAC;QACD,OAAO,CAAC,KAAK,CAAC,CAAC;IACjB,CAAC;IAEO,KAAK,CAAC,WAAW,CACvB,UAAoB,EACpB,UAAuB;QAEvB,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAC/B,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CACvB,UAAU,CAAC,GAAG,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE;YACjC,MAAM,OAAO,GAAG,MAAM,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;YAC5D,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC;QAC1D,CAAC,CAAC,CACH,CACF,CAAC;QACF,kEAAkE;QAClE,MAAM,IAAI,GAAG,IAAI,GAAG,EAAkB,CAAC;QACvC,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;YAC/B,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACnC,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK;gBAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;QAC5E,CAAC;QACD,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC5E,CAAC;IAEO,sBAAsB,CAC5B,GAAkB,EAClB,QAAkB;QAElB,MAAM,OAAO,GACX,QAAQ,CAAC,MAAM,GAAG,CAAC;YACjB,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC;YACvB,CAAC,CAAC,oBAAoB,CAAC;QAC3B,MAAM,MAAM,GACV,uEAAuE;YACvE,0EAA0E;YAC1E,4EAA4E;YAC5E,0CAA0C;YAC1C,OAAO,CAAC;QACV,OAAO;YACL,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE;YACnC,GAAG,CAAC,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC;YACtB,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,CAAC,KAAK,EAAE;SACrC,CAAC;IACJ,CAAC;IAEO,KAAK,CAAC,UAAU,CACtB,KAAa,EACb,QAAwB,EACxB,IAAgB;QAEhB,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;YAC7B,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CACxD,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,EAAE,EACpC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAC7B,CAAC;YACF,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;QAClE,CAAC;QACD,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC;YAC3D,KAAK;YACL,QAAQ;YACR,SAAS,EAAE,IAAI;SAChB,CAAC,CAAC;QACH,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACjB,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;IAClE,CAAC;CACF"}
1
+ {"version":3,"file":"AnswerEngine.js","sourceRoot":"","sources":["../../../src/search/server/AnswerEngine.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ugly-app",
3
- "version": "0.1.621",
3
+ "version": "0.1.623",
4
4
  "type": "module",
5
5
  "comment:files": "Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.",
6
6
  "files": [
@@ -1,2 +1,2 @@
1
1
  // Auto-generated by prebuild — do not edit manually
2
- export const CLI_VERSION = "0.1.621";
2
+ export const CLI_VERSION = "0.1.623";
@@ -1,15 +1,4 @@
1
- import {
2
- useCallback,
3
- useEffect,
4
- useLayoutEffect,
5
- useRef,
6
- useState,
7
- } from 'react';
8
- import {
9
- easingFunctions,
10
- useAnimatedValue,
11
- useAnimatedValueTracker,
12
- } from './animatedValue.js';
1
+ import { useEffect, useRef, useState } from 'react';
13
2
 
14
3
  export type ScrollAnimationType =
15
4
  | 'fadeIn'
@@ -37,90 +26,102 @@ export interface ScrollAnimationStyle {
37
26
  opacity: number;
38
27
  transform: string;
39
28
  transition?: string;
29
+ willChange?: string;
40
30
  }
41
31
 
32
+ // Smooth ease-out (no overshoot/bounce — the old springBouncy easing read as
33
+ // "jerky" once many items animated at once). Compositor-friendly.
34
+ const EASE = 'cubic-bezier(0.16, 1, 0.3, 1)';
35
+
36
+ function hiddenTransform(animation: ScrollAnimationType): string {
37
+ switch (animation) {
38
+ case 'slideUp':
39
+ return 'translateY(40px)';
40
+ case 'slideDown':
41
+ return 'translateY(-40px)';
42
+ case 'slideLeft':
43
+ return 'translateX(40px)';
44
+ case 'slideRight':
45
+ return 'translateX(-40px)';
46
+ case 'scale':
47
+ return 'scale(0.92)';
48
+ case 'fadeIn':
49
+ case 'none':
50
+ default:
51
+ return 'none';
52
+ }
53
+ }
54
+
55
+ function prefersReducedMotion(): boolean {
56
+ return (
57
+ typeof window !== 'undefined' &&
58
+ typeof window.matchMedia === 'function' &&
59
+ window.matchMedia('(prefers-reduced-motion: reduce)').matches
60
+ );
61
+ }
62
+
63
+ /**
64
+ * Reveal-on-scroll hook driven entirely by CSS transitions.
65
+ *
66
+ * The element renders ONCE in its hidden state and ONCE in its visible state;
67
+ * the GPU interpolates opacity/transform between them. There is no per-frame
68
+ * React re-render (the previous implementation ran a requestAnimationFrame loop
69
+ * that called forceUpdate() every frame, per instance — with several staggered
70
+ * items on screen that re-render storm caused the visible jank).
71
+ */
42
72
  export function useScrollAnimation<T extends HTMLElement = HTMLDivElement>(
43
73
  config: ScrollAnimationConfig = {},
44
74
  ) {
45
75
  const {
46
76
  animation = 'fadeIn',
47
77
  delay = 0,
48
- duration,
78
+ duration = 600,
49
79
  threshold = 0.2,
50
80
  once = true,
51
81
  } = config;
52
82
 
53
83
  const ref = useRef<T>(null);
54
- const [isVisible, setIsVisible] = useState(true);
55
- const hasAnimated = useRef(false);
56
- const animatedValue = useAnimatedValue(1);
57
- const progress = useAnimatedValueTracker(animatedValue);
58
-
59
- useLayoutEffect(() => {
60
- const element = ref.current;
61
- if (!element) return;
62
- const rect = element.getBoundingClientRect();
63
- if (rect.top >= window.innerHeight) {
64
- animatedValue.set(0);
65
- setIsVisible(false);
66
- hasAnimated.current = false;
67
- } else {
68
- hasAnimated.current = true;
69
- }
70
- }, [animatedValue]);
84
+ const reduce = animation === 'none' || prefersReducedMotion();
85
+ // Hidden until revealed (unless there's nothing to animate).
86
+ const [visible, setVisible] = useState(reduce);
87
+ const hasAnimated = useRef(reduce);
71
88
 
72
89
  useEffect(() => {
90
+ if (reduce) return;
73
91
  const element = ref.current;
74
92
  if (!element) return;
75
93
 
76
94
  const observer = new IntersectionObserver(
77
95
  (entries) => {
78
- entries.forEach((entry) => {
96
+ for (const entry of entries) {
79
97
  if (entry.isIntersecting) {
80
- if (once && hasAnimated.current) return;
81
98
  hasAnimated.current = true;
82
- setIsVisible(true);
83
- setTimeout(() => {
84
- void animatedValue.start(1, {
85
- duration,
86
- easing: easingFunctions.springBouncy,
87
- });
88
- }, delay);
89
- } else if (!once) {
90
- setIsVisible(false);
91
- animatedValue.set(0);
99
+ setVisible(true);
100
+ if (once) observer.disconnect();
101
+ } else if (!once && !hasAnimated.current) {
102
+ setVisible(false);
92
103
  }
93
- });
104
+ }
94
105
  },
95
106
  { threshold },
96
107
  );
97
108
 
98
109
  observer.observe(element);
99
110
  return () => observer.disconnect();
100
- }, [animatedValue, delay, duration, once, threshold]);
111
+ }, [reduce, once, threshold]);
101
112
 
102
- const getStyle = useCallback((): ScrollAnimationStyle => {
103
- const p = progress;
104
- switch (animation) {
105
- case 'fadeIn':
106
- return { opacity: p, transform: 'none' };
107
- case 'slideUp':
108
- return { opacity: p, transform: `translateY(${40 * (1 - p)}px)` };
109
- case 'slideDown':
110
- return { opacity: p, transform: `translateY(${-40 * (1 - p)}px)` };
111
- case 'slideLeft':
112
- return { opacity: p, transform: `translateX(${40 * (1 - p)}px)` };
113
- case 'slideRight':
114
- return { opacity: p, transform: `translateX(${-40 * (1 - p)}px)` };
115
- case 'scale':
116
- return { opacity: p, transform: `scale(${0.9 + 0.1 * p})` };
117
- case 'none':
118
- default:
119
- return { opacity: 1, transform: 'none' };
120
- }
121
- }, [animation, progress]);
113
+ const transitionDelay = delay > 0 ? ` ${delay}ms` : '';
114
+ const style: ScrollAnimationStyle = {
115
+ opacity: visible ? 1 : 0,
116
+ transform: visible ? 'none' : hiddenTransform(animation),
117
+ transition: reduce
118
+ ? undefined
119
+ : `opacity ${duration}ms ${EASE}${transitionDelay}, transform ${duration}ms ${EASE}${transitionDelay}`,
120
+ // GPU-hint only while waiting to animate in; drop it once shown.
121
+ willChange: visible ? undefined : 'opacity, transform',
122
+ };
122
123
 
123
- return { ref, style: getStyle(), isVisible, progress };
124
+ return { ref, style, isVisible: visible, progress: visible ? 1 : 0 };
124
125
  }
125
126
 
126
127
  export function useStaggerAnimation(config: {
@@ -138,13 +139,10 @@ export function useStaggerAnimation(config: {
138
139
  threshold = 0.2,
139
140
  } = config;
140
141
 
141
- return useCallback(
142
- (index: number): ScrollAnimationConfig => ({
143
- animation,
144
- delay: startDelay + index * baseDelay,
145
- duration,
146
- threshold,
147
- }),
148
- [animation, baseDelay, duration, startDelay, threshold],
149
- );
142
+ return (index: number): ScrollAnimationConfig => ({
143
+ animation,
144
+ delay: startDelay + index * baseDelay,
145
+ duration,
146
+ threshold,
147
+ });
150
148
  }
@@ -19,11 +19,7 @@ export function ScrollAnimatedView({
19
19
  threshold = 0.2,
20
20
  once = true,
21
21
  }: ScrollAnimatedViewProps) {
22
- const {
23
- ref,
24
- style: animationStyle,
25
- isVisible,
26
- } = useScrollAnimation({
22
+ const { ref, style: animationStyle } = useScrollAnimation({
27
23
  animation,
28
24
  delay,
29
25
  duration,
@@ -38,7 +34,8 @@ export function ScrollAnimatedView({
38
34
  ...Object(style),
39
35
  opacity: animationStyle.opacity,
40
36
  transform: animationStyle.transform,
41
- willChange: isVisible ? 'auto' : 'opacity, transform',
37
+ transition: animationStyle.transition,
38
+ willChange: animationStyle.willChange,
42
39
  width: '100%',
43
40
  alignItems: 'center',
44
41
  }}
@@ -69,6 +69,23 @@ interface Tagged {
69
69
  retriever: Retriever;
70
70
  }
71
71
 
72
+ /**
73
+ * Heuristic: is this a multi-part question worth decomposing into sub-queries?
74
+ * Cheap (no model call) so the merged single pipeline can adapt its depth
75
+ * without a user-facing quick/deep toggle. Matches comparisons, conjunctions,
76
+ * multi-clause questions, and long queries.
77
+ */
78
+ function isComplexQuery(query: string): boolean {
79
+ const q = query.trim();
80
+ const words = q.split(/\s+/).length;
81
+ const questionMarks = (q.match(/\?/g) ?? []).length;
82
+ return (
83
+ words > 14 ||
84
+ questionMarks > 1 ||
85
+ /\b(compare|comparison|versus|vs\.?|difference|differences|differ|relationship|both|as well as|pros and cons|trade-?offs?|influence[ds]?|how (?:did|do|does).+(?:and|vs))\b/i.test(q)
86
+ );
87
+ }
88
+
72
89
  export class AnswerEngine {
73
90
  constructor(private readonly config: AnswerEngineConfig) {}
74
91
 
@@ -76,15 +93,20 @@ export class AnswerEngine {
76
93
  emit: StreamEmit,
77
94
  req: AnswerRequest,
78
95
  ): Promise<{ finalText: string; telemetry?: MsgTelemetry }> {
79
- const mode: SearchMode = req.mode ?? 'quick';
96
+ // No mode the merged adaptive pipeline (depth chosen per query). An
97
+ // explicit 'quick'/'deep' overrides (back-compat for callers that still set it).
98
+ const mode: SearchMode | undefined = req.mode;
80
99
  const model = req.model ?? this.config.defaultModel;
81
100
  const retrievers = this.activeRetrievers(req.focus);
82
101
 
83
- // 1. Plan
84
- const subQueries =
85
- mode === 'deep' && retrievers.length > 0
86
- ? await this.planQueries(req.query)
87
- : [req.query];
102
+ // 1. Plan (adaptive) — decompose when the question is multi-part. With no
103
+ // explicit mode this is automatic (the merged "single system"); `deep`
104
+ // forces it and `quick` suppresses it (back-compat for callers that still
105
+ // pass a mode).
106
+ const wantDecompose =
107
+ retrievers.length > 0 &&
108
+ (mode === 'deep' || (mode !== 'quick' && isComplexQuery(req.query)));
109
+ const subQueries = wantDecompose ? await this.planQueries(req.query) : [req.query];
88
110
 
89
111
  // 2. Retrieve + merge
90
112
  const merged = await this.retrieveAll(subQueries, retrievers);