genaicode 2.13.4 → 2.14.0

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.
package/CHANGELOG.md CHANGED
@@ -2,6 +2,14 @@
2
2
 
3
3
  ## Unreleased
4
4
 
5
+ ### Added
6
+
7
+ - `genaicode/react` exports `useFollowScroll`, the hook that keeps a transcript at its newest
8
+ line until the user scrolls up (`<AgentChat>` now uses it, and also re-pins when its box is
9
+ resized), and `installResizeHandle` with `storedSize`: a framework-free panel-edge resize
10
+ handle with pointer drag, arrow keys, Home/End, Escape to undo a drag, Enter or double-click
11
+ to reset, and a kept ARIA range. The gamedev.pl Play workbench uses both.
12
+
5
13
  ### Fixed
6
14
 
7
15
  - Anthropic structured outputs: the converter drops the schema keywords the API rejects with a
@@ -9,6 +17,9 @@
9
17
  `uniqueItems`) and lowers `minItems` above 1 to 1, the largest value accepted. It walks only
10
18
  real subschemas, so a property that happens to be named `maximum` is kept. Callers still
11
19
  validate the answer against their own schema.
20
+ - `genaicode/vite` overlay: Escape closes the panel and hands the focus back to the wolf, from the
21
+ wolf or anything in the panel (inside the chat frame the key stays with the UI). The wolf names
22
+ the panel it toggles with `aria-controls`.
12
23
 
13
24
  ## 2.13.3 — 2026-10-17
14
25
 
package/README.md CHANGED
@@ -318,6 +318,44 @@ Theme it with CSS custom properties on the component or any ancestor: `--gc-bg`,
318
318
  the `genaicode ui` look, light or dark by `prefers-color-scheme`, or by `theme="light"` /
319
319
  `"dark"`. `genaicode ui` and the Vite panel draw this same component.
320
320
 
321
+ Two smaller pieces come along for hosts that build their own panels around a transcript:
322
+
323
+ ```ts
324
+ import { installResizeHandle, storedSize, useFollowScroll } from 'genaicode/react';
325
+
326
+ // A log that stays at its newest line until the user scrolls up (and again after follow()).
327
+ const { ref, onScroll, follow } = useFollowScroll(lines);
328
+
329
+ // A drag handle on a panel's left edge; the width survives reloads.
330
+ const stored = storedSize('panel-width', [300, 900]);
331
+ let width = stored.get();
332
+ const handle = installResizeHandle(edge, {
333
+ axis: 'x',
334
+ direction: () => -1, // dragging left makes the panel wider
335
+ bounds: () => [300, Math.min(900, innerWidth - 24)],
336
+ read: () => width ?? 390,
337
+ write: (next, commit) => {
338
+ width = next;
339
+ panel.style.setProperty('--width', `${width}px`);
340
+ if (commit) stored.set(width);
341
+ },
342
+ reset: () => {
343
+ width = undefined;
344
+ panel.style.removeProperty('--width');
345
+ stored.clear();
346
+ },
347
+ });
348
+ // The CSS caps the shown width, so the saved one comes back when the window grows again:
349
+ // .panel { width: min(var(--width, 390px), calc(100vw - 24px)); }
350
+ window.addEventListener('resize', handle.sync);
351
+ ```
352
+
353
+ The handle keeps its `aria-value*` range current and takes the arrow keys (Shift for bigger
354
+ steps), Home and End, Escape to undo a drag, and Enter or double-click to reset. While a drag
355
+ runs, `document.body` (or `root`) has `data-resizing="true"`, so the page can keep the cursor
356
+ and turn off pointer events on iframes. `read()` must return what `write` or `reset` just set,
357
+ so keep the size in a variable or a ref rather than only in React state.
358
+
321
359
  To show the whole `genaicode ui` page in a frame instead, `startEmbeddedWeb` from
322
360
  `genaicode/ui` serves it on 127.0.0.1 with your `task` (`mcpServers`, `timeoutMs`...), `env`
323
361
  and `transformPrompt`, and returns its tokenized `url` and a `controller` to send prompts.
@@ -1,5 +1,6 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { useEffect, useLayoutEffect, useRef, useState, } from 'react';
3
+ import { useFollowScroll } from './follow-scroll.js';
3
4
  import { formatDuration, formatUsage, relativePath, shortId, toolLabel, toolSummary, turnFooter } from './format.js';
4
5
  import { Markdown } from './markdown.js';
5
6
  /**
@@ -10,16 +11,9 @@ import { Markdown } from './markdown.js';
10
11
  export function AgentChat(props) {
11
12
  const state = props.state ?? NO_SESSION;
12
13
  const [draft, setDraft] = useState('');
13
- const scroller = useRef(null);
14
- const pinned = useRef(true);
15
14
  const input = useRef(null);
16
15
  const running = state?.status === 'running';
17
16
  const now = useNow(running);
18
- useLayoutEffect(() => {
19
- const el = scroller.current;
20
- if (el && pinned.current)
21
- el.scrollTop = el.scrollHeight;
22
- });
23
17
  useLayoutEffect(() => {
24
18
  const el = input.current;
25
19
  if (!el)
@@ -33,7 +27,7 @@ export function AgentChat(props) {
33
27
  const send = () => {
34
28
  if (!draft.trim() || props.disabled)
35
29
  return;
36
- pinned.current = true;
30
+ follow();
37
31
  props.onSend(draft);
38
32
  setDraft('');
39
33
  };
@@ -63,6 +57,8 @@ export function AgentChat(props) {
63
57
  }
64
58
  });
65
59
  flush(Number.MAX_SAFE_INTEGER);
60
+ // `items` is new on every render, so each render scrolls to the end while the user is there.
61
+ const { ref: scroller, onScroll, follow } = useFollowScroll(items, 80);
66
62
  const placeholder = props.placeholder ??
67
63
  (running
68
64
  ? state.canSteer
@@ -71,10 +67,7 @@ export function AgentChat(props) {
71
67
  : `Ask ${agentName} to change something…`);
72
68
  const usage = formatUsage(state.usage, state.costUsd);
73
69
  const footer = props.renderFooter?.();
74
- return (_jsxs("div", { className: rootClass, "data-theme": theme, "data-status": state.status, style: props.style, children: [props.header !== undefined ? (props.header) : (_jsxs("div", { className: "gc-header", children: [state.agent ? (_jsx("span", { className: "gc-avatar", "aria-hidden": "true", children: state.agent.slice(0, 2) })) : null, _jsx("b", { className: "gc-agent", children: state.agent || 'Agent' }), state.model ? _jsx("span", { className: "gc-model", children: state.model }) : null, running ? _jsx("span", { className: "gc-spin", role: "status", "aria-label": "Working" }) : null, _jsx("span", { className: "gc-spacer" }), state.sessionId ? _jsxs("span", { className: "gc-chip", children: ["session ", shortId(state.sessionId)] }) : null, usage ? _jsx("span", { className: "gc-chip", children: usage }) : null, props.headerExtras] })), _jsx("div", { className: "gc-scroll", ref: scroller, onScroll: (event) => {
75
- const el = event.currentTarget;
76
- pinned.current = el.scrollHeight - el.scrollTop - el.clientHeight < 80;
77
- }, children: _jsxs("div", { className: "gc-thread", role: "log", "aria-live": "polite", children: [state.turns.length === 0
70
+ return (_jsxs("div", { className: rootClass, "data-theme": theme, "data-status": state.status, style: props.style, children: [props.header !== undefined ? (props.header) : (_jsxs("div", { className: "gc-header", children: [state.agent ? (_jsx("span", { className: "gc-avatar", "aria-hidden": "true", children: state.agent.slice(0, 2) })) : null, _jsx("b", { className: "gc-agent", children: state.agent || 'Agent' }), state.model ? _jsx("span", { className: "gc-model", children: state.model }) : null, running ? _jsx("span", { className: "gc-spin", role: "status", "aria-label": "Working" }) : null, _jsx("span", { className: "gc-spacer" }), state.sessionId ? _jsxs("span", { className: "gc-chip", children: ["session ", shortId(state.sessionId)] }) : null, usage ? _jsx("span", { className: "gc-chip", children: usage }) : null, props.headerExtras] })), _jsx("div", { className: "gc-scroll", ref: scroller, onScroll: onScroll, children: _jsxs("div", { className: "gc-thread", role: "log", "aria-live": "polite", children: [state.turns.length === 0
78
71
  ? (props.emptyState ?? (_jsx("div", { className: "gc-empty", children: _jsxs("div", { className: "gc-empty-title", children: ["What should ", agentName, " work on?"] }) })))
79
72
  : null, items, footer !== undefined && footer !== null && footer !== false ? (_jsx("div", { className: "gc-footer-slot", children: footer })) : null] }) }), _jsxs("div", { className: "gc-composer", children: [state.queued.length ? (_jsx("div", { className: "gc-queued", children: state.queued.map((prompt, i) => {
80
73
  const shown = props.renderPrompt ? props.renderPrompt(prompt) : prompt;
@@ -1 +1 @@
1
- {"version":3,"file":"agent-chat.js","sourceRoot":"","sources":["../../src/react/agent-chat.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"agent-chat.js","sourceRoot":"","sources":["../../src/react/agent-chat.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import { type Ref, type UIEventHandler } from 'react';
2
+ /**
3
+ * Keep a scrolling log at its newest line: it follows while the user is at the bottom (within
4
+ * `slack` pixels) and stays put once they scroll up to read. It also re-pins when the box itself
5
+ * changes size, e.g. when a hidden panel is shown again or resized.
6
+ *
7
+ * ```tsx
8
+ * const { ref, onScroll } = useFollowScroll(lines);
9
+ * <div ref={ref} onScroll={onScroll} style={{ overflow: 'auto' }}>{...}</div>
10
+ * ```
11
+ *
12
+ * `content` is compared by identity: the log scrolls after a render where it changed.
13
+ */
14
+ export declare function useFollowScroll<T extends HTMLElement = HTMLDivElement>(content: unknown, slack?: number): {
15
+ ref: Ref<T>;
16
+ onScroll: UIEventHandler<T>;
17
+ follow: () => void;
18
+ };
@@ -0,0 +1,49 @@
1
+ import { useCallback, useEffect, useLayoutEffect, useRef } from 'react';
2
+ // No layout effects on the server (React 18 warns about them there).
3
+ const useIsomorphicLayoutEffect = typeof window === 'undefined' ? useEffect : useLayoutEffect;
4
+ /**
5
+ * Keep a scrolling log at its newest line: it follows while the user is at the bottom (within
6
+ * `slack` pixels) and stays put once they scroll up to read. It also re-pins when the box itself
7
+ * changes size, e.g. when a hidden panel is shown again or resized.
8
+ *
9
+ * ```tsx
10
+ * const { ref, onScroll } = useFollowScroll(lines);
11
+ * <div ref={ref} onScroll={onScroll} style={{ overflow: 'auto' }}>{...}</div>
12
+ * ```
13
+ *
14
+ * `content` is compared by identity: the log scrolls after a render where it changed.
15
+ */
16
+ export function useFollowScroll(content, slack = 30) {
17
+ const box = useRef(null);
18
+ const observer = useRef(undefined);
19
+ const following = useRef(true);
20
+ const pin = useCallback(() => {
21
+ const el = box.current;
22
+ if (el && following.current)
23
+ el.scrollTop = el.scrollHeight;
24
+ }, []);
25
+ useIsomorphicLayoutEffect(pin, [content, pin]);
26
+ // A callback ref, so a box that mounts later or is replaced gets observed too.
27
+ const ref = useCallback((el) => {
28
+ box.current = el;
29
+ observer.current?.disconnect();
30
+ observer.current = undefined;
31
+ if (!el || typeof ResizeObserver === 'undefined')
32
+ return;
33
+ observer.current = new ResizeObserver(pin);
34
+ observer.current.observe(el);
35
+ }, [pin]);
36
+ const onScroll = useCallback(() => {
37
+ const el = box.current;
38
+ // A hidden box (no height) says nothing about where the user is.
39
+ if (el && el.clientHeight)
40
+ following.current = el.scrollTop + el.clientHeight >= el.scrollHeight - slack;
41
+ }, [slack]);
42
+ /** Follow again from now on, e.g. after the user sent a message. */
43
+ const follow = useCallback(() => {
44
+ following.current = true;
45
+ pin();
46
+ }, [pin]);
47
+ return { ref, onScroll, follow };
48
+ }
49
+ //# sourceMappingURL=follow-scroll.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"follow-scroll.js","sourceRoot":"","sources":["../../src/react/follow-scroll.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,EAAiC,MAAM,OAAO,CAAC;AAEvG,qEAAqE;AACrE,MAAM,yBAAyB,GAAG,OAAO,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,eAAe,CAAC;AAE9F;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,eAAe,CAC7B,OAAgB,EAChB,KAAK,GAAG,EAAE;IAEV,MAAM,GAAG,GAAG,MAAM,CAAW,IAAI,CAAC,CAAC;IACnC,MAAM,QAAQ,GAAG,MAAM,CAA6B,SAAS,CAAC,CAAC;IAC/D,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;IAC/B,MAAM,GAAG,GAAG,WAAW,CAAC,GAAG,EAAE;QAC3B,MAAM,EAAE,GAAG,GAAG,CAAC,OAAO,CAAC;QACvB,IAAI,EAAE,IAAI,SAAS,CAAC,OAAO;YAAE,EAAE,CAAC,SAAS,GAAG,EAAE,CAAC,YAAY,CAAC;IAC9D,CAAC,EAAE,EAAE,CAAC,CAAC;IACP,yBAAyB,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;IAC/C,+EAA+E;IAC/E,MAAM,GAAG,GAAG,WAAW,CACrB,CAAC,EAAY,EAAE,EAAE;QACf,GAAG,CAAC,OAAO,GAAG,EAAE,CAAC;QACjB,QAAQ,CAAC,OAAO,EAAE,UAAU,EAAE,CAAC;QAC/B,QAAQ,CAAC,OAAO,GAAG,SAAS,CAAC;QAC7B,IAAI,CAAC,EAAE,IAAI,OAAO,cAAc,KAAK,WAAW;YAAE,OAAO;QACzD,QAAQ,CAAC,OAAO,GAAG,IAAI,cAAc,CAAC,GAAG,CAAC,CAAC;QAC3C,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC/B,CAAC,EACD,CAAC,GAAG,CAAC,CACN,CAAC;IACF,MAAM,QAAQ,GAAsB,WAAW,CAAC,GAAG,EAAE;QACnD,MAAM,EAAE,GAAG,GAAG,CAAC,OAAO,CAAC;QACvB,iEAAiE;QACjE,IAAI,EAAE,IAAI,EAAE,CAAC,YAAY;YAAE,SAAS,CAAC,OAAO,GAAG,EAAE,CAAC,SAAS,GAAG,EAAE,CAAC,YAAY,IAAI,EAAE,CAAC,YAAY,GAAG,KAAK,CAAC;IAC3G,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IACZ,oEAAoE;IACpE,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,EAAE;QAC9B,SAAS,CAAC,OAAO,GAAG,IAAI,CAAC;QACzB,GAAG,EAAE,CAAC;IACR,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACV,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;AACnC,CAAC"}
@@ -0,0 +1,65 @@
1
+ /**
2
+ * A resize handle for a panel edge: drag it, or focus it and use the keys. No React here, so a
3
+ * page that builds its own DOM can use it as well as a component (through a ref).
4
+ *
5
+ * The handle owns no size. It asks `read()` for the current one and hands every change to
6
+ * `write()`, which applies it (usually a CSS variable) and stores it when `commit` is true: at
7
+ * the end of a drag and on every key press.
8
+ */
9
+ export interface ResizeHandleOptions {
10
+ /** 'x' for a width (a vertical edge), 'y' for a height (a horizontal edge). */
11
+ axis: 'x' | 'y';
12
+ /**
13
+ * 1 when moving the pointer right (or down) makes the panel bigger, -1 when it makes it
14
+ * smaller: a panel docked on the right that grows to the left is -1. Read when a drag or key
15
+ * press starts, so it can follow the panel's current side. Default 1.
16
+ */
17
+ direction?: () => number;
18
+ /** Smallest and largest size right now, e.g. from the window size. */
19
+ bounds: () => readonly [min: number, max: number];
20
+ /**
21
+ * The size shown now. It must return what `write` or `reset` just set, synchronously: keep
22
+ * the size in a variable or a ref, not only in React state that updates on the next render.
23
+ */
24
+ read: () => number;
25
+ /** Apply `size` (already within bounds and rounded). `commit` is true when it should be kept. */
26
+ write: (size: number, commit: boolean) => void;
27
+ /** Back to the default size: double-click or Enter. Without it they do nothing. */
28
+ reset?: () => void;
29
+ /** Pixels per arrow key press; Shift doubles it. Default 24. */
30
+ step?: number;
31
+ /**
32
+ * Element that gets `data-resizing="true"` and `data-resize-axis` during a drag, so the page
33
+ * can set the cursor everywhere and turn off pointer events on iframes. Default: document.body.
34
+ */
35
+ root?: HTMLElement;
36
+ }
37
+ export interface ResizeHandle {
38
+ /**
39
+ * Update the ARIA range after the bounds or the size changed from outside (window resize,
40
+ * dock). It writes nothing: a saved size above a smaller window's maximum is kept, and shows
41
+ * clamped in `aria-valuenow`, so cap the shown size in CSS the same way (`min(...)`).
42
+ */
43
+ sync(): void;
44
+ /** Remove the listeners. */
45
+ dispose(): void;
46
+ }
47
+ /**
48
+ * Make `handle` resize a panel. Give it `role="separator"`, `tabindex="0"` and an
49
+ * `aria-label`; this sets `aria-orientation` and `touch-action: none`, and keeps
50
+ * `aria-valuemin`, `aria-valuemax` and `aria-valuenow` current.
51
+ *
52
+ * Pointer: drag (the pointer is captured, so it may leave the handle). Keys: arrows by `step`
53
+ * (Shift: twice that), Home and End to the bounds, Escape during a drag to undo it, Enter (and
54
+ * double-click) to reset.
55
+ */
56
+ export declare function installResizeHandle(handle: HTMLElement, options: ResizeHandleOptions): ResizeHandle;
57
+ /** A size kept in `localStorage`. Every method works, and does nothing, when storage is blocked. */
58
+ export interface StoredSize {
59
+ /** The saved size, clamped to the range given, or undefined when none (or nothing usable) is saved. */
60
+ get(): number | undefined;
61
+ set(size: number): void;
62
+ clear(): void;
63
+ }
64
+ /** `localStorage` under `key`, for `installResizeHandle`'s `write` and `reset`. */
65
+ export declare function storedSize(key: string, [min, max]: readonly [number, number]): StoredSize;
@@ -0,0 +1,158 @@
1
+ /**
2
+ * Make `handle` resize a panel. Give it `role="separator"`, `tabindex="0"` and an
3
+ * `aria-label`; this sets `aria-orientation` and `touch-action: none`, and keeps
4
+ * `aria-valuemin`, `aria-valuemax` and `aria-valuenow` current.
5
+ *
6
+ * Pointer: drag (the pointer is captured, so it may leave the handle). Keys: arrows by `step`
7
+ * (Shift: twice that), Home and End to the bounds, Escape during a drag to undo it, Enter (and
8
+ * double-click) to reset.
9
+ */
10
+ export function installResizeHandle(handle, options) {
11
+ const root = () => options.root ?? handle.ownerDocument.body;
12
+ const direction = () => options.direction?.() ?? 1;
13
+ const step = options.step ?? 24;
14
+ // A window smaller than the minimum wins: the size never exceeds what fits, nor goes below 0.
15
+ const range = () => {
16
+ const [min, max] = options.bounds();
17
+ const top = Math.max(0, max);
18
+ return [Math.max(0, Math.min(min, top)), top];
19
+ };
20
+ const clamp = (size) => {
21
+ const [min, max] = range();
22
+ return Math.round(Math.max(min, Math.min(max, size)));
23
+ };
24
+ const sync = (now = options.read()) => {
25
+ const [min, max] = range();
26
+ handle.setAttribute('aria-valuemin', String(Math.round(min)));
27
+ handle.setAttribute('aria-valuemax', String(Math.round(max)));
28
+ handle.setAttribute('aria-valuenow', String(clamp(now)));
29
+ };
30
+ const write = (size, commit) => {
31
+ const next = clamp(size);
32
+ options.write(next, commit);
33
+ sync(next);
34
+ return next;
35
+ };
36
+ const along = (event) => (options.axis === 'x' ? event.clientX : event.clientY);
37
+ let drag;
38
+ const end = (commit = true) => {
39
+ if (!drag)
40
+ return;
41
+ const { last } = drag;
42
+ drag = undefined;
43
+ delete root().dataset.resizing;
44
+ delete root().dataset.resizeAxis;
45
+ if (commit)
46
+ write(last, true);
47
+ };
48
+ const onPointerDown = (event) => {
49
+ if (event.button !== 0 || drag)
50
+ return;
51
+ event.preventDefault();
52
+ handle.focus({ preventScroll: true });
53
+ const size = clamp(options.read());
54
+ drag = { pointer: event.pointerId, start: along(event), size, direction: direction(), last: size };
55
+ handle.setPointerCapture?.(event.pointerId);
56
+ root().dataset.resizing = 'true';
57
+ root().dataset.resizeAxis = options.axis;
58
+ };
59
+ const onPointerMove = (event) => {
60
+ if (drag && event.pointerId === drag.pointer)
61
+ drag.last = write(drag.size + drag.direction * (along(event) - drag.start), false);
62
+ };
63
+ // Another finger lifting off the handle does not end this drag.
64
+ const onPointerEnd = (event) => {
65
+ if (drag && event.pointerId === drag.pointer)
66
+ end();
67
+ };
68
+ const onBlur = () => end();
69
+ const onDoubleClick = () => {
70
+ end(false);
71
+ options.reset?.();
72
+ sync();
73
+ };
74
+ const onKeyDown = (event) => {
75
+ const [min, max] = range();
76
+ const keys = options.axis === 'x' ? { less: 'ArrowLeft', more: 'ArrowRight' } : { less: 'ArrowUp', more: 'ArrowDown' };
77
+ if (event.key === 'Escape' && drag) {
78
+ const size = drag.size;
79
+ end(false);
80
+ write(size, true);
81
+ }
82
+ else if (event.key === 'Enter' && options.reset)
83
+ onDoubleClick();
84
+ else if (event.key === 'Home')
85
+ write(min, true);
86
+ else if (event.key === 'End')
87
+ write(max, true);
88
+ else if (event.key === keys.less || event.key === keys.more) {
89
+ const delta = (event.key === keys.more ? 1 : -1) * direction() * (event.shiftKey ? 2 * step : step);
90
+ write(clamp(options.read()) + delta, true);
91
+ }
92
+ else
93
+ return;
94
+ event.preventDefault();
95
+ event.stopPropagation();
96
+ };
97
+ const view = handle.ownerDocument.defaultView;
98
+ // A width handle is a vertical bar; separators are horizontal unless they say otherwise.
99
+ handle.setAttribute('aria-orientation', options.axis === 'x' ? 'vertical' : 'horizontal');
100
+ // Otherwise a touch drag can turn into a page pan, which cancels the pointer.
101
+ handle.style.touchAction = 'none';
102
+ handle.addEventListener('pointerdown', onPointerDown);
103
+ handle.addEventListener('pointermove', onPointerMove);
104
+ handle.addEventListener('pointerup', onPointerEnd);
105
+ handle.addEventListener('pointercancel', onPointerEnd);
106
+ handle.addEventListener('lostpointercapture', onPointerEnd);
107
+ handle.addEventListener('dblclick', onDoubleClick);
108
+ handle.addEventListener('keydown', onKeyDown);
109
+ // Switching windows mid-drag may never deliver the pointerup.
110
+ view?.addEventListener('blur', onBlur);
111
+ sync();
112
+ return {
113
+ sync: () => sync(),
114
+ dispose() {
115
+ end();
116
+ handle.removeEventListener('pointerdown', onPointerDown);
117
+ handle.removeEventListener('pointermove', onPointerMove);
118
+ handle.removeEventListener('pointerup', onPointerEnd);
119
+ handle.removeEventListener('pointercancel', onPointerEnd);
120
+ handle.removeEventListener('lostpointercapture', onPointerEnd);
121
+ handle.removeEventListener('dblclick', onDoubleClick);
122
+ handle.removeEventListener('keydown', onKeyDown);
123
+ view?.removeEventListener('blur', onBlur);
124
+ },
125
+ };
126
+ }
127
+ /** `localStorage` under `key`, for `installResizeHandle`'s `write` and `reset`. */
128
+ export function storedSize(key, [min, max]) {
129
+ return {
130
+ get() {
131
+ try {
132
+ const raw = localStorage.getItem(key);
133
+ const value = raw === null ? NaN : Number(raw);
134
+ return Number.isFinite(value) && value > 0 ? Math.min(max, Math.max(min, value)) : undefined;
135
+ }
136
+ catch {
137
+ return undefined;
138
+ }
139
+ },
140
+ set(size) {
141
+ try {
142
+ localStorage.setItem(key, String(size));
143
+ }
144
+ catch {
145
+ // The size just isn't remembered.
146
+ }
147
+ },
148
+ clear() {
149
+ try {
150
+ localStorage.removeItem(key);
151
+ }
152
+ catch {
153
+ // Nothing was remembered.
154
+ }
155
+ },
156
+ };
157
+ }
158
+ //# sourceMappingURL=resize-handle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resize-handle.js","sourceRoot":"","sources":["../../src/react/resize-handle.ts"],"names":[],"mappings":"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"}
package/dist/react.d.ts CHANGED
@@ -17,3 +17,6 @@ export { Markdown } from './react/markdown.js';
17
17
  export { formatDuration, formatUsage, relativePath, shortId, toolLabel, toolSummary, turnFooter, } from './react/format.js';
18
18
  export type { SessionEntry, SessionState, SessionTurn } from './agents/session.js';
19
19
  export type { ApprovalDecision, ApprovalRequest } from './agents/types.js';
20
+ export { useFollowScroll } from './react/follow-scroll.js';
21
+ export { installResizeHandle, storedSize } from './react/resize-handle.js';
22
+ export type { ResizeHandle, ResizeHandleOptions, StoredSize } from './react/resize-handle.js';
package/dist/react.js CHANGED
@@ -14,4 +14,6 @@
14
14
  export { AgentChat } from './react/agent-chat.js';
15
15
  export { Markdown } from './react/markdown.js';
16
16
  export { formatDuration, formatUsage, relativePath, shortId, toolLabel, toolSummary, turnFooter, } from './react/format.js';
17
+ export { useFollowScroll } from './react/follow-scroll.js';
18
+ export { installResizeHandle, storedSize } from './react/resize-handle.js';
17
19
  //# sourceMappingURL=react.js.map
package/dist/react.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"react.js","sourceRoot":"","sources":["../src/react.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAElD,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EACL,cAAc,EACd,WAAW,EACX,YAAY,EACZ,OAAO,EACP,SAAS,EACT,WAAW,EACX,UAAU,GACX,MAAM,mBAAmB,CAAC"}
1
+ {"version":3,"file":"react.js","sourceRoot":"","sources":["../src/react.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAElD,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EACL,cAAc,EACd,WAAW,EACX,YAAY,EACZ,OAAO,EACP,SAAS,EACT,WAAW,EACX,UAAU,GACX,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,EAAE,mBAAmB,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC"}