@adea-ai/ui 0.67.2 → 0.68.1
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 +58 -0
- package/dist/NOTICE +34 -0
- package/dist/components/conversation/index.d.ts +1 -0
- package/dist/components/conversation/index.d.ts.map +1 -1
- package/dist/components/conversation/index.js +2 -1
- package/dist/components/conversation/transcript-composition.d.ts +66 -0
- package/dist/components/conversation/transcript-composition.d.ts.map +1 -0
- package/dist/components/conversation/transcript-composition.js +395 -0
- package/dist/components/conversation/transcript-composition.js.map +1 -0
- package/dist/components/conversation/transcript-folding.d.ts +22 -0
- package/dist/components/conversation/transcript-folding.d.ts.map +1 -0
- package/dist/components/conversation/transcript-folding.js +43 -0
- package/dist/components/conversation/transcript-folding.js.map +1 -0
- package/dist/components/conversation/transcript-grouping.d.ts +54 -0
- package/dist/components/conversation/transcript-grouping.d.ts.map +1 -0
- package/dist/components/conversation/transcript-grouping.js +155 -0
- package/dist/components/conversation/transcript-grouping.js.map +1 -0
- package/dist/index.js +2 -1
- package/dist/r/conversation.json +15 -0
- package/dist/r/registry.json +15 -0
- package/dist/r/src/components/conversation/index.ts +17 -0
- package/dist/r/src/components/conversation/transcript-composition.tsx +555 -0
- package/dist/r/src/components/conversation/transcript-folding.ts +61 -0
- package/dist/r/src/components/conversation/transcript-grouping.ts +204 -0
- package/package.json +8 -1
- package/registry.json +15 -0
- package/src/components/conversation/index.ts +17 -0
- package/src/components/conversation/transcript-composition.tsx +555 -0
- package/src/components/conversation/transcript-folding.ts +61 -0
- package/src/components/conversation/transcript-grouping.ts +204 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transcript-composition.js","names":["Accessor","Component","ComponentProps","For","Show","createComponent","createMemo","createSignal","createUniqueId","splitProps","ChevronDown","cn","Button","applyTranscriptRunningState","createTranscriptGrouper","TranscriptDisplayItem","TranscriptRow","TranscriptTurnItem","planTranscriptFold","TranscriptFoldMode","TranscriptMounting","TranscriptFoldState","TranscriptDisplayKind","GroupedTranscript","TranscriptFoldPlan","TranscriptCompositionFold","Readonly","key","mode","mounting","callCount","TranscriptCompositionRowContext","index","displayKind","group","size","turn","id","complete","interim","fold","TranscriptCompositionRendererProps","row","T","context","TranscriptCompositionProps","Omit","rows","renderRow","running","resetKey","foldMode","foldState","onFoldStateChange","state","disclosure","ReadonlyMap","onDisclosureChange","expanded","TurnPresentation","NonNullable","GroupPresentation","FoldGroup","RowRecord","foldControl","TranscriptLayout","controls","RowHandle","get","set","next","last","DisclosureSignal","encodeId","value","encodeURIComponent","transcriptDisclosureKey","firstRowId","String","panelId","instanceId","rowId","buttonId","segmentKey","sameGroup","a","b","sameTurn","sameFold","sameFoldGroup","length","every","sameRecord","firstRow","item","kind","appendTurnItem","indices","into","push","forEach","startIndex","appendDisplayItem","undefined","turnId","items","map","find","child","buildDisclosures","records","defaultMode","scope","flushScope","record","hasInterimTurn","some","hasConclusion","conclusion","plan","settled","foldable","entries","flatMap","entry","anchorId","control","opensTurn","foldLabel","count","subject","TranscriptRowEntry","props","prefix","onToggle","current","disclosureKey","collapsed","disabled","groupIndex","groupSize","renderable","renderHostRow","controlLabel","controlRows","join","_el$","_tmpl$","_el$2","firstChild","_$insert","_$createComponent","when","children","type","variant","aria-label","aria-controls","aria-expanded","aria-disabled","onClick","_el$3","_tmpl$2","_$memo","_$effect","_p$","_v$","_v$2","_v$3","_v$4","_v$5","_v$6","e","_$setAttribute","t","o","i","hidden","n","TranscriptComposition","local","rest","grouper","internalFoldState","setInternalFoldState","rowHandles","Map","disclosureSignals","lastResetKey","localDisclosure","signal","disclosureExpanded","grouped","layout","identity","clear","indexByRow","display","handles","live","Set","result","add","handle","keys","has","delete","allControlIds","updateFoldState","updateDisclosure","_el$4","_tmpl$4","_el$6","_$spread","_$mergeProps","data-fold-state","class","_el$5","_tmpl$3","each","createComponent","_$createComponent","_$memo","_$setAttribute","_$mergeProps"],"sources":["../../../src/components/conversation/transcript-composition.tsx"],"sourcesContent":["import type { Accessor, Component, ComponentProps } from 'solid-js'\nimport {\n For,\n Show,\n createComponent,\n createMemo,\n createSignal,\n createUniqueId,\n splitProps,\n} from 'solid-js'\nimport { ChevronDown } from 'lucide-solid'\nimport { cn } from '#lib/utils'\nimport { Button } from '../ui/button/button'\nimport {\n applyTranscriptRunningState,\n createTranscriptGrouper,\n type TranscriptDisplayItem,\n type TranscriptRow,\n type TranscriptTurnItem,\n} from './transcript-grouping'\nimport {\n planTranscriptFold,\n type TranscriptFoldMode,\n type TranscriptMounting,\n} from './transcript-folding'\n\nexport type TranscriptFoldState = 'default' | 'collapsed' | 'expanded'\nexport type TranscriptDisplayKind = 'single' | 'group' | 'turn'\n\nexport type {\n GroupedTranscript,\n TranscriptDisplayItem,\n TranscriptRow,\n TranscriptTurnItem,\n} from './transcript-grouping'\nexport type {\n TranscriptFoldMode,\n TranscriptFoldPlan,\n TranscriptMounting,\n} from './transcript-folding'\n\nexport type TranscriptCompositionFold = Readonly<{\n /** Stable host persistence key. Use with `transcriptDisclosureKey` to seed a store. */\n key: string\n mode: TranscriptFoldMode\n mounting: TranscriptMounting\n /** Distinct host-classified request IDs in this contiguous fold segment. */\n callCount: number\n}>\n\nexport type TranscriptCompositionRowContext = Readonly<{\n /** Original index in the caller's row array, including rows hidden by the host. */\n index: number\n /** The row's current position in the generic display composition. */\n displayKind: TranscriptDisplayKind\n group?: Readonly<{ index: number; size: number }>\n turn?: Readonly<{\n /** Derived from the first stable row ID; presentation bookkeeping only. */\n id: string\n /** A presentation state, never proof of successful runtime completion. */\n complete: boolean\n interim: boolean\n }>\n fold?: TranscriptCompositionFold\n}>\n\nexport type TranscriptCompositionRendererProps<T> = Readonly<{\n /** Reactive Solid prop; a row component keeps its DOM owner stable as values update. */\n row: TranscriptRow<T>\n context: TranscriptCompositionRowContext\n}>\n\nexport type TranscriptCompositionProps<T> = Omit<ComponentProps<'div'>, 'children'> & {\n /** Ordered, already redacted rows with host-supplied semantic classifications. */\n rows: readonly TranscriptRow<T>[]\n /** Render one host row. Permission, session, event and protocol authority stay outside this component. */\n renderRow: Component<TranscriptCompositionRendererProps<T>>\n /** The host's current run state. Live rows stay mounted and expanded until settled. */\n running?: boolean\n /** Reset scope for row identity and disclosure. It is not inferred from display content. */\n resetKey?: string | number | null\n /** Default settled fold policy. `tools` keeps prose visible; `prose` retains a proven conclusion. */\n foldMode?: TranscriptFoldMode\n /** Global command state. `collapsed` keeps hidden content mounted; prose folds only before a host-marked conclusion. */\n foldState?: TranscriptFoldState\n onFoldStateChange?: (state: TranscriptFoldState) => void\n /** Optional controlled disclosure map keyed by `transcriptDisclosureKey`. */\n disclosure?: ReadonlyMap<string, boolean>\n onDisclosureChange?: (key: string, expanded: boolean) => void\n}\n\ntype TurnPresentation = NonNullable<TranscriptCompositionRowContext['turn']>\ntype GroupPresentation = NonNullable<TranscriptCompositionRowContext['group']>\n\ntype FoldGroup<T> = Readonly<{\n key: string\n mode: TranscriptFoldMode\n callCount: number\n rows: readonly TranscriptRow<T>[]\n}>\n\ntype RowRecord<T> = {\n row: TranscriptRow<T>\n index: number\n displayKind: TranscriptDisplayKind\n group?: GroupPresentation\n turn?: TurnPresentation\n fold?: TranscriptCompositionFold\n foldControl?: FoldGroup<T>\n}\n\ntype TranscriptLayout<T> = Readonly<{\n rows: readonly RowRecord<T>[]\n controls: readonly FoldGroup<T>[]\n}>\n\ntype RowHandle<T> = {\n key: string\n get: Accessor<RowRecord<T>>\n set: (next: RowRecord<T>) => void\n last: RowRecord<T>\n}\n\ntype DisclosureSignal = Readonly<{\n get: Accessor<boolean | undefined>\n set: (next: boolean | undefined) => void\n}>\n\nconst encodeId = (value: string): string => encodeURIComponent(value)\n\n/** Stable, transcript-scoped key for host-owned disclosure restoration. */\nexport function transcriptDisclosureKey(\n resetKey: string | number | null | undefined,\n mode: TranscriptFoldMode,\n firstRowId: string\n): string {\n return `transcript:${encodeId(String(resetKey ?? ''))}:${mode}:${encodeId(firstRowId)}`\n}\n\nfunction panelId(instanceId: string, resetKey: string, rowId: string): string {\n return `${instanceId}-row-${encodeId(resetKey)}-${encodeId(rowId)}`\n}\n\nfunction buttonId(instanceId: string, resetKey: string, segmentKey: string): string {\n return `${instanceId}-fold-${encodeId(resetKey)}-${encodeId(segmentKey)}`\n}\n\nfunction sameGroup(a?: GroupPresentation, b?: GroupPresentation): boolean {\n return a === b || (!!a && !!b && a.index === b.index && a.size === b.size)\n}\n\nfunction sameTurn(a?: TurnPresentation, b?: TurnPresentation): boolean {\n return (\n a === b || (!!a && !!b && a.id === b.id && a.complete === b.complete && a.interim === b.interim)\n )\n}\n\nfunction sameFold(a?: TranscriptCompositionFold, b?: TranscriptCompositionFold): boolean {\n return (\n a === b ||\n (!!a &&\n !!b &&\n a.key === b.key &&\n a.mode === b.mode &&\n a.mounting === b.mounting &&\n a.callCount === b.callCount)\n )\n}\n\nfunction sameFoldGroup<T>(a?: FoldGroup<T>, b?: FoldGroup<T>): boolean {\n return (\n a === b ||\n (!!a &&\n !!b &&\n a.key === b.key &&\n a.callCount === b.callCount &&\n a.rows.length === b.rows.length &&\n a.rows.every((row, index) => row === b.rows[index]))\n )\n}\n\nfunction sameRecord<T>(a: RowRecord<T>, b: RowRecord<T>): boolean {\n return (\n a.row === b.row &&\n a.index === b.index &&\n a.displayKind === b.displayKind &&\n sameGroup(a.group, b.group) &&\n sameTurn(a.turn, b.turn) &&\n sameFold(a.fold, b.fold) &&\n sameFoldGroup(a.foldControl, b.foldControl)\n )\n}\n\nfunction firstRow<T>(item: TranscriptTurnItem<T>): TranscriptRow<T> | undefined {\n return item.kind === 'single' ? item.row : item.rows[0]\n}\n\nfunction appendTurnItem<T>(\n item: TranscriptTurnItem<T>,\n displayKind: 'single' | 'group' | 'turn',\n turn: TurnPresentation | undefined,\n indices: ReadonlyMap<TranscriptRow<T>, number>,\n into: RowRecord<T>[]\n): void {\n if (item.kind === 'single') {\n into.push({\n row: item.row,\n index: indices.get(item.row) ?? item.index,\n displayKind,\n turn,\n })\n return\n }\n item.rows.forEach((row, index) => {\n into.push({\n row,\n index: indices.get(row) ?? item.startIndex + index,\n displayKind,\n group: { index, size: item.rows.length },\n turn,\n })\n })\n}\n\nfunction appendDisplayItem<T>(\n item: TranscriptDisplayItem<T>,\n indices: ReadonlyMap<TranscriptRow<T>, number>,\n into: RowRecord<T>[]\n): void {\n if (item.kind !== 'turn') {\n appendTurnItem(item, item.kind, undefined, indices, into)\n return\n }\n const turnId = item.items.map(firstRow).find((row) => row)?.id ?? 'empty-turn'\n const turn: TurnPresentation = {\n id: turnId,\n complete: item.complete,\n interim: !!item.interim,\n }\n for (const child of item.items) appendTurnItem(child, 'turn', turn, indices, into)\n}\n\nfunction buildDisclosures<T>(\n records: readonly RowRecord<T>[],\n defaultMode: TranscriptFoldMode,\n foldState: TranscriptFoldState,\n resetKey: string\n): FoldGroup<T>[] {\n const controls: FoldGroup<T>[] = []\n let scope: RowRecord<T>[] = []\n const flushScope = () => {\n if (!scope.length) return\n const rows = scope.map((record) => record.row)\n const hasInterimTurn = scope.some((record) => record.turn?.interim)\n const hasConclusion = scope.some((record) => record.row.conclusion)\n const mode: TranscriptFoldMode = hasInterimTurn\n ? 'interim'\n : foldState === 'default'\n ? defaultMode\n : foldState === 'collapsed'\n ? hasConclusion\n ? 'prose'\n : 'tools'\n : 'interim'\n const plan = planTranscriptFold(rows, { mode, settled: true })\n const foldable = plan.entries.flatMap((entry, index) =>\n entry.mounting === 'always' ? [] : [{ record: scope[index]!, mounting: entry.mounting }]\n )\n if (foldable.length) {\n const anchorId = scope[0]?.row.id ?? foldable[0]!.record.row.id\n const control: FoldGroup<T> = {\n key: transcriptDisclosureKey(resetKey, mode, anchorId),\n mode,\n callCount: plan.callCount,\n rows: foldable.map(({ record }) => record.row),\n }\n controls.push(control)\n foldable.forEach(({ record, mounting }, index) => {\n record.fold = {\n key: control.key,\n mode: control.mode,\n mounting: foldState === 'collapsed' ? 'hide-when-collapsed' : mounting,\n callCount: control.callCount,\n }\n if (index === 0) record.foldControl = control\n })\n }\n scope = []\n }\n\n for (const record of records) {\n if (record.row.opensTurn && scope.length) flushScope()\n scope.push(record)\n }\n flushScope()\n return controls\n}\n\nfunction foldLabel(mode: TranscriptFoldMode, count: number, expanded: boolean): string {\n const subject =\n mode === 'tools'\n ? count === 1\n ? '1 tool call'\n : count > 1\n ? `${count} tool calls`\n : 'tool details'\n : mode === 'prose'\n ? 'earlier activity'\n : 'interim activity'\n return `${expanded ? 'Hide' : 'Show'} ${subject}`\n}\n\nfunction TranscriptRowEntry<T>(props: {\n record: Accessor<RowRecord<T>>\n renderRow: Component<TranscriptCompositionRendererProps<T>>\n prefix: string\n resetKey: Accessor<string>\n expanded: (key: string) => Accessor<boolean>\n running: Accessor<boolean>\n foldState: Accessor<TranscriptFoldState>\n onToggle: (key: string, expanded: boolean) => void\n}) {\n const current = props.record\n const id = () => panelId(props.prefix, props.resetKey(), current().row.id)\n const foldControl = () => current().foldControl\n const disclosureKey = () => current().fold?.key\n const expanded = () => {\n const key = disclosureKey()\n return key ? props.expanded(key)() : true\n }\n const collapsed = () => !!current().fold && !expanded()\n const disabled = () => props.running() || props.foldState() !== 'default'\n const context = (): TranscriptCompositionRowContext => ({\n index: current().index,\n displayKind: current().displayKind,\n group: current().group,\n turn: current().turn,\n fold: current().fold,\n })\n const groupIndex = () => current().group?.index\n const groupSize = () => current().group?.size\n const renderable = () => current().fold?.mounting !== 'unmount-when-collapsed' || !collapsed()\n const renderHostRow = () =>\n createComponent(props.renderRow, {\n get row() {\n return current().row\n },\n get context() {\n return context()\n },\n })\n const controlLabel = () => {\n const control = foldControl()\n return control ? foldLabel(control.mode, control.callCount, expanded()) : ''\n }\n const controlRows = () =>\n foldControl()\n ?.rows.map((row) => panelId(props.prefix, props.resetKey(), row.id))\n .join(' ')\n\n return (\n <div\n data-slot=\"transcript-row\"\n data-display-kind={current().displayKind}\n data-group-index={groupIndex()}\n data-group-size={groupSize()}\n class=\"flex min-w-0 flex-col gap-1\"\n >\n <Show when={foldControl()}>\n {(control) => (\n <Button\n id={buttonId(props.prefix, props.resetKey(), control().key)}\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n class=\"w-full justify-start\"\n aria-label={controlLabel()}\n aria-controls={controlRows()}\n aria-expanded={expanded()}\n aria-disabled={disabled() || undefined}\n onClick={() => props.onToggle(control().key, !expanded())}\n >\n <ChevronDown aria-hidden=\"true\" class=\"size-4 shrink-0\" />\n <span>{controlLabel()}</span>\n </Button>\n )}\n </Show>\n <div\n id={id()}\n data-slot=\"transcript-row-content\"\n hidden={collapsed()}\n aria-hidden={collapsed() || undefined}\n >\n <Show when={renderable() ? current() : undefined}>\n {(record) => {\n record()\n return renderHostRow()\n }}\n </Show>\n </div>\n </div>\n )\n}\n\n/**\n * Compose host-classified rows into stable turns, contiguous groups and disclosures.\n * Row render owners are keyed by `id` in a single list, so loose rows keep their DOM\n * owners when the grouping threshold promotes them into a turn. The caller owns row\n * identity, protocol meaning, redaction, permissions and durable conversation state.\n */\nexport function TranscriptComposition<T>(props: TranscriptCompositionProps<T>) {\n const [local, rest] = splitProps(props, [\n 'class',\n 'rows',\n 'renderRow',\n 'running',\n 'resetKey',\n 'foldMode',\n 'foldState',\n 'onFoldStateChange',\n 'disclosure',\n 'onDisclosureChange',\n ])\n const instanceId = createUniqueId()\n const grouper = createTranscriptGrouper<T>()\n const [internalFoldState, setInternalFoldState] = createSignal<TranscriptFoldState>('default')\n const rowHandles = new Map<string, RowHandle<T>>()\n const disclosureSignals = new Map<string, DisclosureSignal>()\n let lastResetKey = String(local.resetKey ?? '')\n\n const resetKey = () => String(local.resetKey ?? '')\n const foldState = () => local.foldState ?? internalFoldState()\n const running = () => !!local.running\n const localDisclosure = (key: string): DisclosureSignal => {\n let signal = disclosureSignals.get(key)\n if (!signal) {\n const [get, set] = createSignal<boolean | undefined>(undefined)\n signal = { get, set }\n disclosureSignals.set(key, signal)\n }\n return signal\n }\n const disclosureExpanded = (key: string): Accessor<boolean> => {\n const signal = localDisclosure(key)\n return () => {\n if (running()) return true\n if (foldState() === 'collapsed') return false\n if (foldState() === 'expanded') return true\n return local.disclosure?.get(key) ?? signal.get() ?? false\n }\n }\n const grouped = createMemo(() => grouper(local.rows))\n const layout = createMemo<TranscriptLayout<T>>(() => {\n const identity = resetKey()\n if (identity !== lastResetKey) {\n rowHandles.clear()\n disclosureSignals.clear()\n lastResetKey = identity\n }\n const indexByRow = new Map(local.rows.map((row, index) => [row, index]))\n const display = applyTranscriptRunningState(grouped(), running())\n const records: RowRecord<T>[] = []\n display.forEach((item) => appendDisplayItem(item, indexByRow, records))\n const controls = buildDisclosures(records, local.foldMode ?? 'tools', foldState(), identity)\n return { rows: records, controls }\n })\n const handles = createMemo(() => {\n const live = new Set<string>()\n const identity = resetKey()\n const result = layout().rows.map((record) => {\n const key = `${identity}\\u001f${record.row.id}`\n live.add(key)\n let handle = rowHandles.get(key)\n if (!handle) {\n const [get, set] = createSignal(record)\n handle = { key, get, set, last: record }\n rowHandles.set(key, handle)\n } else if (!sameRecord(handle.last, record)) {\n handle.last = record\n handle.set(record)\n }\n return handle\n })\n for (const key of rowHandles.keys()) if (!live.has(key)) rowHandles.delete(key)\n return result\n })\n const allControlIds = () =>\n layout()\n .controls.flatMap((control) =>\n control.rows.map((row) => panelId(instanceId, resetKey(), row.id))\n )\n .join(' ')\n const updateFoldState = () => {\n if (running()) return\n const current = foldState()\n const next: TranscriptFoldState =\n current === 'default' ? 'collapsed' : current === 'collapsed' ? 'expanded' : 'default'\n if (local.foldState === undefined) setInternalFoldState(next)\n local.onFoldStateChange?.(next)\n }\n const updateDisclosure = (key: string, expanded: boolean) => {\n if (running() || foldState() !== 'default') return\n if (local.disclosure) {\n local.onDisclosureChange?.(key, expanded)\n return\n }\n localDisclosure(key).set(expanded)\n local.onDisclosureChange?.(key, expanded)\n }\n\n return (\n <div\n data-slot=\"transcript-composition\"\n data-fold-state={foldState()}\n class={cn('flex w-full min-w-0 flex-col gap-1', local.class)}\n {...rest}\n >\n <Show when={local.onFoldStateChange}>\n <div class=\"flex justify-end\">\n <Button\n id={`${instanceId}-fold-all`}\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n aria-controls={allControlIds() || undefined}\n aria-disabled={running() || undefined}\n onClick={updateFoldState}\n >\n {foldState() === 'default'\n ? 'Collapse all activity'\n : foldState() === 'collapsed'\n ? 'Expand all activity'\n : 'Restore default folding'}\n </Button>\n </div>\n </Show>\n <div data-slot=\"transcript-rows\" class=\"flex min-w-0 flex-col gap-1\">\n <For each={handles()}>\n {(handle) => (\n <TranscriptRowEntry\n record={handle.get}\n renderRow={local.renderRow}\n prefix={instanceId}\n resetKey={resetKey}\n expanded={disclosureExpanded}\n running={running}\n foldState={foldState}\n onToggle={updateDisclosure}\n />\n )}\n </For>\n </div>\n </div>\n )\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { TranscriptRow } from './transcript-grouping';
|
|
2
|
+
export type TranscriptFoldMode = 'tools' | 'prose' | 'interim';
|
|
3
|
+
export type TranscriptMounting = 'always' | 'unmount-when-collapsed' | 'hide-when-collapsed';
|
|
4
|
+
export type TranscriptFoldPlan<T> = Readonly<{
|
|
5
|
+
entries: readonly Readonly<{
|
|
6
|
+
row: TranscriptRow<T>;
|
|
7
|
+
mounting: TranscriptMounting;
|
|
8
|
+
}>[];
|
|
9
|
+
callCount: number;
|
|
10
|
+
foldableCount: number;
|
|
11
|
+
}>;
|
|
12
|
+
/**
|
|
13
|
+
* Ordered mount policy, shared by tool and prose disclosure. Unknown rows,
|
|
14
|
+
* actionable payloads and host-marked conclusions remain visible in every mode.
|
|
15
|
+
* A missing answer boundary keeps prose visible rather than implying that an
|
|
16
|
+
* answer appears elsewhere.
|
|
17
|
+
*/
|
|
18
|
+
export declare function planTranscriptFold<T>(rows: readonly TranscriptRow<T>[], options: Readonly<{
|
|
19
|
+
mode: TranscriptFoldMode;
|
|
20
|
+
settled: boolean;
|
|
21
|
+
}>): TranscriptFoldPlan<T>;
|
|
22
|
+
//# sourceMappingURL=transcript-folding.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transcript-folding.d.ts","sourceRoot":"","sources":["../../../src/components/conversation/transcript-folding.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAA;AAE1D,MAAM,MAAM,kBAAkB,GAAG,OAAO,GAAG,OAAO,GAAG,SAAS,CAAA;AAC9D,MAAM,MAAM,kBAAkB,GAAG,QAAQ,GAAG,wBAAwB,GAAG,qBAAqB,CAAA;AAC5F,MAAM,MAAM,kBAAkB,CAAC,CAAC,IAAI,QAAQ,CAAC;IAC3C,OAAO,EAAE,SAAS,QAAQ,CAAC;QAAE,GAAG,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC;QAAC,QAAQ,EAAE,kBAAkB,CAAA;KAAE,CAAC,EAAE,CAAA;IACrF,SAAS,EAAE,MAAM,CAAA;IACjB,aAAa,EAAE,MAAM,CAAA;CACtB,CAAC,CAAA;AAEF;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,EAClC,IAAI,EAAE,SAAS,aAAa,CAAC,CAAC,CAAC,EAAE,EACjC,OAAO,EAAE,QAAQ,CAAC;IAAE,IAAI,EAAE,kBAAkB,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC,GAChE,kBAAkB,CAAC,CAAC,CAAC,CAiCvB"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
//#region src/components/conversation/transcript-folding.ts
|
|
2
|
+
/**
|
|
3
|
+
* Ordered mount policy, shared by tool and prose disclosure. Unknown rows,
|
|
4
|
+
* actionable payloads and host-marked conclusions remain visible in every mode.
|
|
5
|
+
* A missing answer boundary keeps prose visible rather than implying that an
|
|
6
|
+
* answer appears elsewhere.
|
|
7
|
+
*/
|
|
8
|
+
function planTranscriptFold(rows, options) {
|
|
9
|
+
let conclusion = -1;
|
|
10
|
+
for (let index = 0; index < rows.length; index++) if (rows[index]?.conclusion) conclusion = index;
|
|
11
|
+
const foldEligible = (row) => !row.alwaysVisible && !row.conclusion && row.fold !== void 0;
|
|
12
|
+
const requestIds = /* @__PURE__ */ new Set();
|
|
13
|
+
let callCount = 0;
|
|
14
|
+
for (const row of rows) if (foldEligible(row) && row.fold === "tool" && row.call?.phase === "request") {
|
|
15
|
+
const id = row.call.id;
|
|
16
|
+
if (id === void 0 || !requestIds.has(id)) {
|
|
17
|
+
callCount++;
|
|
18
|
+
if (id !== void 0) requestIds.add(id);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
let foldableCount = 0;
|
|
22
|
+
return {
|
|
23
|
+
entries: rows.map((row, index) => {
|
|
24
|
+
const eligible = foldEligible(row);
|
|
25
|
+
let mounting = "always";
|
|
26
|
+
if (options.settled && eligible) {
|
|
27
|
+
if (options.mode === "tools" && callCount > 0 && row.fold === "tool") mounting = "unmount-when-collapsed";
|
|
28
|
+
else if (options.mode === "interim" || options.mode === "prose" && conclusion >= 0 && index < conclusion) mounting = "hide-when-collapsed";
|
|
29
|
+
}
|
|
30
|
+
if (mounting !== "always") foldableCount++;
|
|
31
|
+
return {
|
|
32
|
+
row,
|
|
33
|
+
mounting
|
|
34
|
+
};
|
|
35
|
+
}),
|
|
36
|
+
callCount,
|
|
37
|
+
foldableCount
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
//#endregion
|
|
41
|
+
export { planTranscriptFold };
|
|
42
|
+
|
|
43
|
+
//# sourceMappingURL=transcript-folding.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transcript-folding.js","names":[],"sources":["../../../src/components/conversation/transcript-folding.ts"],"sourcesContent":["/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0.\n *\n * Adapted from KiroCrew TurnBlock.tsx at\n * 283e136c0f902e965a535a7c9548c57c7504fed0. Host classifications replace\n * protocol parsing; approval capability and payload ownership stay outside UI.\n */\nimport type { TranscriptRow } from './transcript-grouping'\n\nexport type TranscriptFoldMode = 'tools' | 'prose' | 'interim'\nexport type TranscriptMounting = 'always' | 'unmount-when-collapsed' | 'hide-when-collapsed'\nexport type TranscriptFoldPlan<T> = Readonly<{\n entries: readonly Readonly<{ row: TranscriptRow<T>; mounting: TranscriptMounting }>[]\n callCount: number\n foldableCount: number\n}>\n\n/**\n * Ordered mount policy, shared by tool and prose disclosure. Unknown rows,\n * actionable payloads and host-marked conclusions remain visible in every mode.\n * A missing answer boundary keeps prose visible rather than implying that an\n * answer appears elsewhere.\n */\nexport function planTranscriptFold<T>(\n rows: readonly TranscriptRow<T>[],\n options: Readonly<{ mode: TranscriptFoldMode; settled: boolean }>\n): TranscriptFoldPlan<T> {\n let conclusion = -1\n for (let index = 0; index < rows.length; index++) if (rows[index]?.conclusion) conclusion = index\n const foldEligible = (row: TranscriptRow<T>) =>\n !row.alwaysVisible && !row.conclusion && row.fold !== undefined\n const requestIds = new Set<string>()\n let callCount = 0\n for (const row of rows) {\n if (foldEligible(row) && row.fold === 'tool' && row.call?.phase === 'request') {\n const id = row.call.id\n if (id === undefined || !requestIds.has(id)) {\n callCount++\n if (id !== undefined) requestIds.add(id)\n }\n }\n }\n let foldableCount = 0\n const entries = rows.map((row, index) => {\n const eligible = foldEligible(row)\n let mounting: TranscriptMounting = 'always'\n if (options.settled && eligible) {\n if (options.mode === 'tools' && callCount > 0 && row.fold === 'tool')\n mounting = 'unmount-when-collapsed'\n else if (\n options.mode === 'interim' ||\n (options.mode === 'prose' && conclusion >= 0 && index < conclusion)\n )\n mounting = 'hide-when-collapsed'\n }\n if (mounting !== 'always') foldableCount++\n return { row, mounting }\n })\n return { entries, callCount, foldableCount }\n}\n"],"mappings":";;;;;;;AAwBA,SAAgB,mBACd,MACA,SACuB;CACvB,IAAI,aAAa;CACjB,KAAK,IAAI,QAAQ,GAAG,QAAQ,KAAK,QAAQ,SAAS,IAAI,KAAK,MAAM,EAAE,YAAY,aAAa;CAC5F,MAAM,gBAAgB,QACpB,CAAC,IAAI,iBAAiB,CAAC,IAAI,cAAc,IAAI,SAAS,KAAA;CACxD,MAAM,6BAAa,IAAI,IAAY;CACnC,IAAI,YAAY;CAChB,KAAK,MAAM,OAAO,MAChB,IAAI,aAAa,GAAG,KAAK,IAAI,SAAS,UAAU,IAAI,MAAM,UAAU,WAAW;EAC7E,MAAM,KAAK,IAAI,KAAK;EACpB,IAAI,OAAO,KAAA,KAAa,CAAC,WAAW,IAAI,EAAE,GAAG;GAC3C;GACA,IAAI,OAAO,KAAA,GAAW,WAAW,IAAI,EAAE;EACzC;CACF;CAEF,IAAI,gBAAgB;CAgBpB,OAAO;EAAE,SAfO,KAAK,KAAK,KAAK,UAAU;GACvC,MAAM,WAAW,aAAa,GAAG;GACjC,IAAI,WAA+B;GACnC,IAAI,QAAQ,WAAW,UAAU;IAC/B,IAAI,QAAQ,SAAS,WAAW,YAAY,KAAK,IAAI,SAAS,QAC5D,WAAW;SACR,IACH,QAAQ,SAAS,aAChB,QAAQ,SAAS,WAAW,cAAc,KAAK,QAAQ,YAExD,WAAW;GACf;GACA,IAAI,aAAa,UAAU;GAC3B,OAAO;IAAE;IAAK;GAAS;EACzB,CACS;EAAS;EAAW;CAAc;AAC7C"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/** Immutable, already-redacted host rows. Unknown rows remain visible singles. */
|
|
2
|
+
export type TranscriptRow<T> = Readonly<{
|
|
3
|
+
id: string;
|
|
4
|
+
value: T;
|
|
5
|
+
hidden?: boolean;
|
|
6
|
+
groupable?: boolean;
|
|
7
|
+
working?: boolean;
|
|
8
|
+
/** True only for a content-bearing reasoning trace, never an empty placeholder. */
|
|
9
|
+
reasoning?: boolean;
|
|
10
|
+
opensTurn?: 'reset' | 'continue';
|
|
11
|
+
synthesis?: boolean;
|
|
12
|
+
/** A proven answer boundary, supplied by the host rather than inferred from text. */
|
|
13
|
+
turnEnd?: boolean;
|
|
14
|
+
/** Content that a synthesis does not restate; prevents interim folding. */
|
|
15
|
+
foreign?: boolean;
|
|
16
|
+
/** Explicit host eligibility; unknown content never folds. */
|
|
17
|
+
fold?: 'tool' | 'prose';
|
|
18
|
+
/** Errors, approvals, questions, diffs, renderables and interactive payloads bypass every fold. */
|
|
19
|
+
alwaysVisible?: boolean;
|
|
20
|
+
/** A host-designated substantive answer. No text-length or role heuristic is applied. */
|
|
21
|
+
conclusion?: boolean;
|
|
22
|
+
/** Request/result classification is supplied by the host, never parsed from display text. */
|
|
23
|
+
call?: Readonly<{
|
|
24
|
+
phase: 'request' | 'result';
|
|
25
|
+
id?: string;
|
|
26
|
+
}>;
|
|
27
|
+
}>;
|
|
28
|
+
export type TranscriptTurnItem<T> = Readonly<{
|
|
29
|
+
kind: 'single';
|
|
30
|
+
row: TranscriptRow<T>;
|
|
31
|
+
index: number;
|
|
32
|
+
}> | Readonly<{
|
|
33
|
+
kind: 'group';
|
|
34
|
+
rows: readonly TranscriptRow<T>[];
|
|
35
|
+
startIndex: number;
|
|
36
|
+
}>;
|
|
37
|
+
export type TranscriptDisplayItem<T> = TranscriptTurnItem<T> | Readonly<{
|
|
38
|
+
kind: 'turn';
|
|
39
|
+
items: readonly TranscriptTurnItem<T>[];
|
|
40
|
+
/** Presentation bookkeeping, never evidence of successful runtime completion. */
|
|
41
|
+
complete: boolean;
|
|
42
|
+
interim?: boolean;
|
|
43
|
+
}>;
|
|
44
|
+
export type GroupedTranscript<T> = Readonly<{
|
|
45
|
+
turns: readonly TranscriptDisplayItem<T>[];
|
|
46
|
+
trailingTurnIndex: number;
|
|
47
|
+
}>;
|
|
48
|
+
/** Ordered O(N) grouping; approvals are retained unless their host explicitly owns them elsewhere. */
|
|
49
|
+
export declare function groupTranscriptRows<T>(rows: readonly TranscriptRow<T>[]): GroupedTranscript<T>;
|
|
50
|
+
/** One previous immutable input/result pair per caller; no global or growing transcript cache. */
|
|
51
|
+
export declare function createTranscriptGrouper<T>(): (rows: readonly TranscriptRow<T>[]) => GroupedTranscript<T>;
|
|
52
|
+
/** Shallow-copies the display list and changes only its trailing turn. The host supplies running authority. */
|
|
53
|
+
export declare function applyTranscriptRunningState<T>(grouped: GroupedTranscript<T>, running: boolean): readonly TranscriptDisplayItem<T>[];
|
|
54
|
+
//# sourceMappingURL=transcript-grouping.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transcript-grouping.d.ts","sourceRoot":"","sources":["../../../src/components/conversation/transcript-grouping.ts"],"names":[],"mappings":"AASA,kFAAkF;AAClF,MAAM,MAAM,aAAa,CAAC,CAAC,IAAI,QAAQ,CAAC;IACtC,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,CAAC,CAAA;IACR,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,mFAAmF;IACnF,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,SAAS,CAAC,EAAE,OAAO,GAAG,UAAU,CAAA;IAChC,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,qFAAqF;IACrF,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,2EAA2E;IAC3E,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,8DAA8D;IAC9D,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAA;IACvB,mGAAmG;IACnG,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,yFAAyF;IACzF,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,6FAA6F;IAC7F,IAAI,CAAC,EAAE,QAAQ,CAAC;QAAE,KAAK,EAAE,SAAS,GAAG,QAAQ,CAAC;QAAC,EAAE,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAC9D,CAAC,CAAA;AAEF,MAAM,MAAM,kBAAkB,CAAC,CAAC,IAC5B,QAAQ,CAAC;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,GAAG,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,GAClE,QAAQ,CAAC;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,SAAS,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC,CAAA;AAEtF,MAAM,MAAM,qBAAqB,CAAC,CAAC,IAC/B,kBAAkB,CAAC,CAAC,CAAC,GACrB,QAAQ,CAAC;IACP,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,SAAS,kBAAkB,CAAC,CAAC,CAAC,EAAE,CAAA;IACvC,iFAAiF;IACjF,QAAQ,EAAE,OAAO,CAAA;IACjB,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB,CAAC,CAAA;AAEN,MAAM,MAAM,iBAAiB,CAAC,CAAC,IAAI,QAAQ,CAAC;IAC1C,KAAK,EAAE,SAAS,qBAAqB,CAAC,CAAC,CAAC,EAAE,CAAA;IAC1C,iBAAiB,EAAE,MAAM,CAAA;CAC1B,CAAC,CAAA;AAEF,sGAAsG;AACtG,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,aAAa,CAAC,CAAC,CAAC,EAAE,GAAG,iBAAiB,CAAC,CAAC,CAAC,CA0F9F;AAsBD,kGAAkG;AAClG,wBAAgB,uBAAuB,CAAC,CAAC,KAAK,CAC5C,IAAI,EAAE,SAAS,aAAa,CAAC,CAAC,CAAC,EAAE,KAC9B,iBAAiB,CAAC,CAAC,CAAC,CAsBxB;AAED,+GAA+G;AAC/G,wBAAgB,2BAA2B,CAAC,CAAC,EAC3C,OAAO,EAAE,iBAAiB,CAAC,CAAC,CAAC,EAC7B,OAAO,EAAE,OAAO,GACf,SAAS,qBAAqB,CAAC,CAAC,CAAC,EAAE,CAMrC"}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
//#region src/components/conversation/transcript-grouping.ts
|
|
2
|
+
/** Ordered O(N) grouping; approvals are retained unless their host explicitly owns them elsewhere. */
|
|
3
|
+
function groupTranscriptRows(rows) {
|
|
4
|
+
const raw = [];
|
|
5
|
+
let group = [];
|
|
6
|
+
let groupStart = 0;
|
|
7
|
+
rows.forEach((row, index) => {
|
|
8
|
+
if (row.hidden) return;
|
|
9
|
+
if (row.groupable) {
|
|
10
|
+
if (!group.length) groupStart = index;
|
|
11
|
+
group.push(row);
|
|
12
|
+
} else {
|
|
13
|
+
if (group.length) {
|
|
14
|
+
raw.push({
|
|
15
|
+
kind: "group",
|
|
16
|
+
rows: group,
|
|
17
|
+
startIndex: groupStart
|
|
18
|
+
});
|
|
19
|
+
group = [];
|
|
20
|
+
}
|
|
21
|
+
raw.push({
|
|
22
|
+
kind: "single",
|
|
23
|
+
row,
|
|
24
|
+
index
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
});
|
|
28
|
+
if (group.length) raw.push({
|
|
29
|
+
kind: "group",
|
|
30
|
+
rows: group,
|
|
31
|
+
startIndex: groupStart
|
|
32
|
+
});
|
|
33
|
+
const turns = [];
|
|
34
|
+
let items = [];
|
|
35
|
+
let regionStart = 0;
|
|
36
|
+
let foreign = false;
|
|
37
|
+
let pendingAnswer = false;
|
|
38
|
+
const flush = (batch) => {
|
|
39
|
+
const working = batch.some((item) => item.kind === "group" || item.row.working);
|
|
40
|
+
const reasoning = batch.reduce((count, item) => count + Number(item.kind === "single" && item.row.reasoning === true), 0);
|
|
41
|
+
if (working && batch.length > 2 || reasoning >= 2) turns.push({
|
|
42
|
+
kind: "turn",
|
|
43
|
+
items: batch,
|
|
44
|
+
complete: true
|
|
45
|
+
});
|
|
46
|
+
else turns.push(...batch);
|
|
47
|
+
};
|
|
48
|
+
const foldInterim = () => {
|
|
49
|
+
const folded = turns.splice(regionStart).flatMap((item) => item.kind === "turn" ? [...item.items] : [item]);
|
|
50
|
+
if (folded.length) turns.push({
|
|
51
|
+
kind: "turn",
|
|
52
|
+
items: folded,
|
|
53
|
+
complete: true,
|
|
54
|
+
interim: true
|
|
55
|
+
});
|
|
56
|
+
};
|
|
57
|
+
const settleAnswer = () => {
|
|
58
|
+
if (!pendingAnswer) return;
|
|
59
|
+
const end = items.findIndex((item) => item.kind === "single" && item.row.turnEnd);
|
|
60
|
+
if (end >= 0) {
|
|
61
|
+
flush(items.slice(0, end + 1));
|
|
62
|
+
items = items.slice(end + 1);
|
|
63
|
+
regionStart = turns.length;
|
|
64
|
+
foreign = items.some((item) => item.kind === "single" && item.row.foreign);
|
|
65
|
+
} else foreign = true;
|
|
66
|
+
pendingAnswer = false;
|
|
67
|
+
};
|
|
68
|
+
for (const item of raw) {
|
|
69
|
+
if (item.kind === "single" && item.row.synthesis) {
|
|
70
|
+
settleAnswer();
|
|
71
|
+
if (items.length) {
|
|
72
|
+
flush(items);
|
|
73
|
+
items = [];
|
|
74
|
+
}
|
|
75
|
+
if (!foreign) foldInterim();
|
|
76
|
+
items.push(item);
|
|
77
|
+
regionStart = turns.length;
|
|
78
|
+
pendingAnswer = true;
|
|
79
|
+
continue;
|
|
80
|
+
}
|
|
81
|
+
if (item.kind === "single" && item.row.foreign) foreign = true;
|
|
82
|
+
if (item.kind === "single" && item.row.opensTurn) {
|
|
83
|
+
settleAnswer();
|
|
84
|
+
if (items.length) {
|
|
85
|
+
flush(items);
|
|
86
|
+
items = [];
|
|
87
|
+
}
|
|
88
|
+
turns.push(item);
|
|
89
|
+
if (item.row.opensTurn === "reset") {
|
|
90
|
+
regionStart = turns.length;
|
|
91
|
+
foreign = false;
|
|
92
|
+
pendingAnswer = false;
|
|
93
|
+
}
|
|
94
|
+
continue;
|
|
95
|
+
}
|
|
96
|
+
items.push(item);
|
|
97
|
+
}
|
|
98
|
+
let trailingTurnIndex = -1;
|
|
99
|
+
if (items.length) {
|
|
100
|
+
const before = turns.length;
|
|
101
|
+
flush(items);
|
|
102
|
+
if (turns.length === before + 1 && turns.at(-1)?.kind === "turn") trailingTurnIndex = turns.length - 1;
|
|
103
|
+
}
|
|
104
|
+
return {
|
|
105
|
+
turns,
|
|
106
|
+
trailingTurnIndex
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
function sameItem(a, b) {
|
|
110
|
+
if (a.kind === "single") return b.kind === "single" && a.row === b.row && a.index === b.index;
|
|
111
|
+
if (b.kind !== "group" || a.startIndex !== b.startIndex || a.rows.length !== b.rows.length) return false;
|
|
112
|
+
return a.rows.every((row, index) => row === b.rows[index]);
|
|
113
|
+
}
|
|
114
|
+
function sameDisplayItem(a, b) {
|
|
115
|
+
if (a.kind === "turn") return b.kind === "turn" && a.complete === b.complete && !!a.interim === !!b.interim && a.items.length === b.items.length && a.items.every((item, index) => sameItem(item, b.items[index]));
|
|
116
|
+
return b.kind !== "turn" && sameItem(a, b);
|
|
117
|
+
}
|
|
118
|
+
/** One previous immutable input/result pair per caller; no global or growing transcript cache. */
|
|
119
|
+
function createTranscriptGrouper() {
|
|
120
|
+
let previousRows;
|
|
121
|
+
let previous;
|
|
122
|
+
return (rows) => {
|
|
123
|
+
if (previous && rows === previousRows) return previous;
|
|
124
|
+
const fresh = groupTranscriptRows(rows);
|
|
125
|
+
const turns = [...fresh.turns];
|
|
126
|
+
let allReused = previous?.turns.length === turns.length && previous.trailingTurnIndex === fresh.trailingTurnIndex;
|
|
127
|
+
if (previous) for (let index = 0; index < turns.length; index++) {
|
|
128
|
+
const candidate = previous.turns[index];
|
|
129
|
+
if (candidate && sameDisplayItem(turns[index], candidate)) turns[index] = candidate;
|
|
130
|
+
else allReused = false;
|
|
131
|
+
}
|
|
132
|
+
previousRows = rows;
|
|
133
|
+
if (previous && allReused) return previous;
|
|
134
|
+
previous = {
|
|
135
|
+
turns,
|
|
136
|
+
trailingTurnIndex: fresh.trailingTurnIndex
|
|
137
|
+
};
|
|
138
|
+
return previous;
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
/** Shallow-copies the display list and changes only its trailing turn. The host supplies running authority. */
|
|
142
|
+
function applyTranscriptRunningState(grouped, running) {
|
|
143
|
+
if (grouped.trailingTurnIndex < 0 || !running) return grouped.turns;
|
|
144
|
+
const turns = [...grouped.turns];
|
|
145
|
+
const trailing = turns[grouped.trailingTurnIndex];
|
|
146
|
+
if (trailing?.kind === "turn") turns[grouped.trailingTurnIndex] = {
|
|
147
|
+
...trailing,
|
|
148
|
+
complete: false
|
|
149
|
+
};
|
|
150
|
+
return turns;
|
|
151
|
+
}
|
|
152
|
+
//#endregion
|
|
153
|
+
export { applyTranscriptRunningState, createTranscriptGrouper, groupTranscriptRows };
|
|
154
|
+
|
|
155
|
+
//# sourceMappingURL=transcript-grouping.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transcript-grouping.js","names":[],"sources":["../../../src/components/conversation/transcript-grouping.ts"],"sourcesContent":["/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0.\n *\n * Substantially translated from KiroCrew groupDisplayItems.ts at\n * 283e136c0f902e965a535a7c9548c57c7504fed0. Protocol classification is supplied\n * by the host; no Kiro role, metadata parser, store, or transport is imported.\n */\n\n/** Immutable, already-redacted host rows. Unknown rows remain visible singles. */\nexport type TranscriptRow<T> = Readonly<{\n id: string\n value: T\n hidden?: boolean\n groupable?: boolean\n working?: boolean\n /** True only for a content-bearing reasoning trace, never an empty placeholder. */\n reasoning?: boolean\n opensTurn?: 'reset' | 'continue'\n synthesis?: boolean\n /** A proven answer boundary, supplied by the host rather than inferred from text. */\n turnEnd?: boolean\n /** Content that a synthesis does not restate; prevents interim folding. */\n foreign?: boolean\n /** Explicit host eligibility; unknown content never folds. */\n fold?: 'tool' | 'prose'\n /** Errors, approvals, questions, diffs, renderables and interactive payloads bypass every fold. */\n alwaysVisible?: boolean\n /** A host-designated substantive answer. No text-length or role heuristic is applied. */\n conclusion?: boolean\n /** Request/result classification is supplied by the host, never parsed from display text. */\n call?: Readonly<{ phase: 'request' | 'result'; id?: string }>\n}>\n\nexport type TranscriptTurnItem<T> =\n | Readonly<{ kind: 'single'; row: TranscriptRow<T>; index: number }>\n | Readonly<{ kind: 'group'; rows: readonly TranscriptRow<T>[]; startIndex: number }>\n\nexport type TranscriptDisplayItem<T> =\n | TranscriptTurnItem<T>\n | Readonly<{\n kind: 'turn'\n items: readonly TranscriptTurnItem<T>[]\n /** Presentation bookkeeping, never evidence of successful runtime completion. */\n complete: boolean\n interim?: boolean\n }>\n\nexport type GroupedTranscript<T> = Readonly<{\n turns: readonly TranscriptDisplayItem<T>[]\n trailingTurnIndex: number\n}>\n\n/** Ordered O(N) grouping; approvals are retained unless their host explicitly owns them elsewhere. */\nexport function groupTranscriptRows<T>(rows: readonly TranscriptRow<T>[]): GroupedTranscript<T> {\n const raw: TranscriptTurnItem<T>[] = []\n let group: TranscriptRow<T>[] = []\n let groupStart = 0\n rows.forEach((row, index) => {\n if (row.hidden) return\n if (row.groupable) {\n if (!group.length) groupStart = index\n group.push(row)\n } else {\n if (group.length) {\n raw.push({ kind: 'group', rows: group, startIndex: groupStart })\n group = []\n }\n raw.push({ kind: 'single', row, index })\n }\n })\n if (group.length) raw.push({ kind: 'group', rows: group, startIndex: groupStart })\n\n const turns: TranscriptDisplayItem<T>[] = []\n let items: TranscriptTurnItem<T>[] = []\n let regionStart = 0\n let foreign = false\n let pendingAnswer = false\n const flush = (batch: TranscriptTurnItem<T>[]) => {\n const working = batch.some((item) => item.kind === 'group' || item.row.working)\n const reasoning = batch.reduce(\n (count, item) => count + Number(item.kind === 'single' && item.row.reasoning === true),\n 0\n )\n if ((working && batch.length > 2) || reasoning >= 2)\n turns.push({ kind: 'turn', items: batch, complete: true })\n else turns.push(...batch)\n }\n const foldInterim = () => {\n const region = turns.splice(regionStart)\n const folded = region.flatMap((item) => (item.kind === 'turn' ? [...item.items] : [item]))\n if (folded.length) turns.push({ kind: 'turn', items: folded, complete: true, interim: true })\n }\n const settleAnswer = () => {\n if (!pendingAnswer) return\n const end = items.findIndex((item) => item.kind === 'single' && item.row.turnEnd)\n if (end >= 0) {\n flush(items.slice(0, end + 1))\n items = items.slice(end + 1)\n regionStart = turns.length\n // Recompute from retained rows: an unrelated injection after the answer\n // must still protect the next wave, while an earlier one must not poison it.\n foreign = items.some((item) => item.kind === 'single' && item.row.foreign)\n } else foreign = true\n pendingAnswer = false\n }\n for (const item of raw) {\n if (item.kind === 'single' && item.row.synthesis) {\n settleAnswer()\n if (items.length) {\n flush(items)\n items = []\n }\n if (!foreign) foldInterim()\n items.push(item)\n regionStart = turns.length\n pendingAnswer = true\n continue\n }\n if (item.kind === 'single' && item.row.foreign) foreign = true\n if (item.kind === 'single' && item.row.opensTurn) {\n settleAnswer()\n if (items.length) {\n flush(items)\n items = []\n }\n turns.push(item)\n if (item.row.opensTurn === 'reset') {\n regionStart = turns.length\n foreign = false\n pendingAnswer = false\n }\n continue\n }\n items.push(item)\n }\n let trailingTurnIndex = -1\n if (items.length) {\n const before = turns.length\n flush(items)\n if (turns.length === before + 1 && turns.at(-1)?.kind === 'turn')\n trailingTurnIndex = turns.length - 1\n }\n return { turns, trailingTurnIndex }\n}\n\nfunction sameItem<T>(a: TranscriptTurnItem<T>, b: TranscriptTurnItem<T>): boolean {\n if (a.kind === 'single') return b.kind === 'single' && a.row === b.row && a.index === b.index\n if (b.kind !== 'group' || a.startIndex !== b.startIndex || a.rows.length !== b.rows.length)\n return false\n return a.rows.every((row, index) => row === b.rows[index])\n}\n\nfunction sameDisplayItem<T>(a: TranscriptDisplayItem<T>, b: TranscriptDisplayItem<T>): boolean {\n if (a.kind === 'turn') {\n return (\n b.kind === 'turn' &&\n a.complete === b.complete &&\n !!a.interim === !!b.interim &&\n a.items.length === b.items.length &&\n a.items.every((item, index) => sameItem(item, b.items[index]!))\n )\n }\n return b.kind !== 'turn' && sameItem(a, b)\n}\n\n/** One previous immutable input/result pair per caller; no global or growing transcript cache. */\nexport function createTranscriptGrouper<T>(): (\n rows: readonly TranscriptRow<T>[]\n) => GroupedTranscript<T> {\n let previousRows: readonly TranscriptRow<T>[] | undefined\n let previous: GroupedTranscript<T> | undefined\n return (rows) => {\n if (previous && rows === previousRows) return previous\n const fresh = groupTranscriptRows(rows)\n const turns = [...fresh.turns]\n let allReused =\n previous?.turns.length === turns.length &&\n previous.trailingTurnIndex === fresh.trailingTurnIndex\n if (previous) {\n for (let index = 0; index < turns.length; index++) {\n const candidate = previous.turns[index]\n if (candidate && sameDisplayItem(turns[index]!, candidate)) turns[index] = candidate\n else allReused = false\n }\n }\n previousRows = rows\n if (previous && allReused) return previous\n previous = { turns, trailingTurnIndex: fresh.trailingTurnIndex }\n return previous\n }\n}\n\n/** Shallow-copies the display list and changes only its trailing turn. The host supplies running authority. */\nexport function applyTranscriptRunningState<T>(\n grouped: GroupedTranscript<T>,\n running: boolean\n): readonly TranscriptDisplayItem<T>[] {\n if (grouped.trailingTurnIndex < 0 || !running) return grouped.turns\n const turns = [...grouped.turns]\n const trailing = turns[grouped.trailingTurnIndex]\n if (trailing?.kind === 'turn') turns[grouped.trailingTurnIndex] = { ...trailing, complete: false }\n return turns\n}\n"],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -76,6 +76,7 @@ import { ConversationAvatar } from "./components/conversation/conversation-avata
|
|
|
76
76
|
import { ConversationSurface } from "./components/conversation/conversation-surface.js";
|
|
77
77
|
import { ComposerAttachmentButton, ComposerHint, MessageComposer } from "./components/conversation/message-composer.js";
|
|
78
78
|
import { MessageBody, MessageDayDivider, MessageGroup, MessageRow } from "./components/conversation/message-row.js";
|
|
79
|
+
import { TranscriptComposition, transcriptDisclosureKey } from "./components/conversation/transcript-composition.js";
|
|
79
80
|
import { AttachmentCard, ThreadPanel } from "./components/conversation/thread-panel.js";
|
|
80
81
|
import { PASTE_THRESHOLD_CHARS, PASTE_THRESHOLD_LINES, PASTE_TOKEN_REGEX, countLines, expandAll, findTokenRanges, formatToken, isPasteBlock, nextSeq, pruneBlocks, recollapsePastes, remapCarriedBlocks, shouldCollapse, stripTrailingBlankLines, tokenRangeAt } from "./components/conversation/paste-tokens.js";
|
|
81
82
|
import { accentPresets, allTokens, colorTokens, densityTokens, designTokens, elevationTokens, fontOptions, motionTokens, radiusTokens, typographyTokens, undocumentedTokenAliases, zIndexTokens } from "./lib/tokens.js";
|
|
@@ -94,4 +95,4 @@ import { formatBytes, formatReleaseDate, plainTextFromMarkdown } from "./lib/ver
|
|
|
94
95
|
import { UpdateDialog } from "./components/composites/update-dialog/update-dialog.js";
|
|
95
96
|
import { WorkspaceMark } from "./components/composites/workspace-mark/workspace-mark.js";
|
|
96
97
|
import { keyedRows } from "./lib/keyed-rows.js";
|
|
97
|
-
export { Accordion, AccordionContent, AccordionItem, AccordionTrigger, AccountMenu, Alert, AlertDescription, AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogOverlay, AlertDialogPortal, AlertDialogTitle, AlertDialogTrigger, AlertTitle, AppShell, AppShellBody, AppShellContent, AppShellMain, AppearanceEditor, AppearancePanel, AppearancePopover, AspectRatio, AttachmentCard, Avatar, AvatarFallback, AvatarImage, Badge, Board, BoardCardBody, BoardCardTitle, Breadcrumb, BreadcrumbEllipsis, BreadcrumbItem, BreadcrumbLink, BreadcrumbList, BreadcrumbSeparator, BusySendButton, Button, ButtonGroup, ButtonGroupSeparator, ButtonGroupText, CalendarSurface, Card, CardAction, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, ChatComposer, Checkbox, CheckboxDescription, CheckboxLabel, CodeBlock, Collapsible, CollapsibleContent, CollapsibleTrigger, Combobox, ComboboxClear, ComboboxContent, ComboboxControl, ComboboxInput, ComboboxItem, ComboboxSection, ComboboxTrigger, Command, CommandDialog, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList, CommandLoading, CommandSeparator, CommandShortcut, ComposerAttachmentButton, ComposerHint, ContextMenu, ContextMenuCheckboxItem, ContextMenuContent, ContextMenuGroup, ContextMenuItem, ContextMenuLabel, ContextMenuRadioGroup, ContextMenuRadioItem, ContextMenuSeparator, ContextMenuSub, ContextMenuSubContent, ContextMenuSubTrigger, ContextMenuTrigger, ConversationAvatar, ConversationSurface, DatePicker, DetailPanel, DetailPanelBody, DetailPanelField, DetailPanelHeader, DetailPanelSection, Dialog, DialogClose, DialogCloseButton, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger, DiffBlock, DiffSummary, Drawer, DrawerBody, DrawerCloseButton, DrawerContent, DrawerDescription, DrawerFooter, DrawerHeader, DrawerOverlay, DrawerTitle, DrawerTrigger, DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, Empty, EmptyContent, EmptyDescription, EmptyHeader, EmptyMedia, EmptyTitle, EntityIcon, Field, FieldDescription, FieldError, FieldInput, FieldLabel, FieldLegend, FieldSeparator, FieldSet, FieldTextArea, HoverCard, HoverCardContent, HoverCardTrigger, InlineCode, Input, InputGroup, InputGroupAddon, InputGroupButton, InputGroupInput, InputGroupText, InputOtp, InputOtpCaret, Item, ItemDescription, ItemEmpty, ItemGroup, ItemGroupEntry, ItemTitle, Kbd, KbdGroup, Label, ListGroup, ListRow, MAX_LAYOUT_DEPTH, MAX_LAYOUT_LEAVES, MAX_SPLIT_RATIO, MIN_SPLIT_RATIO, Menubar, MenubarCheckboxItem, MenubarContent, MenubarGroup, MenubarItem, MenubarLabel, MenubarMenu, MenubarRadioGroup, MenubarRadioItem, MenubarSeparator, MenubarSub, MenubarSubContent, MenubarSubTrigger, MenubarTrigger, MessageBody, MessageComposer, MessageDayDivider, MessageGroup, MessageRow, ModalDialog, Motion, NavigationMenu, NavigationMenuContent, NavigationMenuGroup, NavigationMenuGroupLabel, NavigationMenuItem, NavigationMenuMenu, NavigationMenuSeparator, NavigationMenuTrigger, NavigationMenuViewport, PASTE_THRESHOLD_CHARS, PASTE_THRESHOLD_LINES, PASTE_TOKEN_REGEX, Page, PageHeader, PageHeaderActions, PageHeaderContent, PageHeaderDescription, PageHeaderTitle, PageSection, Pagination, PaginationEllipsis, PaginationItem, PaginationNext, PaginationPrevious, PalettePreview, Panel, PanelActions, PanelBody, PanelCard, PanelDescription, PanelFooter, PanelHeader, PanelPlaceholder, PanelTitle, PanelToolbar, Popover, PopoverAnchor, PopoverCloseButton, PopoverContent, PopoverDescription, PopoverTitle, PopoverTrigger, Presence, Progress, PropertyList, PropertyRow, PropertyTerm, PropertyValue, RadioGroup, RadioGroupItem, ResizableHandle, ResizablePanel, ResizablePanelGroup, ScrollArea, Select, SelectChevronsUpDown, SelectContent, SelectItem, SelectLabel, SelectSection, SelectTrigger, SelectValue, Separator, SettingsField, SettingsPage, SettingsRow, SettingsSection, Sheet, SheetBody, SheetCloseButton, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetTitle, SheetTrigger, SideRail, SideRailButton, SideRailContent, SideRailFooter, SideRailHeader, SideRailItem, SideRailSection, SidebarNav, SidebarNavButton, SidebarNavContent, SidebarNavFooter, SidebarNavHeader, SidebarNavItem, SidebarNavSection, SidebarNavTitle, Skeleton, Slider, Spinner, SplitLayout, Stat, StatGroup, StatusBar, StatusBarItem, StatusBarSpacer, StatusChip, StatusList, Switch, SwitchDescription, SwitchLabel, TALL_CODE_BLOCK_PX, Table, TableBody, TableCaption, TableCell, TableFooter, TableHead, TableHeader, TableNumericCell, TableRow, Tabs, TabsContent, TabsList, TabsTrigger, Textarea, ThemeMiniature, ThemeMiniatureSplit, ThemePicker, ThemePreview, ThemeProvider, ThemeSwatch, ThemeToggle, ThreadPanel, Toaster, Toggle, ToggleGroup, ToggleGroupItem, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, TopBar, TopBarBreadcrumb, TopBarPill, TopBarSearch, TopBarSection, TopBarTitle, UpdateDialog, WorkspaceMark, accentPresets, alertVariants, allTokens, badgeVariants, boardCardTitleVariants, builtinThemes, buttonVariants, closePane, cn, colorTokens, computeLayoutFrames, contrastRatio, controlInteractive, controlSize, controlSizeIcon, controlSizes, countLeaves, countLines, createLayoutState, cva, defaultDarkThemeId, defaultLightThemeId, defaultThemeSelection, densityTokens, designTokens, diffLineVariants, diffStats, diffTargetPath, elevationTokens, entityIconVariants, expandAll, findTokenRanges, focusPane, fontOptions, formatBytes, formatReleaseDate, formatToken, initialsFrom, inlineScriptLiteral, isPasteBlock, itemVariants, keyedRows, layoutDepth, listLeaves, monogram, motionTokens, movePane, neighborLeaf, nextSeq, normalizeLayout, parseDiff, plainTextFromMarkdown, pruneBlocks, radiusTokens, recollapsePastes, remapCarriedBlocks, resizeSplit, resolvedDensity, sheetVariants, shouldCollapse, sidebarNavItemClass, sidebarNavItemStateClass, splitPane, statusDotVariants, stripTrailingBlankLines, surfaceInteractive, swapPanes, themeById, themeCssVariables, themeFamilies, themeScript, themesForAppearance, toast, toaster, toggleVariants, tokenRangeAt, typographyTokens, undoClosePane, undocumentedTokenAliases, useSideRail, useTheme, validateTheme, validateThemeRegistry, zIndexTokens };
|
|
98
|
+
export { Accordion, AccordionContent, AccordionItem, AccordionTrigger, AccountMenu, Alert, AlertDescription, AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogOverlay, AlertDialogPortal, AlertDialogTitle, AlertDialogTrigger, AlertTitle, AppShell, AppShellBody, AppShellContent, AppShellMain, AppearanceEditor, AppearancePanel, AppearancePopover, AspectRatio, AttachmentCard, Avatar, AvatarFallback, AvatarImage, Badge, Board, BoardCardBody, BoardCardTitle, Breadcrumb, BreadcrumbEllipsis, BreadcrumbItem, BreadcrumbLink, BreadcrumbList, BreadcrumbSeparator, BusySendButton, Button, ButtonGroup, ButtonGroupSeparator, ButtonGroupText, CalendarSurface, Card, CardAction, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, ChatComposer, Checkbox, CheckboxDescription, CheckboxLabel, CodeBlock, Collapsible, CollapsibleContent, CollapsibleTrigger, Combobox, ComboboxClear, ComboboxContent, ComboboxControl, ComboboxInput, ComboboxItem, ComboboxSection, ComboboxTrigger, Command, CommandDialog, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList, CommandLoading, CommandSeparator, CommandShortcut, ComposerAttachmentButton, ComposerHint, ContextMenu, ContextMenuCheckboxItem, ContextMenuContent, ContextMenuGroup, ContextMenuItem, ContextMenuLabel, ContextMenuRadioGroup, ContextMenuRadioItem, ContextMenuSeparator, ContextMenuSub, ContextMenuSubContent, ContextMenuSubTrigger, ContextMenuTrigger, ConversationAvatar, ConversationSurface, DatePicker, DetailPanel, DetailPanelBody, DetailPanelField, DetailPanelHeader, DetailPanelSection, Dialog, DialogClose, DialogCloseButton, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger, DiffBlock, DiffSummary, Drawer, DrawerBody, DrawerCloseButton, DrawerContent, DrawerDescription, DrawerFooter, DrawerHeader, DrawerOverlay, DrawerTitle, DrawerTrigger, DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, Empty, EmptyContent, EmptyDescription, EmptyHeader, EmptyMedia, EmptyTitle, EntityIcon, Field, FieldDescription, FieldError, FieldInput, FieldLabel, FieldLegend, FieldSeparator, FieldSet, FieldTextArea, HoverCard, HoverCardContent, HoverCardTrigger, InlineCode, Input, InputGroup, InputGroupAddon, InputGroupButton, InputGroupInput, InputGroupText, InputOtp, InputOtpCaret, Item, ItemDescription, ItemEmpty, ItemGroup, ItemGroupEntry, ItemTitle, Kbd, KbdGroup, Label, ListGroup, ListRow, MAX_LAYOUT_DEPTH, MAX_LAYOUT_LEAVES, MAX_SPLIT_RATIO, MIN_SPLIT_RATIO, Menubar, MenubarCheckboxItem, MenubarContent, MenubarGroup, MenubarItem, MenubarLabel, MenubarMenu, MenubarRadioGroup, MenubarRadioItem, MenubarSeparator, MenubarSub, MenubarSubContent, MenubarSubTrigger, MenubarTrigger, MessageBody, MessageComposer, MessageDayDivider, MessageGroup, MessageRow, ModalDialog, Motion, NavigationMenu, NavigationMenuContent, NavigationMenuGroup, NavigationMenuGroupLabel, NavigationMenuItem, NavigationMenuMenu, NavigationMenuSeparator, NavigationMenuTrigger, NavigationMenuViewport, PASTE_THRESHOLD_CHARS, PASTE_THRESHOLD_LINES, PASTE_TOKEN_REGEX, Page, PageHeader, PageHeaderActions, PageHeaderContent, PageHeaderDescription, PageHeaderTitle, PageSection, Pagination, PaginationEllipsis, PaginationItem, PaginationNext, PaginationPrevious, PalettePreview, Panel, PanelActions, PanelBody, PanelCard, PanelDescription, PanelFooter, PanelHeader, PanelPlaceholder, PanelTitle, PanelToolbar, Popover, PopoverAnchor, PopoverCloseButton, PopoverContent, PopoverDescription, PopoverTitle, PopoverTrigger, Presence, Progress, PropertyList, PropertyRow, PropertyTerm, PropertyValue, RadioGroup, RadioGroupItem, ResizableHandle, ResizablePanel, ResizablePanelGroup, ScrollArea, Select, SelectChevronsUpDown, SelectContent, SelectItem, SelectLabel, SelectSection, SelectTrigger, SelectValue, Separator, SettingsField, SettingsPage, SettingsRow, SettingsSection, Sheet, SheetBody, SheetCloseButton, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetTitle, SheetTrigger, SideRail, SideRailButton, SideRailContent, SideRailFooter, SideRailHeader, SideRailItem, SideRailSection, SidebarNav, SidebarNavButton, SidebarNavContent, SidebarNavFooter, SidebarNavHeader, SidebarNavItem, SidebarNavSection, SidebarNavTitle, Skeleton, Slider, Spinner, SplitLayout, Stat, StatGroup, StatusBar, StatusBarItem, StatusBarSpacer, StatusChip, StatusList, Switch, SwitchDescription, SwitchLabel, TALL_CODE_BLOCK_PX, Table, TableBody, TableCaption, TableCell, TableFooter, TableHead, TableHeader, TableNumericCell, TableRow, Tabs, TabsContent, TabsList, TabsTrigger, Textarea, ThemeMiniature, ThemeMiniatureSplit, ThemePicker, ThemePreview, ThemeProvider, ThemeSwatch, ThemeToggle, ThreadPanel, Toaster, Toggle, ToggleGroup, ToggleGroupItem, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, TopBar, TopBarBreadcrumb, TopBarPill, TopBarSearch, TopBarSection, TopBarTitle, TranscriptComposition, UpdateDialog, WorkspaceMark, accentPresets, alertVariants, allTokens, badgeVariants, boardCardTitleVariants, builtinThemes, buttonVariants, closePane, cn, colorTokens, computeLayoutFrames, contrastRatio, controlInteractive, controlSize, controlSizeIcon, controlSizes, countLeaves, countLines, createLayoutState, cva, defaultDarkThemeId, defaultLightThemeId, defaultThemeSelection, densityTokens, designTokens, diffLineVariants, diffStats, diffTargetPath, elevationTokens, entityIconVariants, expandAll, findTokenRanges, focusPane, fontOptions, formatBytes, formatReleaseDate, formatToken, initialsFrom, inlineScriptLiteral, isPasteBlock, itemVariants, keyedRows, layoutDepth, listLeaves, monogram, motionTokens, movePane, neighborLeaf, nextSeq, normalizeLayout, parseDiff, plainTextFromMarkdown, pruneBlocks, radiusTokens, recollapsePastes, remapCarriedBlocks, resizeSplit, resolvedDensity, sheetVariants, shouldCollapse, sidebarNavItemClass, sidebarNavItemStateClass, splitPane, statusDotVariants, stripTrailingBlankLines, surfaceInteractive, swapPanes, themeById, themeCssVariables, themeFamilies, themeScript, themesForAppearance, toast, toaster, toggleVariants, tokenRangeAt, transcriptDisclosureKey, typographyTokens, undoClosePane, undocumentedTokenAliases, useSideRail, useTheme, validateTheme, validateThemeRegistry, zIndexTokens };
|
package/dist/r/conversation.json
CHANGED
|
@@ -76,6 +76,21 @@
|
|
|
76
76
|
"path": "src/components/conversation/thread-panel.tsx",
|
|
77
77
|
"type": "registry:ui",
|
|
78
78
|
"target": "components/conversation/thread-panel.tsx"
|
|
79
|
+
},
|
|
80
|
+
{
|
|
81
|
+
"path": "src/components/conversation/transcript-composition.tsx",
|
|
82
|
+
"type": "registry:ui",
|
|
83
|
+
"target": "components/conversation/transcript-composition.tsx"
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
"path": "src/components/conversation/transcript-folding.ts",
|
|
87
|
+
"type": "registry:ui",
|
|
88
|
+
"target": "components/conversation/transcript-folding.ts"
|
|
89
|
+
},
|
|
90
|
+
{
|
|
91
|
+
"path": "src/components/conversation/transcript-grouping.ts",
|
|
92
|
+
"type": "registry:ui",
|
|
93
|
+
"target": "components/conversation/transcript-grouping.ts"
|
|
79
94
|
}
|
|
80
95
|
]
|
|
81
96
|
}
|
package/dist/r/registry.json
CHANGED
|
@@ -1890,6 +1890,21 @@
|
|
|
1890
1890
|
"path": "src/components/conversation/thread-panel.tsx",
|
|
1891
1891
|
"type": "registry:ui",
|
|
1892
1892
|
"target": "components/conversation/thread-panel.tsx"
|
|
1893
|
+
},
|
|
1894
|
+
{
|
|
1895
|
+
"path": "src/components/conversation/transcript-composition.tsx",
|
|
1896
|
+
"type": "registry:ui",
|
|
1897
|
+
"target": "components/conversation/transcript-composition.tsx"
|
|
1898
|
+
},
|
|
1899
|
+
{
|
|
1900
|
+
"path": "src/components/conversation/transcript-folding.ts",
|
|
1901
|
+
"type": "registry:ui",
|
|
1902
|
+
"target": "components/conversation/transcript-folding.ts"
|
|
1903
|
+
},
|
|
1904
|
+
{
|
|
1905
|
+
"path": "src/components/conversation/transcript-grouping.ts",
|
|
1906
|
+
"type": "registry:ui",
|
|
1907
|
+
"target": "components/conversation/transcript-grouping.ts"
|
|
1893
1908
|
}
|
|
1894
1909
|
]
|
|
1895
1910
|
},
|
|
@@ -23,6 +23,23 @@ export {
|
|
|
23
23
|
MessageRow,
|
|
24
24
|
type MessageRowProps,
|
|
25
25
|
} from './message-row'
|
|
26
|
+
export {
|
|
27
|
+
TranscriptComposition,
|
|
28
|
+
transcriptDisclosureKey,
|
|
29
|
+
type TranscriptCompositionProps,
|
|
30
|
+
type TranscriptCompositionFold,
|
|
31
|
+
type TranscriptCompositionRowContext,
|
|
32
|
+
type TranscriptCompositionRendererProps,
|
|
33
|
+
type TranscriptDisplayKind,
|
|
34
|
+
type GroupedTranscript,
|
|
35
|
+
type TranscriptDisplayItem,
|
|
36
|
+
type TranscriptFoldState,
|
|
37
|
+
type TranscriptFoldMode,
|
|
38
|
+
type TranscriptFoldPlan,
|
|
39
|
+
type TranscriptMounting,
|
|
40
|
+
type TranscriptRow,
|
|
41
|
+
type TranscriptTurnItem,
|
|
42
|
+
} from './transcript-composition'
|
|
26
43
|
export {
|
|
27
44
|
AttachmentCard,
|
|
28
45
|
ThreadPanel,
|