@cubos/agent-sdk-react-dom 0.0.1142812 → 0.0.1142903
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/README.md +4 -3
- package/dist/index.js +16 -3
- package/dist/index.js.map +3 -3
- package/dist/use-transcript-anchor.d.ts +2 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -260,6 +260,7 @@ request becomes a chat UI nobody can restyle:
|
|
|
260
260
|
4. It was already written twice.
|
|
261
261
|
|
|
262
262
|
Bubbles, composers and conversation lists fail (1): they are where products
|
|
263
|
-
differ most, and `packages/
|
|
264
|
-
instead. Recording a voice note is the
|
|
265
|
-
|
|
263
|
+
differ most, and the dashboard's `packages/web/components/chats/` in the
|
|
264
|
+
repository is the worked example to copy instead. Recording a voice note is the
|
|
265
|
+
next candidate — the dashboard has it, and the question is only whether a
|
|
266
|
+
recorder belongs next to a player.
|
package/dist/index.js
CHANGED
|
@@ -291,6 +291,7 @@ function useRecorder() {
|
|
|
291
291
|
}
|
|
292
292
|
// src/use-transcript-anchor.ts
|
|
293
293
|
import { useCallback as useCallback2, useEffect as useEffect2, useLayoutEffect, useRef as useRef2, useState as useState2 } from "react";
|
|
294
|
+
var MAX_EMPTY_PULLS = 3;
|
|
294
295
|
function useTranscriptAnchor(options) {
|
|
295
296
|
const { tailKey, hasOlder = false, loadOlder, atBottomPx = 24, loadOlderPx = 200 } = options;
|
|
296
297
|
const scrollRef = useRef2(null);
|
|
@@ -298,6 +299,7 @@ function useTranscriptAnchor(options) {
|
|
|
298
299
|
const [isAtBottom, setIsAtBottom] = useState2(true);
|
|
299
300
|
const heightBeforePrepend = useRef2(null);
|
|
300
301
|
const loadingOlder = useRef2(false);
|
|
302
|
+
const emptyPulls = useRef2(0);
|
|
301
303
|
const toEnd = useCallback2(() => {
|
|
302
304
|
const box = scrollRef.current;
|
|
303
305
|
if (box)
|
|
@@ -318,8 +320,18 @@ function useTranscriptAnchor(options) {
|
|
|
318
320
|
loadingOlder.current = true;
|
|
319
321
|
heightBeforePrepend.current = box.scrollHeight;
|
|
320
322
|
fetchOlder().then((added) => {
|
|
321
|
-
if (added
|
|
322
|
-
|
|
323
|
+
if (added > 0) {
|
|
324
|
+
emptyPulls.current = 0;
|
|
325
|
+
return;
|
|
326
|
+
}
|
|
327
|
+
heightBeforePrepend.current = null;
|
|
328
|
+
if (emptyPulls.current >= MAX_EMPTY_PULLS)
|
|
329
|
+
return;
|
|
330
|
+
emptyPulls.current += 1;
|
|
331
|
+
setTimeout(() => {
|
|
332
|
+
if (paging.current.hasOlder)
|
|
333
|
+
requestOlder();
|
|
334
|
+
}, 0);
|
|
323
335
|
}).catch(() => {
|
|
324
336
|
heightBeforePrepend.current = null;
|
|
325
337
|
}).finally(() => {
|
|
@@ -333,6 +345,7 @@ function useTranscriptAnchor(options) {
|
|
|
333
345
|
const atBottom = box.scrollHeight - box.scrollTop - box.clientHeight < atBottomPx;
|
|
334
346
|
following.current = atBottom;
|
|
335
347
|
setIsAtBottom((held) => held === atBottom ? held : atBottom);
|
|
348
|
+
emptyPulls.current = 0;
|
|
336
349
|
if (box.scrollTop < loadOlderPx)
|
|
337
350
|
requestOlder();
|
|
338
351
|
}, [atBottomPx, loadOlderPx, requestOlder]);
|
|
@@ -674,5 +687,5 @@ export {
|
|
|
674
687
|
AgentMarkdown
|
|
675
688
|
};
|
|
676
689
|
|
|
677
|
-
//# debugId=
|
|
690
|
+
//# debugId=C941772F1DC503DB64756E2164756E21
|
|
678
691
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -7,10 +7,10 @@
|
|
|
7
7
|
"// Keeping money out of the maths.\n//\n// `remark-math` treats `$…$` as inline TeX. That is fine in a paper and awful\n// in a product: \"de R$ 524 a R$ 632\" has two dollar signs, so everything\n// between them renders as one serif formula and the sentence falls apart. It is\n// not an edge case — any agent answering about prices hits it in the first\n// reply.\n//\n// Turning maths off is one fix and a bad one: the same agent may well answer a\n// question with a real formula. So instead, a `$` that is *clearly currency*\n// gets escaped before the parser sees it, and everything else is left for\n// `remark-math` to judge.\n//\n// Escaping rather than deleting matters: `\\$` is a literal dollar in markdown,\n// so the reader still sees \"R$ 524\".\n\n/**\n * Currency prefixes: the letters that turn a dollar sign into a symbol.\n * `R$` (BRL), `US$`, `HK$`, `NT$`, `Cz$`, plus the bare one-letter forms.\n * Matched case-sensitively — `r$` in prose is not a currency.\n */\nconst CURRENCY_PREFIX = /(?:R|US|CA|AU|NZ|HK|NT|SG|Cz|C|A|S|B|J|Z|Mex|Arg|CLP|COP)$/;\n\n/** A digit close enough after the sign to read as an amount: `$5`, `$ 1.234,56`,\n * `$ 99`. Two spaces is already prose, not a price tag. */\nconst AMOUNT_AFTER = /^[ ]{0,1}\\d/;\n\n/**\n * Escapes every `$` that is currency, leaving TeX delimiters alone.\n *\n * Walks the text rather than running a regex over it, because the decision\n * depends on context a regex cannot see: fenced blocks, inline code and `$$…$$`\n * display maths all have to pass through untouched, or this would corrupt a\n * code sample or break a formula the agent meant.\n */\nexport function escapeCurrency(markdown: string): string {\n let out = \"\";\n let i = 0;\n\n while (i < markdown.length) {\n const char = markdown[i] as string;\n\n // Fenced code: copy verbatim to the closing fence (or to the end, for a\n // block the agent left open mid-stream).\n if (char === \"`\" && markdown.startsWith(\"```\", i)) {\n const end = markdown.indexOf(\"```\", i + 3);\n const stop = end === -1 ? markdown.length : end + 3;\n out += markdown.slice(i, stop);\n i = stop;\n continue;\n }\n\n // Inline code, one or more backticks; the closer is the same run length.\n if (char === \"`\") {\n let ticks = 0;\n while (markdown[i + ticks] === \"`\") ticks += 1;\n const fence = \"`\".repeat(ticks);\n const end = markdown.indexOf(fence, i + ticks);\n const stop = end === -1 ? markdown.length : end + ticks;\n out += markdown.slice(i, stop);\n i = stop;\n continue;\n }\n\n // A backslash already escapes whatever follows — including a `$` someone\n // escaped by hand. Copy the pair so we never double-escape.\n if (char === \"\\\\\" && i + 1 < markdown.length) {\n out += markdown.slice(i, i + 2);\n i += 2;\n continue;\n }\n\n if (char === \"$\") {\n // Display maths is unambiguous: nobody writes `$$` for money.\n if (markdown.startsWith(\"$$\", i)) {\n const end = markdown.indexOf(\"$$\", i + 2);\n const stop = end === -1 ? markdown.length : end + 2;\n out += markdown.slice(i, stop);\n i = stop;\n continue;\n }\n\n if (isCurrency(markdown, i, out)) {\n out += \"\\\\$\";\n i += 1;\n continue;\n }\n }\n\n out += char;\n i += 1;\n }\n\n return out;\n}\n\n/**\n * Two independent tells, either one enough.\n *\n * A currency *prefix* immediately before (`R$`), or an *amount* immediately\n * after (`$5`). The second is what catches plain dollars, and it is also why\n * `$x$` survives: a letter after the sign is not an amount.\n */\nfunction isCurrency(text: string, index: number, emitted: string): boolean {\n // `emitted` rather than `text` for the lookbehind: what came before may have\n // been rewritten already, and a prefix must sit flush against the sign.\n if (CURRENCY_PREFIX.test(emitted)) return true;\n return AMOUNT_AFTER.test(text.slice(index + 1, index + 3));\n}\n",
|
|
8
8
|
"import { type AgentColors, colorStyle } from \"./colors.js\";\nimport \"./styles.css\";\n\nexport interface RecordingWaveProps {\n /** The window `useRecorder` keeps, oldest first, each value 0..1. */\n levels: number[];\n /** Draws the meter as a problem rather than as activity. Pass\n * `recorder.silent`; the words next to it are the app's. */\n silent?: boolean;\n /** Overrides the palette for this meter, as inline custom properties. */\n colors?: AgentColors;\n className?: string;\n}\n\n/**\n * What the microphone is hearing, right now.\n *\n * The counterpart to the waveform on a sent message, and it exists for one\n * failure: a muted device records a perfect clip of nothing. Everything else\n * about that path already works — the recorder runs, the timer counts, the clip\n * uploads, the transcription comes back empty — so the only affordance that\n * helps is the one that shows the level while there is still time to fix it.\n *\n * Deliberately not a canvas. Forty spans with a height are cheap at 20 fps, and\n * they inherit the colour, the theme and the reduced-motion preference of\n * whatever they are dropped into, which a canvas would each have to be told.\n */\nexport function RecordingWave({ levels, silent = false, colors, className }: RecordingWaveProps) {\n return (\n <div\n className={`cubos-agent-sdk-react-dom cubos-agent-sdk-react-dom__meter${\n silent ? \" cubos-agent-sdk-react-dom__meter--silent\" : \"\"\n }${className ? ` ${className}` : \"\"}`}\n style={colorStyle(colors)}\n data-silent={silent ? \"true\" : undefined}\n aria-hidden=\"true\"\n >\n {levels.map((level, index) => (\n <span\n // The array is a window that scrolls, so a bar's identity is its\n // position in the meter and never the reading that passed through it.\n // biome-ignore lint/suspicious/noArrayIndexKey: position is the identity here.\n key={index}\n className=\"cubos-agent-sdk-react-dom__meter-bar\"\n // A floor rather than zero: a meter that vanishes reads as broken,\n // and \"flat\" is itself the reading that matters here.\n style={{ height: `${Math.max(6, Math.round(level * 100))}%` }}\n />\n ))}\n </div>\n );\n}\n",
|
|
9
9
|
"import { useCallback, useEffect, useRef, useState } from \"react\";\n\n/**\n * `unsupported` is settled after mount, never during render: the check reads\n * `navigator`, and a server render has none.\n */\nexport type RecorderState = \"idle\" | \"requesting\" | \"recording\" | \"unsupported\";\n\nexport interface UseRecorderResult {\n state: RecorderState;\n /** Seconds elapsed in the current take, for a live timer. */\n seconds: number;\n /**\n * The microphone's signal over the last couple of seconds, oldest first and\n * already scaled 0..1 for drawing. Fixed length, so it is a window that\n * scrolls rather than a list that grows — pass it to `RecordingWave`.\n *\n * All zeros before anything is heard, which is the same thing a muted device\n * produces: `silent` is what tells those apart, because two seconds of flat\n * bars is ambiguous and a sentence is not.\n */\n levels: number[];\n /**\n * Nothing above the noise floor for long enough that it is worth saying so.\n *\n * A muted microphone records perfectly: the clip arrives, the transcription\n * comes back empty, and the agent answers a message nobody managed to send.\n * The only moment that is cheap to fix is while the person is still talking.\n */\n silent: boolean;\n /** Denied permission, no microphone, or a MediaRecorder failure. */\n error: Error | null;\n start: () => Promise<void>;\n /** Resolves with the clip, or null if nothing was captured. */\n stop: () => Promise<Blob | null>;\n /** Drops the take and releases the microphone. */\n cancel: () => void;\n}\n\n/**\n * Preference order for the recording container. Chrome and Firefox record WebM;\n * Safari only ever produces MP4/AAC, and asking it for WebM yields a silent\n * failure rather than an error — hence the capability probe instead of a\n * hardcoded mime type.\n */\nconst CANDIDATE_TYPES = [\n \"audio/webm;codecs=opus\",\n \"audio/webm\",\n \"audio/mp4\",\n \"audio/ogg;codecs=opus\",\n];\n\nfunction pickMimeType(): string | undefined {\n if (typeof MediaRecorder === \"undefined\") return undefined;\n return CANDIDATE_TYPES.find((type) => MediaRecorder.isTypeSupported(type));\n}\n\n/** Bars in the live meter. Matches the played waveform's count, so a recording\n * and its playback read as the same object. */\nconst LEVEL_BARS = 40;\n\n/** How often the meter samples the input. 20/s reads as continuous and costs\n * one array read per tick. */\nconst LEVEL_INTERVAL_MS = 50;\n\n/**\n * How much the raw RMS is amplified for drawing.\n *\n * Speech through a laptop microphone sits around 0.05–0.15 RMS, so the honest\n * number drawn honestly is a flat line — the meter would say \"muted\" about a\n * normal voice. Five puts conversation in the middle of the box and clips only\n * on a shout.\n */\nconst LEVEL_GAIN = 5;\n\n/** Below this the input is indistinguishable from a dead device: room tone\n * through a live microphone still lands above it. */\nconst SILENCE_FLOOR = 0.012;\n\n/** How long it has to stay there. Short enough to catch someone before they\n * record a minute into nothing, long enough to survive a breath between\n * sentences. */\nconst SILENCE_AFTER_MS = 1500;\n\n/**\n * One meter reading from a chunk of time-domain samples.\n *\n * RMS rather than peak: peak jumps on a single click and reads as speech, and\n * what the meter is for is telling \"someone is talking\" from \"nothing is\n * arriving\". Bytes are unsigned with silence at 128, which is the format\n * `getByteTimeDomainData` writes.\n */\nexport function levelOf(samples: Uint8Array): number {\n if (samples.length === 0) return 0;\n let sum = 0;\n for (const sample of samples) {\n const centred = (sample - 128) / 128;\n sum += centred * centred;\n }\n return Math.sqrt(sum / samples.length);\n}\n\nconst NO_LEVELS: number[] = Array.from({ length: LEVEL_BARS }, () => 0);\n\nfunction isSupported(): boolean {\n return (\n typeof MediaRecorder !== \"undefined\" &&\n typeof navigator !== \"undefined\" &&\n // Browsers expose getUserMedia only in a secure context, so an app served\n // over plain http on a non-localhost host has no `mediaDevices` at all.\n navigator.mediaDevices?.getUserMedia !== undefined\n );\n}\n\n/**\n * Microphone capture as a Blob, ready for `sendAudio`.\n *\n * The stream is released on every exit path — stop, cancel, unmount, a failure\n * — because a live `MediaStream` keeps the browser's recording indicator lit\n * long after the UI has moved on, and nothing on screen explains why.\n *\n * The container is probed rather than chosen: Chrome and Firefox record WebM,\n * Safari only ever produces MP4/AAC, and asking Safari for WebM fails silently\n * instead of raising — a clip that is simply never assembled.\n */\nexport function useRecorder(): UseRecorderResult {\n const [state, setState] = useState<RecorderState>(\"idle\");\n const [seconds, setSeconds] = useState(0);\n const [error, setError] = useState<Error | null>(null);\n const [levels, setLevels] = useState<number[]>(NO_LEVELS);\n const [silent, setSilent] = useState(false);\n\n const recorderRef = useRef<MediaRecorder | null>(null);\n const chunksRef = useRef<Blob[]>([]);\n const streamRef = useRef<MediaStream | null>(null);\n const analyserRef = useRef<AnalyserNode | null>(null);\n const audioRef = useRef<AudioContext | null>(null);\n\n useEffect(() => {\n setState(isSupported() ? \"idle\" : \"unsupported\");\n }, []);\n\n const release = useCallback(() => {\n for (const track of streamRef.current?.getTracks() ?? []) track.stop();\n // An AudioContext is a device handle too: left open, Chrome keeps the\n // audio hardware awake and eventually refuses to grant new ones.\n void audioRef.current?.close().catch(() => {});\n audioRef.current = null;\n analyserRef.current = null;\n streamRef.current = null;\n recorderRef.current = null;\n chunksRef.current = [];\n setLevels(NO_LEVELS);\n setSilent(false);\n }, []);\n\n useEffect(() => release, [release]);\n\n useEffect(() => {\n if (state !== \"recording\") return;\n const started = Date.now();\n setSeconds(0);\n const timer = setInterval(() => setSeconds(Math.floor((Date.now() - started) / 1000)), 500);\n return () => clearInterval(timer);\n }, [state]);\n\n // The meter, driven by the clock rather than by the recorder: `ondataavailable`\n // fires once per take unless a timeslice is set, and a timeslice changes how\n // the clip itself is assembled. Reading the analyser costs nothing and leaves\n // the recording untouched.\n useEffect(() => {\n const analyser = analyserRef.current;\n if (state !== \"recording\" || analyser === null) return;\n\n const samples = new Uint8Array(analyser.fftSize);\n let lastSound = Date.now();\n const timer = setInterval(() => {\n analyser.getByteTimeDomainData(samples);\n const level = levelOf(samples);\n if (level > SILENCE_FLOOR) lastSound = Date.now();\n setLevels((held) => [...held.slice(1), Math.min(1, level * LEVEL_GAIN)]);\n setSilent(Date.now() - lastSound > SILENCE_AFTER_MS);\n }, LEVEL_INTERVAL_MS);\n return () => clearInterval(timer);\n }, [state]);\n\n const start = useCallback(async () => {\n if (!isSupported()) {\n setState(\"unsupported\");\n return;\n }\n setError(null);\n setState(\"requesting\");\n try {\n const stream = await navigator.mediaDevices.getUserMedia({ audio: true });\n streamRef.current = stream;\n const mimeType = pickMimeType();\n const recorder = new MediaRecorder(stream, mimeType ? { mimeType } : undefined);\n chunksRef.current = [];\n recorder.ondataavailable = (event) => {\n if (event.data.size > 0) chunksRef.current.push(event.data);\n };\n recorderRef.current = recorder;\n // A failure to meter is not a failure to record: an app with no\n // AudioContext still gets its clip, with a meter that stays flat.\n try {\n const Ctx = window.AudioContext ?? window.webkitAudioContext;\n if (Ctx) {\n const audio = new Ctx();\n const analyser = audio.createAnalyser();\n analyser.fftSize = 1024;\n // The meter should twitch with the voice, so the analyser must not\n // average the twitch away.\n analyser.smoothingTimeConstant = 0;\n audio.createMediaStreamSource(stream).connect(analyser);\n audioRef.current = audio;\n analyserRef.current = analyser;\n }\n } catch {\n analyserRef.current = null;\n }\n setLevels(NO_LEVELS);\n setSilent(false);\n recorder.start();\n setState(\"recording\");\n } catch (err) {\n release();\n setState(\"idle\");\n setError(err instanceof Error ? err : new Error(String(err)));\n }\n }, [release]);\n\n const stop = useCallback(async () => {\n const recorder = recorderRef.current;\n if (!recorder || recorder.state === \"inactive\") {\n release();\n setState(\"idle\");\n return null;\n }\n\n // The last chunk only lands on the `stop` event, so the Blob cannot be\n // assembled synchronously.\n const clip = await new Promise<Blob | null>((resolve) => {\n recorder.onstop = () => {\n const chunks = chunksRef.current;\n resolve(chunks.length ? new Blob(chunks, { type: recorder.mimeType }) : null);\n };\n recorder.stop();\n });\n\n release();\n setState(\"idle\");\n setSeconds(0);\n return clip;\n }, [release]);\n\n const cancel = useCallback(() => {\n const recorder = recorderRef.current;\n if (recorder && recorder.state !== \"inactive\") {\n // Drop the take before `onstop` can assemble it.\n recorder.onstop = null;\n recorder.stop();\n }\n release();\n setState(\"idle\");\n setSeconds(0);\n }, [release]);\n\n return { state, seconds, levels, silent, error, start, stop, cancel };\n}\n",
|
|
10
|
-
"import { type RefObject, useCallback, useEffect, useLayoutEffect, useRef, useState } from \"react\";\n\nexport interface UseTranscriptAnchorOptions {\n /**\n * Anything that changes when the tail grows — the last event's `seq`, the\n * message count, whether the typing indicator is up. Only a trigger; the\n * value is never read.\n */\n tailKey: unknown;\n /** There is older history to page in when the reader scrolls up. */\n hasOlder?: boolean;\n /**\n * Fetches the previous page; resolves with how many items were prepended.\n * Zero releases the anchor, so a page that came back empty does not freeze\n * the viewport.\n */\n loadOlder?: () => Promise<number>;\n /**\n * How close to the end still counts as being at it, in pixels. Small on\n * purpose: this reads as intent, not as a zone in which scrolling up is\n * ignored.\n */\n atBottomPx?: number;\n /** How close to the top counts as asking for more. */\n loadOlderPx?: number;\n}\n\nexport interface UseTranscriptAnchorResult {\n /**\n * The scrolling box. Yours to style — this attaches no class and renders no\n * element.\n */\n scrollRef: RefObject<HTMLDivElement | null>;\n /**\n * Hang it on whatever wraps the items. A callback ref, so it holds however\n * the caller mounts and unmounts that wrapper.\n */\n contentRef: (node: HTMLElement | null) => void;\n onScroll: () => void;\n /** Whether the viewport is at the end — for a \"jump to latest\" affordance. */\n isAtBottom: boolean;\n scrollToEnd: () => void;\n}\n\n/**\n * The scroll behaviour of a bottom-anchored transcript, without any of its\n * looks: it owns no element, adds no class, and renders nothing. You write the\n * markup and hang two refs off it.\n *\n * Four behaviours, each of which was a bug before it was a rule:\n *\n * 1. **Follow only if already following.** The intent is recorded when the\n * reader scrolls, never measured after an update — by then the content has\n * grown, so someone sitting exactly at the end is suddenly \"far\" from it by\n * the height of whatever just arrived.\n * 2. **Follow when the content grows, not when React re-renders.** A transcript\n * grows for reasons no state changed: an image decodes, a font swaps, a\n * disclosure opens, cards lay out a frame late. Keyed on props alone, the\n * scroll runs against the height at commit time and leaves the last few\n * hundred pixels — the ones the answer is written in — below the fold.\n * 3. **Hold the reader's place when paging backwards.** Prepending grows the\n * content upward while `scrollTop` stays put, which reads as the viewport\n * jumping. The correction runs before paint, against a height measured\n * *before* the commit — and on every commit, because prepending is the one\n * change that leaves the tail, and so `tailKey`, untouched.\n * 4. **Keep pulling while the content is shorter than the viewport.** A short\n * first page can leave the box unscrollable, and then no scroll event ever\n * fires to ask for the rest.\n */\nexport function useTranscriptAnchor(\n options: UseTranscriptAnchorOptions,\n): UseTranscriptAnchorResult {\n const { tailKey, hasOlder = false, loadOlder, atBottomPx = 24, loadOlderPx = 200 } = options;\n\n const scrollRef = useRef<HTMLDivElement | null>(null);\n\n // A ref, not state: this is the reader's recorded intent, and re-rendering on\n // it would be a render per scroll event. `isAtBottom` is the copy for anyone\n // who wants to draw something from it.\n const following = useRef(true);\n const [isAtBottom, setIsAtBottom] = useState(true);\n const heightBeforePrepend = useRef<number | null>(null);\n const loadingOlder = useRef(false);\n\n // `scrollTop = scrollHeight` rather than scrolling a trailing node into view:\n // a marker node would be a child of the caller's list, and in a `flex` column\n // with a `gap` an empty child is not free — it adds one gap of blank space to\n // the end of every transcript that adopts this.\n const toEnd = useCallback(() => {\n const box = scrollRef.current;\n if (box) box.scrollTop = box.scrollHeight;\n }, []);\n\n const scrollToEnd = useCallback(() => {\n following.current = true;\n setIsAtBottom(true);\n toEnd();\n }, [toEnd]);\n\n // Read through refs so the identity never changes: it is a dependency of the\n // callback ref below, which would otherwise re-observe on every render.\n const paging = useRef({ hasOlder, loadOlder });\n paging.current = { hasOlder, loadOlder };\n\n const requestOlder = useCallback(() => {\n const box = scrollRef.current;\n const { hasOlder: more, loadOlder: fetchOlder } = paging.current;\n if (!box || !more || !fetchOlder || loadingOlder.current) return;\n loadingOlder.current = true;\n // Recorded here rather than in an effect: by the time React commits the\n // prepended page, the height it grew from is gone.\n heightBeforePrepend.current = box.scrollHeight;\n void fetchOlder()\n .then((added) => {\n if (added
|
|
10
|
+
"import { type RefObject, useCallback, useEffect, useLayoutEffect, useRef, useState } from \"react\";\n\nexport interface UseTranscriptAnchorOptions {\n /**\n * Anything that changes when the tail grows — the last event's `seq`, the\n * message count, whether the typing indicator is up. Only a trigger; the\n * value is never read.\n */\n tailKey: unknown;\n /** There is older history to page in when the reader scrolls up. */\n hasOlder?: boolean;\n /**\n * Fetches the previous page; resolves with how many items were prepended.\n * Zero releases the anchor, so a page that came back empty does not freeze\n * the viewport — and, while `hasOlder` holds, asks again: nothing was drawn,\n * so no scroll event is coming to ask for it.\n */\n loadOlder?: () => Promise<number>;\n /**\n * How close to the end still counts as being at it, in pixels. Small on\n * purpose: this reads as intent, not as a zone in which scrolling up is\n * ignored.\n */\n atBottomPx?: number;\n /** How close to the top counts as asking for more. */\n loadOlderPx?: number;\n}\n\nexport interface UseTranscriptAnchorResult {\n /**\n * The scrolling box. Yours to style — this attaches no class and renders no\n * element.\n */\n scrollRef: RefObject<HTMLDivElement | null>;\n /**\n * Hang it on whatever wraps the items. A callback ref, so it holds however\n * the caller mounts and unmounts that wrapper.\n */\n contentRef: (node: HTMLElement | null) => void;\n onScroll: () => void;\n /** Whether the viewport is at the end — for a \"jump to latest\" affordance. */\n isAtBottom: boolean;\n scrollToEnd: () => void;\n}\n\n/** Empty pages `requestOlder` asks for on its own before waiting for the\n * reader to scroll again. The SDK's `loadOlder` already scans up to ten pages\n * per call, so this is a second line, sized for a caller's own pager. */\nconst MAX_EMPTY_PULLS = 3;\n\n/**\n * The scroll behaviour of a bottom-anchored transcript, without any of its\n * looks: it owns no element, adds no class, and renders nothing. You write the\n * markup and hang two refs off it.\n *\n * Four behaviours, each of which was a bug before it was a rule:\n *\n * 1. **Follow only if already following.** The intent is recorded when the\n * reader scrolls, never measured after an update — by then the content has\n * grown, so someone sitting exactly at the end is suddenly \"far\" from it by\n * the height of whatever just arrived.\n * 2. **Follow when the content grows, not when React re-renders.** A transcript\n * grows for reasons no state changed: an image decodes, a font swaps, a\n * disclosure opens, cards lay out a frame late. Keyed on props alone, the\n * scroll runs against the height at commit time and leaves the last few\n * hundred pixels — the ones the answer is written in — below the fold.\n * 3. **Hold the reader's place when paging backwards.** Prepending grows the\n * content upward while `scrollTop` stays put, which reads as the viewport\n * jumping. The correction runs before paint, against a height measured\n * *before* the commit — and on every commit, because prepending is the one\n * change that leaves the tail, and so `tailKey`, untouched.\n * 4. **Keep pulling while the content is shorter than the viewport.** A short\n * first page can leave the box unscrollable, and then no scroll event ever\n * fires to ask for the rest.\n */\nexport function useTranscriptAnchor(\n options: UseTranscriptAnchorOptions,\n): UseTranscriptAnchorResult {\n const { tailKey, hasOlder = false, loadOlder, atBottomPx = 24, loadOlderPx = 200 } = options;\n\n const scrollRef = useRef<HTMLDivElement | null>(null);\n\n // A ref, not state: this is the reader's recorded intent, and re-rendering on\n // it would be a render per scroll event. `isAtBottom` is the copy for anyone\n // who wants to draw something from it.\n const following = useRef(true);\n const [isAtBottom, setIsAtBottom] = useState(true);\n const heightBeforePrepend = useRef<number | null>(null);\n const loadingOlder = useRef(false);\n // Consecutive pages that prepended nothing. Bounds the re-ask below, so a\n // `loadOlder` that keeps answering zero with `hasOlder` still true (its\n // own page cap, a stale flag) costs a few requests and not a loop.\n const emptyPulls = useRef(0);\n\n // `scrollTop = scrollHeight` rather than scrolling a trailing node into view:\n // a marker node would be a child of the caller's list, and in a `flex` column\n // with a `gap` an empty child is not free — it adds one gap of blank space to\n // the end of every transcript that adopts this.\n const toEnd = useCallback(() => {\n const box = scrollRef.current;\n if (box) box.scrollTop = box.scrollHeight;\n }, []);\n\n const scrollToEnd = useCallback(() => {\n following.current = true;\n setIsAtBottom(true);\n toEnd();\n }, [toEnd]);\n\n // Read through refs so the identity never changes: it is a dependency of the\n // callback ref below, which would otherwise re-observe on every render.\n const paging = useRef({ hasOlder, loadOlder });\n paging.current = { hasOlder, loadOlder };\n\n const requestOlder = useCallback(() => {\n const box = scrollRef.current;\n const { hasOlder: more, loadOlder: fetchOlder } = paging.current;\n if (!box || !more || !fetchOlder || loadingOlder.current) return;\n loadingOlder.current = true;\n // Recorded here rather than in an effect: by the time React commits the\n // prepended page, the height it grew from is gone.\n heightBeforePrepend.current = box.scrollHeight;\n void fetchOlder()\n .then((added) => {\n if (added > 0) {\n emptyPulls.current = 0;\n return;\n }\n heightBeforePrepend.current = null;\n // History is paged by event, and a page can be nothing but the tool\n // calls behind one reply: nothing to draw, so the content did not\n // grow, so the reader is still at the top and no scroll event will\n // ask for the next page. Asked here instead — on a later tick, so the\n // hook's own `hasOlder` has rendered into `paging` first. Stopping\n // here was what read as \"scrolling up loads nothing\".\n if (emptyPulls.current >= MAX_EMPTY_PULLS) return;\n emptyPulls.current += 1;\n setTimeout(() => {\n if (paging.current.hasOlder) requestOlder();\n }, 0);\n })\n .catch(() => {\n heightBeforePrepend.current = null;\n })\n .finally(() => {\n loadingOlder.current = false;\n });\n }, []);\n\n const onScroll = useCallback(() => {\n const box = scrollRef.current;\n if (!box) return;\n const atBottom = box.scrollHeight - box.scrollTop - box.clientHeight < atBottomPx;\n following.current = atBottom;\n setIsAtBottom((held) => (held === atBottom ? held : atBottom));\n // A gesture is fresh intent: the empty-page budget starts over.\n emptyPulls.current = 0;\n if (box.scrollTop < loadOlderPx) requestOlder();\n }, [atBottomPx, loadOlderPx, requestOlder]);\n\n // No dependency array on purpose — see behaviour 3. It costs a ref read per\n // commit and does nothing unless a page is in flight.\n useLayoutEffect(() => {\n const box = scrollRef.current;\n const before = heightBeforePrepend.current;\n if (!box || before === null) return;\n const added = box.scrollHeight - before;\n // Nothing has grown yet, so this is one of the commits that happen *while*\n // the page is in flight — a spinner going up, the caller's own state. The\n // anchor has to survive them: consuming it here is what leaves the reader\n // looking at the top of a page they never asked to jump to. A page that\n // comes back empty releases it from `requestOlder` instead.\n if (added <= 0) return;\n heightBeforePrepend.current = null;\n box.scrollTop += added;\n });\n\n // Before paint, so nobody sees the jump.\n // biome-ignore lint/correctness/useExhaustiveDependencies: tail trigger, not a read.\n useLayoutEffect(() => {\n // Never while a page is landing: the reader is up in the history, and the\n // effect above is already holding their place.\n if (heightBeforePrepend.current !== null) return;\n if (following.current) toEnd();\n }, [tailKey, toEnd]);\n\n const pullWhileShort = useCallback(() => {\n const box = scrollRef.current;\n if (!box || !paging.current.hasOlder) return;\n if (box.scrollHeight <= box.clientHeight) requestOlder();\n }, [requestOlder]);\n\n const observer = useRef<ResizeObserver | null>(null);\n\n const contentRef = useCallback(\n (node: HTMLElement | null) => {\n observer.current?.disconnect();\n observer.current = null;\n if (node === null) return;\n let previous = node.scrollHeight;\n const watch = new ResizeObserver(() => {\n const height = node.scrollHeight;\n if (height === previous) return;\n previous = height;\n if (heightBeforePrepend.current !== null) return;\n if (following.current) toEnd();\n pullWhileShort();\n });\n watch.observe(node);\n observer.current = watch;\n },\n [toEnd, pullWhileShort],\n );\n\n // `hasOlder` is read through the ref above, so it has to be named here or the\n // pull never restarts when history appears after the first page.\n // biome-ignore lint/correctness/useExhaustiveDependencies: re-run trigger, not a read.\n useEffect(() => {\n pullWhileShort();\n }, [pullWhileShort, hasOlder]);\n\n useEffect(() => () => observer.current?.disconnect(), []);\n\n return { scrollRef, contentRef, onScroll, isAtBottom, scrollToEnd };\n}\n",
|
|
11
11
|
"import { ChevronDown, ChevronRight, Pause, Play } from \"lucide-react\";\nimport { useEffect, useRef, useState } from \"react\";\nimport { type AgentColors, colorStyle } from \"./colors.js\";\nimport \"./styles.css\";\n\nexport interface VoiceMessageLabels {\n play: string;\n pause: string;\n /** The disclosure that opens the transcript. */\n transcript: string;\n /** Shown in place of the transcript while STT is still running. */\n transcribing: string;\n /** Shown when STT finished and heard nothing — a silent recording. */\n noSpeech: string;\n loadFailed: string;\n}\n\nconst DEFAULT_LABELS: VoiceMessageLabels = {\n play: \"Play voice message\",\n pause: \"Pause voice message\",\n transcript: \"Transcript\",\n transcribing: \"Transcribing…\",\n noSpeech: \"No speech in this recording.\",\n loadFailed: \"Could not load the recording.\",\n};\n\nexport interface VoiceMessageProps {\n /**\n * Fetches the clip, once, on first play. A `Blob` rather than a URL because\n * the bytes usually sit behind a bearer token, which an `<audio src>` cannot\n * carry.\n */\n loadBytes: (signal: AbortSignal) => Promise<Blob>;\n /**\n * The words, once the agent's STT model has produced them.\n *\n * The three states are distinct and a client has all three: absent while STT\n * is still running, the empty string once it finished and heard nothing, and\n * the text otherwise. Reading empty as \"not yet\" is what left a silent\n * recording saying \"Transcribing…\" for good — `Message.transcribed` in\n * `@cubos/agent-sdk` is the flag that tells them apart.\n */\n transcript?: string;\n /** Size of the clip, shown until it has been loaded and measured. */\n bytes?: number;\n /** Open the transcript from the start. Collapsed by default — the player is\n * the message; the words are there when you want them. */\n defaultTranscriptOpen?: boolean;\n labels?: Partial<VoiceMessageLabels>;\n /** Overrides the palette for this player, as inline custom properties — the\n * same tokens `styles.css` declares, without writing CSS. */\n colors?: AgentColors;\n className?: string;\n}\n\nconst ROOT_CLASS = \"cubos-agent-sdk-react-dom cubos-agent-sdk-react-dom--voice\";\n\n/** How many bars the waveform is drawn with. Enough to read as a shape, few\n * enough that each one stays wide enough to see. */\nconst PEAK_COUNT = 40;\n\n/** Above this, the clip is not decoded for its waveform: a long recording costs\n * its whole PCM in memory, and the bar it would draw is not worth that. */\nconst MAX_DECODE_BYTES = 8 * 1024 * 1024;\n\n/**\n * The clip's own shape: peak amplitude per bucket, normalised to the loudest.\n *\n * Decoded at 8 kHz mono — a waveform needs the envelope, not the highs, and\n * that is the difference between a couple of megabytes of PCM and forty.\n * Returns null when the browser can't decode the codec, which is a missing\n * decoration, never a broken player.\n */\nasync function extractPeaks(blob: Blob): Promise<number[] | null> {\n if (blob.size > MAX_DECODE_BYTES) return null;\n const Ctx = window.OfflineAudioContext ?? window.webkitOfflineAudioContext;\n if (!Ctx) return null;\n try {\n const bytes = await blob.arrayBuffer();\n const decoded = await new Ctx(1, 1, 8000).decodeAudioData(bytes);\n const samples = decoded.getChannelData(0);\n const bucket = Math.floor(samples.length / PEAK_COUNT) || 1;\n const peaks: number[] = [];\n let loudest = 0;\n for (let i = 0; i < PEAK_COUNT; i++) {\n let peak = 0;\n for (let j = i * bucket; j < (i + 1) * bucket && j < samples.length; j++) {\n const value = Math.abs(samples[j] as number);\n if (value > peak) peak = value;\n }\n peaks.push(peak);\n if (peak > loudest) loudest = peak;\n }\n if (loudest === 0) return null;\n // Normalised, with a floor: a silent stretch is still part of the message,\n // and a zero-height bar reads as a rendering bug.\n return peaks.map((peak) => Math.max(0.12, peak / loudest));\n } catch {\n return null;\n }\n}\n\n/**\n * A voice message: play control, waveform, elapsed time, and the transcription\n * folded away underneath — the shape Slack and WhatsApp made familiar.\n *\n * The clip is fetched when the player scrolls into view, and the waveform is\n * drawn from it before anyone presses anything. Not on mount: a long\n * conversation would pull down every recording in it, most of which nobody will\n * ever open. Not on first play either — that left the player showing a file\n * size where its shape should be, and the shape is most of what a voice message\n * says at a glance.\n */\nexport function VoiceMessage({\n loadBytes,\n transcript,\n bytes,\n defaultTranscriptOpen = false,\n labels,\n colors,\n className,\n}: VoiceMessageProps) {\n const text = { ...DEFAULT_LABELS, ...labels };\n const rootRef = useRef<HTMLDivElement | null>(null);\n const audioRef = useRef<HTMLAudioElement | null>(null);\n const objectUrlRef = useRef<string | null>(null);\n const abortRef = useRef<AbortController | null>(null);\n /** The fetch in flight, so becoming visible and pressing play cannot start\n * two of them. */\n const inflightRef = useRef<Promise<HTMLAudioElement | null> | null>(null);\n\n const [isPlaying, setIsPlaying] = useState(false);\n const [isLoading, setIsLoading] = useState(false);\n const [failed, setFailed] = useState(false);\n const [position, setPosition] = useState(0);\n const [duration, setDuration] = useState(0);\n const [peaks, setPeaks] = useState<number[] | null>(null);\n const [open, setOpen] = useState(defaultTranscriptOpen);\n\n useEffect(\n () => () => {\n abortRef.current?.abort();\n audioRef.current?.pause();\n if (objectUrlRef.current) URL.revokeObjectURL(objectUrlRef.current);\n },\n [],\n );\n\n // `ensureLoaded` closes over state setters and is redefined every render, so\n // the observer below reaches it through a ref rather than restarting itself\n // on each one.\n const ensureLoadedRef = useRef<() => void>(() => {});\n ensureLoadedRef.current = () => void ensureLoaded();\n\n /**\n * Pulls the clip down once the player is near the viewport.\n *\n * Visibility, not mount: a conversation of fifty voice notes would otherwise\n * fetch fifty files to draw what nobody has looked at. `rootMargin` starts it\n * a screenful early, so by the time the player is actually read the waveform\n * is already there rather than arriving under the reader's eyes.\n *\n * Falls back to loading on play where there is no `IntersectionObserver` —\n * older browsers, and any server render.\n */\n useEffect(() => {\n const node = rootRef.current;\n if (node === null || typeof IntersectionObserver === \"undefined\") return;\n\n const observer = new IntersectionObserver(\n (entries) => {\n if (!entries.some((entry) => entry.isIntersecting)) return;\n // One fetch is all there is to do, so it stops watching immediately —\n // scrolling past a message repeatedly must not re-enter this.\n observer.disconnect();\n ensureLoadedRef.current();\n },\n { rootMargin: \"600px\" },\n );\n observer.observe(node);\n return () => observer.disconnect();\n }, []);\n\n function ensureLoaded(): Promise<HTMLAudioElement | null> {\n if (audioRef.current) return Promise.resolve(audioRef.current);\n inflightRef.current ??= load();\n return inflightRef.current;\n }\n\n async function load(): Promise<HTMLAudioElement | null> {\n const controller = new AbortController();\n abortRef.current = controller;\n setFailed(false);\n try {\n const blob = await loadBytes(controller.signal);\n if (controller.signal.aborted) return null;\n const url = URL.createObjectURL(blob);\n objectUrlRef.current = url;\n const element = new Audio(url);\n element.preload = \"metadata\";\n element.onended = () => {\n setIsPlaying(false);\n setPosition(0);\n };\n element.ontimeupdate = () => setPosition(element.currentTime);\n element.ondurationchange = () => {\n if (Number.isFinite(element.duration)) setDuration(element.duration);\n };\n element.onloadedmetadata = () => {\n // A `MediaRecorder` clip carries no duration in its header, so browsers\n // report `Infinity` until the file has been seeked to its end. Asking\n // for an impossible position forces that measurement; `durationchange`\n // above then fires with the real value and this rewinds.\n if (Number.isFinite(element.duration)) {\n setDuration(element.duration);\n return;\n }\n element.currentTime = 1e101;\n element.addEventListener(\n \"durationchange\",\n () => {\n element.currentTime = 0;\n setPosition(0);\n },\n { once: true },\n );\n };\n audioRef.current = element;\n // Off the critical path: playback starts on the element above while the\n // shape is still being computed.\n void extractPeaks(blob).then((found) => {\n if (!controller.signal.aborted && found) setPeaks(found);\n });\n return element;\n } catch {\n if (!controller.signal.aborted) setFailed(true);\n return null;\n }\n }\n\n async function toggle() {\n // The spinner belongs to the press, not to the fetch: a clip already being\n // pulled down in the background must not make the button look busy.\n setIsLoading(audioRef.current === null);\n const element = await ensureLoaded().finally(() => setIsLoading(false));\n if (!element) return;\n if (element.paused) {\n try {\n await element.play();\n setIsPlaying(true);\n } catch {\n // Autoplay policy, mostly. Reading `element.paused` back right after a\n // rejection is unreliable, so the state is driven explicitly.\n setFailed(true);\n setIsPlaying(false);\n }\n } else {\n element.pause();\n setIsPlaying(false);\n }\n }\n\n function seek(to: number) {\n setPosition(to);\n if (audioRef.current) audioRef.current.currentTime = to;\n }\n\n const progress = duration > 0 ? Math.min(1, position / duration) : 0;\n const clock = duration > 0 ? formatClock(position > 0 ? position : duration) : formatSize(bytes);\n\n return (\n <div\n ref={rootRef}\n className={className ? `${ROOT_CLASS} ${className}` : ROOT_CLASS}\n style={colorStyle(colors)}\n >\n <div className=\"cubos-agent-sdk-react-dom__voice-row\">\n <button\n type=\"button\"\n className=\"cubos-agent-sdk-react-dom__voice-play\"\n onClick={() => void toggle()}\n disabled={isLoading}\n aria-label={isPlaying ? text.pause : text.play}\n >\n {/* The circle is drawn by the span, not the button: a reset owns\n `button` — Tailwind's preflight clears its background there — and\n no reset claims a `span`, so this survives an app that never\n ordered this package's layer. */}\n <span className=\"cubos-agent-sdk-react-dom__voice-face\">\n {isPlaying ? (\n <Pause size={13} fill=\"currentColor\" aria-hidden=\"true\" />\n ) : (\n // Nudged right: a triangle's optical centre sits left of its box.\n <Play size={13} fill=\"currentColor\" style={{ marginLeft: 1 }} aria-hidden=\"true\" />\n )}\n </span>\n </button>\n\n <div className=\"cubos-agent-sdk-react-dom__voice-track\">\n {/* Nothing is drawn from imagination: until the clip has been decoded\n there is no shape to show, so the track is a plain progress bar. */}\n {peaks ? (\n <div className=\"cubos-agent-sdk-react-dom__voice-wave\" aria-hidden=\"true\">\n {peaks.map((height, index) => (\n <span\n // The bars are one immutable snapshot of one clip: bar N *is*\n // the Nth bucket of the waveform, and the list never reorders.\n // biome-ignore lint/suspicious/noArrayIndexKey: see above\n key={index}\n className={\n index / peaks.length <= progress\n ? \"cubos-agent-sdk-react-dom__voice-bar cubos-agent-sdk-react-dom__voice-bar--played\"\n : \"cubos-agent-sdk-react-dom__voice-bar\"\n }\n style={{ height: `${Math.round(height * 100)}%` }}\n />\n ))}\n </div>\n ) : (\n <div className=\"cubos-agent-sdk-react-dom__voice-line\" aria-hidden=\"true\">\n <span\n className=\"cubos-agent-sdk-react-dom__voice-line-fill\"\n style={{ width: `${progress * 100}%` }}\n />\n </div>\n )}\n {duration > 0 && (\n <span\n className=\"cubos-agent-sdk-react-dom__voice-head\"\n style={{ left: `${progress * 100}%` }}\n aria-hidden=\"true\"\n />\n )}\n {/* A real range input rather than a div with a click handler: it comes\n with keyboard control and the right ARIA for free. */}\n <input\n type=\"range\"\n className=\"cubos-agent-sdk-react-dom__voice-seek\"\n min={0}\n max={duration || 0}\n step=\"any\"\n value={position}\n disabled={duration === 0}\n aria-label={text.play}\n aria-valuetext={formatClock(position)}\n onChange={(event) => seek(Number(event.target.value))}\n />\n </div>\n\n <span className=\"cubos-agent-sdk-react-dom__voice-time\">{clock}</span>\n </div>\n\n {failed && <p className=\"cubos-agent-sdk-react-dom__voice-error\">{text.loadFailed}</p>}\n\n {transcript !== undefined && transcript !== \"\" ? (\n <>\n <button\n type=\"button\"\n className=\"cubos-agent-sdk-react-dom__voice-disclosure\"\n onClick={() => setOpen((was) => !was)}\n aria-expanded={open}\n >\n {open ? (\n <ChevronDown size={12} aria-hidden=\"true\" />\n ) : (\n <ChevronRight size={12} aria-hidden=\"true\" />\n )}\n {text.transcript}\n </button>\n {open && <p className=\"cubos-agent-sdk-react-dom__voice-transcript\">{transcript}</p>}\n </>\n ) : (\n <p className=\"cubos-agent-sdk-react-dom__voice-pending\">\n {transcript === undefined ? text.transcribing : text.noSpeech}\n </p>\n )}\n </div>\n );\n}\n\nfunction formatClock(seconds: number): string {\n const total = Math.max(0, Math.round(seconds));\n return `${Math.floor(total / 60)}:${String(total % 60).padStart(2, \"0\")}`;\n}\n\n/** Stand-in for the duration until the clip has been loaded and measured. */\nfunction formatSize(bytes: number | undefined): string {\n if (bytes === undefined) return \"--:--\";\n return bytes >= 1024 * 1024\n ? `${(bytes / (1024 * 1024)).toFixed(1)} MB`\n : `${Math.max(1, Math.round(bytes / 1024))} KB`;\n}\n"
|
|
12
12
|
],
|
|
13
|
-
"mappings": "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",
|
|
14
|
-
"debugId": "
|
|
13
|
+
"mappings": "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",
|
|
14
|
+
"debugId": "C941772F1DC503DB64756E2164756E21",
|
|
15
15
|
"names": []
|
|
16
16
|
}
|
|
@@ -11,7 +11,8 @@ export interface UseTranscriptAnchorOptions {
|
|
|
11
11
|
/**
|
|
12
12
|
* Fetches the previous page; resolves with how many items were prepended.
|
|
13
13
|
* Zero releases the anchor, so a page that came back empty does not freeze
|
|
14
|
-
* the viewport
|
|
14
|
+
* the viewport — and, while `hasOlder` holds, asks again: nothing was drawn,
|
|
15
|
+
* so no scroll event is coming to ask for it.
|
|
15
16
|
*/
|
|
16
17
|
loadOlder?: () => Promise<number>;
|
|
17
18
|
/**
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cubos/agent-sdk-react-dom",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.1142903",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Ready-made React components for Cubos Agent chats: agent markdown with code, tables and TeX. Styled out of the box.",
|
|
6
6
|
"license": "SEE LICENSE IN LICENSE",
|