@design.estate/dees-catalog 6.0.0 → 6.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/dist_bundle/bundle.js +3105 -1500
  2. package/dist_ts_web/00_commitinfo_data.js +1 -1
  3. package/dist_ts_web/elements/00group-harness/dees-harness-chat/dees-harness-chat.d.ts +2 -0
  4. package/dist_ts_web/elements/00group-harness/dees-harness-chat/dees-harness-chat.demo.js +484 -8
  5. package/dist_ts_web/elements/00group-harness/dees-harness-chat/dees-harness-chat.js +10 -1
  6. package/dist_ts_web/elements/00group-harness/dees-harness-message/dees-harness-message.d.ts +3 -1
  7. package/dist_ts_web/elements/00group-harness/dees-harness-message/dees-harness-message.js +24 -4
  8. package/dist_ts_web/elements/00group-harness/dees-harness-message-list/dees-harness-message-list.d.ts +26 -0
  9. package/dist_ts_web/elements/00group-harness/dees-harness-message-list/dees-harness-message-list.js +398 -94
  10. package/dist_ts_web/elements/00group-harness/dees-harness-overflow-text.d.ts +32 -0
  11. package/dist_ts_web/elements/00group-harness/dees-harness-overflow-text.demo.d.ts +1 -0
  12. package/dist_ts_web/elements/00group-harness/dees-harness-overflow-text.demo.js +31 -0
  13. package/dist_ts_web/elements/00group-harness/dees-harness-overflow-text.js +297 -0
  14. package/dist_ts_web/elements/00group-harness/dees-harness-session-list/dees-harness-session-list.js +1 -9
  15. package/dist_ts_web/elements/00group-harness/dees-harness-session-sidebar/dees-harness-session-sidebar.d.ts +10 -1
  16. package/dist_ts_web/elements/00group-harness/dees-harness-session-sidebar/dees-harness-session-sidebar.js +181 -2
  17. package/dist_ts_web/elements/00group-harness/dees-harness-tool-card/dees-harness-tool-card.d.ts +17 -1
  18. package/dist_ts_web/elements/00group-harness/dees-harness-tool-card/dees-harness-tool-card.js +480 -36
  19. package/dist_ts_web/elements/00group-harness/dees-harness-tool-card/renderers.js +28 -24
  20. package/dist_ts_web/elements/00group-harness/harness.helpers.d.ts +5 -1
  21. package/dist_ts_web/elements/00group-harness/harness.helpers.js +66 -1
  22. package/dist_ts_web/elements/00group-harness/index.d.ts +1 -0
  23. package/dist_ts_web/elements/00group-harness/index.js +2 -1
  24. package/dist_ts_web/elements/00group-harness/interfaces.d.ts +33 -2
  25. package/dist_ts_web/elements/00group-harness/toolregistry.d.ts +4 -0
  26. package/dist_ts_web/elements/00group-harness/toolregistry.js +8 -1
  27. package/package.json +2 -2
  28. package/readme.hints.md +16 -1
  29. package/readme.md +41 -9
  30. package/readme.playbook.md +8 -4
  31. package/ts_web/00_commitinfo_data.ts +1 -1
  32. package/ts_web/elements/00group-harness/dees-harness-chat/dees-harness-chat.demo.ts +490 -7
  33. package/ts_web/elements/00group-harness/dees-harness-chat/dees-harness-chat.ts +9 -0
  34. package/ts_web/elements/00group-harness/dees-harness-message/dees-harness-message.ts +24 -3
  35. package/ts_web/elements/00group-harness/dees-harness-message-list/dees-harness-message-list.ts +397 -84
  36. package/ts_web/elements/00group-harness/dees-harness-overflow-text.demo.ts +31 -0
  37. package/ts_web/elements/00group-harness/dees-harness-overflow-text.ts +236 -0
  38. package/ts_web/elements/00group-harness/dees-harness-session-list/dees-harness-session-list.ts +0 -8
  39. package/ts_web/elements/00group-harness/dees-harness-session-sidebar/dees-harness-session-sidebar.ts +193 -1
  40. package/ts_web/elements/00group-harness/dees-harness-tool-card/dees-harness-tool-card.ts +484 -34
  41. package/ts_web/elements/00group-harness/dees-harness-tool-card/renderers.ts +29 -25
  42. package/ts_web/elements/00group-harness/harness.helpers.ts +68 -1
  43. package/ts_web/elements/00group-harness/index.ts +1 -0
  44. package/ts_web/elements/00group-harness/interfaces.ts +38 -2
  45. package/ts_web/elements/00group-harness/toolregistry.ts +12 -0
package/readme.md CHANGED
@@ -64,7 +64,7 @@ For developers working on this library, please refer to the [UI Components Playb
64
64
  | **Dialogs & Overlays** | [`DeesModal`](#deesmodal), [`DeesContextmenu`](#deescontextmenu), [`DeesSpeechbubble`](#deesspeechbubble), [`DeesWindowlayer`](#deeswindowlayer) |
65
65
  | **Navigation** | [`DeesStepper`](#deesstepper), [`DeesProgressbar`](#deesprogressbar) |
66
66
  | **Workspace / IDE** | [`DeesWorkspace`](#deesworkspace), [`DeesWorkspaceMonaco`](#deesworkspacemonaco), [`DeesWorkspaceDiffEditor`](#deesworkspacediffeditor), [`DeesWorkspaceFiletree`](#deesworkspacefiletree), [`DeesWorkspaceTerminal`](#deesworkspaceterminal), [`DeesWorkspaceTerminalPreview`](#deesworkspaceterminalpreview), [`DeesWorkspaceMarkdown`](#deesworkspacemarkdown), [`DeesWorkspaceMarkdownoutlet`](#deesworkspacemarkdownoutlet), [`DeesWorkspaceBottombar`](#deesworkspacebottombar) |
67
- | **Agentic Chat** | [`DeesHarnessChat`](#deesharnesschat), [`DeesHarnessMessageList`](#deesharnessmessagelist), [`DeesHarnessMessage`](#deesharnessmessage), [`DeesHarnessReasoning`](#deesharnessreasoning), [`DeesHarnessToolCard`](#deesharnesstoolcard), [`DeesHarnessContentBlocks`](#deesharnesscontentblocks), [`DeesHarnessPermissionCard`](#deesharnesspermissioncard), [`DeesHarnessQuestionCard`](#deesharnessquestioncard), [`DeesHarnessComposer`](#deesharnesscomposer), [`DeesHarnessStatus`](#deesharnessstatus), [`DeesHarnessTodos`](#deesharnesstodos), [`DeesHarnessUsage`](#deesharnessusage), [`DeesHarnessSessionSidebar`](#deesharnesssessionsidebar), [`DeesHarnessSessionList`](#deesharnesssessionlist) |
67
+ | **Agentic Chat** | [`DeesHarnessChat`](#deesharnesschat), [`DeesHarnessMessageList`](#deesharnessmessagelist), [`DeesHarnessMessage`](#deesharnessmessage), [`DeesHarnessReasoning`](#deesharnessreasoning), [`DeesHarnessToolCard`](#deesharnesstoolcard), [`DeesHarnessOverflowText`](#deesharnessoverflowtext), [`DeesHarnessContentBlocks`](#deesharnesscontentblocks), [`DeesHarnessPermissionCard`](#deesharnesspermissioncard), [`DeesHarnessQuestionCard`](#deesharnessquestioncard), [`DeesHarnessComposer`](#deesharnesscomposer), [`DeesHarnessStatus`](#deesharnessstatus), [`DeesHarnessTodos`](#deesharnesstodos), [`DeesHarnessUsage`](#deesharnessusage), [`DeesHarnessSessionSidebar`](#deesharnesssessionsidebar), [`DeesHarnessSessionList`](#deesharnesssessionlist) |
68
68
  | **Theming** | [`DeesTheme`](#deestheme), [`DeesUpdater`](#deesupdater) |
69
69
  | **Pre-built Templates** | [`DeesSimpleAppdash`](#deessimpleappdash), [`DeesSimpleLogin`](#deessimplelogin) |
70
70
  | **Shopping** | [`DeesShoppingProductcard`](#deesshoppingproductcard) |
@@ -1788,19 +1788,27 @@ chat.addEventListener('harness-permission-response', (event) => {
1788
1788
  // streaming fast path — mutates the same message object, re-renders only that element
1789
1789
  chat.applyDelta({ type: 'text', messageId: 'm1', delta: 'chunk' });
1790
1790
  chat.applyDelta({ type: 'message-end', messageId: 'm1', usage: { totalTokens: 1200 } });
1791
+
1792
+ // one-level child-session streaming uses the parent tool-message id
1793
+ chat.applyDelta({
1794
+ type: 'text',
1795
+ parentMessageId: 'task-message-1',
1796
+ messageId: 'child-message-1',
1797
+ delta: 'child chunk',
1798
+ });
1791
1799
  ```
1792
1800
 
1793
1801
  Key props: `messages`, `permissions`, `questions`, `status`, `usage`, `todos`/`showTodosPanel`, `sessionMetrics`, `scratchpad`/`scratchpadBusy`/`scratchpadError`, `sessionIntelligenceEnabled`/`intelligenceExchanges`/`intelligenceBusy`/`intelligenceError`, `showSessionSidebar`, `heading`, `subheading`, `showToolbar`, `busy`, `queuedCount`, `disabled`, `model`/`modelOptions`, `reasoningEffort`/`effortOptions`, `mode`/`modeOptions`, `toolRegistry`. The status line renders inside the transcript column (it never pushes between the session panel and the composer), and both the toolbar and the docked composer cast a subtle shadow over the scrolling messages.
1794
1802
 
1795
- A **session side panel** shows Tasks, Tokens, Session Scratchpad, and Session Intelligence next to the transcript. Its sections form a single-open accordion: opening one collapses the others, clicking the open heading collapses all, and each expanded section owns its scrolling while every heading remains visible. Session Intelligence keeps its exchange history scrollable above a docked, chat-style question composer. Set `.todos` explicitly, or leave it empty and the chat derives tasks from the newest todo tool call in `messages`; `showTodosPanel={false}` hides only that section. Unknown token metrics remain absent. The toolbar controls the session panel; host-owned navigation controls belong outside the chat component. In narrow containers the session panel becomes an accessible overlay; when the toolbar is disabled, an inline Session details control keeps it reachable. `showSessionSidebar={false}` disables the complete panel. Methods: `applyDelta()`, `focusComposer()`, `clearComposer()`, `scrollToBottom()`. Events (also from children, all composed): `harness-send`, `harness-steer`, `harness-abort`, `harness-input`, `harness-attachments-change`, `harness-attachment-error`, `harness-model-change`, `harness-mode-change`, `harness-permission-response`, `harness-question-response`, `harness-scratchpad-save`, `harness-session-intelligence-ask`.
1803
+ A **session side panel** shows Tasks, Tools & Subagents, Tokens, Session Scratchpad, and Session Intelligence next to the transcript. Its sections form a single-open accordion: opening one collapses the others, clicking the open heading collapses all, and each expanded section owns its scrolling while every heading remains visible. Tools & Subagents separates active calls from terminal history and derives both directly from top-level tool messages still present in the host's retained transcript window; evicted calls are not cached. Long activity labels and descriptions use a 40px right-edge fade instead of ellipses, reveal the full line on hover, and run through once after the two-second delay when their section has measurable width. Session Intelligence keeps its exchange history scrollable above a docked, chat-style question composer. Set `.todos` explicitly, or leave it empty and the chat derives tasks from the newest todo tool call in `messages`; `showTodosPanel={false}` hides only that section. Unknown token metrics remain absent. The toolbar controls the session panel; host-owned navigation controls belong outside the chat component. In narrow containers the session panel becomes an accessible overlay; when the toolbar is disabled, an inline Session details control keeps it reachable. `showSessionSidebar={false}` disables the complete panel. Methods: `applyDelta()`, `focusComposer()`, `clearComposer()`, `scrollToBottom()`. Events (also from children, all composed): `harness-send`, `harness-steer`, `harness-abort`, `harness-input`, `harness-attachments-change`, `harness-attachment-error`, `harness-model-change`, `harness-mode-change`, `harness-permission-response`, `harness-question-response`, `harness-subtask-open`, `harness-scratchpad-save`, `harness-session-intelligence-ask`.
1796
1804
 
1797
1805
  #### `DeesHarnessMessageList`
1798
1806
 
1799
- Scrollable streaming-safe log. Keyed repeat keeps DOM identity stable; `applyDelta()` routes updates to the affected message element only. Auto-follows the bottom while pinned; otherwise raises a "Jump to latest" chip instead of yanking the scroll. Permission requests and agent questions render inline in the flow, and while pinned the list follows content growth frame-by-frame (ResizeObserver), so a new box growing into place and the scroll move as one motion. Props: `messages`, `permissions`/`permissionsBusy`, `questions`, `status`, `autoFollow`, `showRoles`, `showTimestamps`, `emptyTitle`/`emptyText` (+ `slot="empty"`).
1807
+ Scrollable streaming-safe log. Keyed repeats keep DOM identity stable; `applyDelta()` routes content updates to the affected message element. Consecutive tool calls use one generic responsive-grid pipeline at their chronological position, partitioned by descriptor layout: compact tools share rows with compact tools, subagents share rows only with subagents, and terminal plus file-write cards span a whole row. Columns respond to transcript content width rather than the viewport, and status changes never regroup cards. Untouched projected subtask cards collapse individually on completion with the normal disclosure animation; other cards retain their descriptor or user-selected disclosure state. The grid adds no second summary or collapse layer. Group and card identity survive front-window eviction while any member remains. Auto-follow responds to streamed growth but does not repeatedly repin while a disclosure shrinks. Permission requests, questions, and nested-stream limits behave as before. Props: `messages`, `permissions`/`permissionsBusy`, `questions`, `status`, `autoFollow`, `hideScrollbar`, `fadeScrollEdges`, `showRoles`, `showTimestamps`, `allowSubtaskStreams`, `emptyTitle`/`emptyText` (+ `slot="empty"`).
1800
1808
 
1801
1809
  #### `DeesHarnessMessage`
1802
1810
 
1803
- One message: role accent, markdown (assistant default, `message.markdown` overrides), attachments grid, reasoning parts, streaming cursor, usage/error footer. Markdown renders through `domtools.plugins.smartmarkdown` (GFM, sanitized), throttled to ≥150 ms re-parses while streaming; fenced code is highlighted lazily after the final parse. Streaming methods: `appendTextDelta()`, `appendReasoningDelta()`, `endReasoning()`, `endStream(usage?, error?)`.
1811
+ One message: role accent, markdown (assistant default, `message.markdown` overrides), attachments grid, reasoning parts, streaming cursor, usage/error footer. Markdown renders through `domtools.plugins.smartmarkdown` (GFM, sanitized), throttled to ≥150 ms re-parses while streaming; fenced code is highlighted lazily after the final parse. Streaming methods: `appendTextDelta()`, `appendReasoningDelta()`, `endReasoning()`, `endStream(usage?, error?)`. Direct consumers may set `allowSubtaskStreams` false to suppress nested previews. Subtask drill-in emits the composed `harness-subtask-open` event with `{ sessionId, call }`.
1804
1812
 
1805
1813
  #### `DeesHarnessReasoning`
1806
1814
 
@@ -1808,7 +1816,25 @@ One message: role accent, markdown (assistant default, `message.markdown` overri
1808
1816
 
1809
1817
  #### `DeesHarnessToolCard`
1810
1818
 
1811
- Tool-call card: shared chrome (icon, label, subtitle, status pill, duration, MCP badges) with a per-kind body. Kind resolution goes through `DeesHarnessToolRegistry` (see below); bodies for the seeded kinds — terminal, file-read, file-write (renders a before/after diff via `dees-dataview-codebox` when the input carries previous content), file-delete, dir-list, browser (inline screenshots), http, json, search, subtask, todo, mcp, unknown — live in `renderers.ts`. Long outputs truncate at 6,000 chars with a "Show all" expander. Terminal and error cards open by default.
1819
+ Tool-call card: shared chrome (icon, label, subtitle, status pill, duration, MCP badges) with a per-kind body. Kind resolution goes through `DeesHarnessToolRegistry` (see below); bodies for the seeded kinds — terminal, file-read, file-write (renders a before/after diff via `dees-dataview-codebox` when the input carries previous content), file-delete, dir-list, browser (inline screenshots), http, json, search, subtask, todo, mcp, unknown — live in `renderers.ts`. Overflowing subtitles use a 40px right-edge fade and reveal the full line on hover plus once after a two-second initial delay. Expand/collapse always uses a smooth disclosure transition. Initially closed bodies mount lazily on first expansion, then retain the same DOM and become inert plus `aria-hidden` while closed. Long outputs truncate at 6,000 chars with a "Show all" expander. Terminal and error cards open by default. Terminal calls may provide `exitCode` separately when `output` is one combined process stream; the renderer retains support for `{ stdout, stderr, exitCode }` output objects.
1820
+
1821
+ Subtask calls may carry `subtask: IHarnessSubtaskStream`. While a projected child is busy, its Agent Brief is the leading item inside the same independently scrolling child transcript as its messages, permissions, questions, and status; no extra pinned or boxed brief sits above it. Dynamic 40px edge fades appear at the top only when content exists above and at the bottom only when content exists below, while wheel/touch scrolling remains available without visible scrollbars. Loading and unavailable projections reserve the same stable space. Once the child becomes idle or errored, the live transcript is removed from the card body and the disclosure cleanly renders Agent Brief followed by a scrollbar-free scrolling Result with the same position-aware edge fades; the full transcript remains available through the final bottom-positioned Open subagent chat action. `subtask.sessionId` is authoritative for drill-in when a projection exists; calls without a projection continue to use the existing `childSessionId` field. Authoritatively busy previews open by default and every expanded preview is bounded by `--dees-harness-active-subtask-height` (default `320px`), including its completion transition. The user's local expand/collapse choice wins. Completed subtask cards stay in their subtask-only chronological grid and untouched cards collapse individually without a grid-level summary. Hidden retained previews pause auto-follow observation without unmounting their DOM and catch up to the newest child content when reopened. Set `allowSubtaskStreams` false on a direct tool-card consumer to suppress the preview. The host remains responsible for hydration, transfer limits, authorization, gap recovery, and updating the shared objects; `truncated` projections visibly disclose omitted earlier messages.
1822
+
1823
+ ```typescript
1824
+ taskMessage.toolCall = {
1825
+ id: 'task-call-1',
1826
+ name: 'task',
1827
+ status: 'running',
1828
+ subtask: {
1829
+ sessionId: 'child-session-1',
1830
+ previewState: 'ready',
1831
+ status: { type: 'busy' },
1832
+ messages: childMessages,
1833
+ permissions: childPermissions,
1834
+ questions: childQuestions,
1835
+ },
1836
+ };
1837
+ ```
1812
1838
 
1813
1839
  ```typescript
1814
1840
  import { DeesHarnessToolRegistry } from '@design.estate/dees-catalog';
@@ -1825,8 +1851,14 @@ DeesHarnessToolRegistry.default.register({
1825
1851
 
1826
1852
  `server__tool` names resolve automatically to the MCP kind with server + annotation badges (`readOnlyHint` → success, `destructiveHint` → error, `openWorldHint` → warning). Per-element isolation: assign a forked registry to `.toolRegistry`.
1827
1853
 
1854
+ Descriptors may set `layout: 'compact' | 'full-row' | 'subtask'` to control transcript grid packing; omitted custom descriptors default to `compact`. The built-in terminal and file-write descriptors are `full-row`, while the built-in subtask descriptor uses the isolated `subtask` lane.
1855
+
1828
1856
  Live tool cards use a subtle moving scan while pending or running. When the same call reaches a terminal state, the continuing scan fades toward the normal card and a faster, subtle green success scan or red error scan sweeps across it. Historical calls rendered as already complete do not replay the outcome scan.
1829
1857
 
1858
+ #### `DeesHarnessOverflowText`
1859
+
1860
+ Reusable single-line harness text for constrained headers and activity rows. Slotted text is measured against the component's actual flex/grid width. Only true overflow receives the 40px right-edge fade; short text remains fully opaque. Overflowing text reveals its complete line on hover and once after the initial two-second delay, with reduced-motion preferences respected. Props: `fadeWidthPx` (default `40`) and `introDelayMs` (default `2000`).
1861
+
1830
1862
  #### `DeesHarnessContentBlocks`
1831
1863
 
1832
1864
  Renders MCP `CallToolResult` content structurally: text, base64 images, audio with controls, embedded text resources, downloadable blob resources, and `resource_link` cards.
@@ -1843,7 +1875,7 @@ A question the agent asks mid-run: option buttons with descriptions (single-sele
1843
1875
 
1844
1876
  #### `DeesHarnessComposer`
1845
1877
 
1846
- Prompt input: autogrow textarea, attachment picker/paste/drag-drop with per-file (10 MB) and total (30 MB) limits and MIME allowlist, optional model + reasoning-effort dropdowns, Cmd/Ctrl+Enter to send. Controlled component — the host owns `value` and `attachments`.
1878
+ Prompt input: autogrow textarea, attachment picker/paste/drag-drop with per-file (10 MB) and total (30 MB) limits, image/text/binary classification, optional model + reasoning-effort dropdowns, Cmd/Ctrl+Enter to send. Controlled component — the host owns `value` and `attachments`.
1847
1879
 
1848
1880
  While `busy`, Stop renders as an additional button and Send stays available so hosts can queue messages. With an empty prompt and `queuedCount > 0`, the primary action becomes **Steer now** (`harness-steer` event) to force the agent to continue with the queued messages immediately.
1849
1881
 
@@ -1863,15 +1895,15 @@ Token usage chip (`in · out · total`, `compact` shows the total only); cache r
1863
1895
 
1864
1896
  #### `DeesHarnessSessionSidebar`
1865
1897
 
1866
- Generic session-detail panel that composes the existing task list with optional Tokens, Session Scratchpad, and Session Intelligence sections. Headings stay fixed in a single-open accordion; Session Intelligence splits its expanded body into independently scrolling history and a docked question composer. The host supplies `IHarnessSessionMetrics`, `IHarnessScratchpad`, and `IHarnessIntelligenceExchange[]`; the component never loads or persists data itself. Context percentage and its progress bar render only when both `currentContextTokens` and a positive `maxContextTokens` are present.
1898
+ Generic session-detail panel that composes Tasks, Tools & Subagents, Tokens, Session Scratchpad, and Session Intelligence sections. Headings stay fixed in a single-open accordion; Session Intelligence splits its expanded body into independently scrolling history and a docked question composer. Set `.toolMessages` to top-level tool messages from the currently retained transcript window and `.toolRegistry` for matching labels/icons; active subagents use authoritative child status, and removed messages disappear without a second history cache. The host also supplies `IHarnessSessionMetrics`, `IHarnessScratchpad`, and `IHarnessIntelligenceExchange[]`; the component never loads or persists data itself. Context percentage and its progress bar render only when both `currentContextTokens` and a positive `maxContextTokens` are present.
1867
1899
 
1868
1900
  Scratchpad edits emit `harness-scratchpad-save` with `{ text, expectedRevision }`. A newer incoming revision preserves a dirty local draft and offers explicit **Discard draft** and **Keep draft on latest** actions before saving can continue. Intelligence questions emit `harness-session-intelligence-ask` with `{ question }`; exchanges and busy/error states remain host-controlled.
1869
1901
 
1870
1902
  #### `DeesHarnessSessionList`
1871
1903
 
1872
- Searchable, card-based conversation column for sidebars or a `DeesModal` (`harness-session-select` on click, `harness-session-open` on double-click/Enter). Cards are collapsed by default, expose an independent accessible expansion control, and auto-expand only when an already-rendered session changes from not working to `working: true`. Selection does not affect expansion.
1904
+ Searchable, card-based conversation column for sidebars or a `DeesModal` (`harness-session-select` on click, `harness-session-open` on double-click/Enter). Cards stay collapsed until their independent accessible expansion control is used. Selection and working-state changes do not affect expansion.
1873
1905
 
1874
- `IHarnessSessionMeta.state` accepts `normal`, `working`, `finished`, `attention`, or `error`; `working` remains an independent activity signal for expansion transitions. With `enableGrouping`, sortable cards can move within and between groups. Drag from a card's focusable grip, or use its ArrowUp, ArrowDown, Home, and End keys. Pointer dragging moves a full-card preview, opens a matching drop slot, and animates surrounding cards; `harness-session-move` includes both the compatibility `index` and a stable optional `beforeSessionId` anchor. Set `draggable: false` for pinned entries such as terminals. Pass `ungroupedSessionIds` to control the order outside groups; omitted or unknown entries fall back to recency order.
1906
+ `IHarnessSessionMeta.state` accepts `normal`, `working`, `finished`, `attention`, or `error`; `working` remains an independent activity signal and does not change card expansion. With `enableGrouping`, sortable cards can move within and between groups. Drag from a card's focusable grip, or use its ArrowUp, ArrowDown, Home, and End keys. Pointer dragging moves a full-card preview, opens a matching drop slot, and animates surrounding cards; `harness-session-move` includes both the compatibility `index` and a stable optional `beforeSessionId` anchor. Set `draggable: false` for pinned entries such as terminals. Pass `ungroupedSessionIds` to control the order outside groups; omitted or unknown entries fall back to recency order.
1875
1907
 
1876
1908
  ---
1877
1909
 
@@ -436,11 +436,15 @@ private updateBlockContent(blockId: string, content: string) {
436
436
 
437
437
  Components that render continuously arriving data (agent chat, logs) follow the harness pattern from `00group-harness`:
438
438
 
439
- - **Props are the source of truth; deltas are the fast path.** The host owns the array (e.g. `.messages`). Incremental updates go through `applyDelta()`, which mutates the same object instance held in the array and calls `requestUpdate()` on the one affected child element. A later wholesale re-assignment of the array is therefore idempotent — no divergence between streamed and re-set state.
439
+ - **Props are the source of truth; deltas are the fast path.** The host owns the array (e.g. `.messages`). Incremental updates go through `applyDelta()`, which mutates the same object instance held in the array and normally calls `requestUpdate()` on the one affected child element. Top-level tool updates also refresh derived activity. A later wholesale re-assignment of the array is therefore idempotent — no divergence between streamed and re-set state.
440
440
  - **Keyed `repeat` for identity.** List children render via `directives.repeat` keyed by a stable id so streaming never recreates sibling DOM (which would drop scroll position, expansion state, and selection).
441
441
  - **Cheap while streaming, rich when done.** While `streaming` is set, text renders as pre-wrap with a cursor; expensive work (markdown parse) is throttled (≥150 ms, token-guarded like the codebox highlight pattern) and syntax highlighting waits for the final parse.
442
- - **Scroll follow with user override.** Auto-scroll only when the user is already pinned to the bottom (`scrollHeight - scrollTop - clientHeight < threshold`); otherwise show a "jump to latest" chip. While pinned, a content change opens a short follow window and a `ResizeObserver` on the scroll content re-pins the bottom on every layout change (post-layout, pre-paint), so a growing box and the scroll move as one motion; an external upward scroll ends the window before the next pin so following never fights the user. Disconnect the observer in `disconnectedCallback`.
443
- - **Interaction state lives on the child.** Expand/collapse (reasoning, tool cards) is element-local state seeded from data (`expanded ?? isStreaming`), so parent re-renders can't reset what the user opened.
442
+ - **Scroll follow with user override.** Auto-scroll only when the user is already pinned to the bottom (`scrollHeight - scrollTop - clientHeight < threshold`); otherwise show a "jump to latest" chip. Intent-based following remains active until explicit user scroll intent, while deferred frame checks and the `ResizeObserver` re-pin only when the scroll content grows. Streamed growth and the scroll therefore move as one motion without treating disclosure shrink as new content. Disconnect the observer and clear its size baseline in `disconnectedCallback`; retained hidden nested transcripts disable auto-follow observation until reopened.
443
+ - **Interaction state lives on the child.** Expand/collapse (reasoning, tool cards) is element-local state seeded from streaming state, descriptor defaults, errors, and authoritative subtask status; once the user toggles it, parent re-renders cannot reset that choice.
444
+ - **Nested streams replace authoritatively, then delta in place.** A subtask preview arrives through the parent tool call as a complete bounded snapshot. Existing child messages may then receive one-level deltas addressed by `parentMessageId`; a delta never invents a missing child message. The producer adds that message to its source-of-truth snapshot first.
445
+ - **Visual grouping never changes ownership.** Consecutive tool calls use one generic chronological grid pipeline partitioned by registry layout metadata: compact tools share compact rows, subagents share only subtask rows, and full-row tools span every column. Each segment's nested repeat remains keyed by message id. Status changes never move a card to another owner; untouched projected subtasks collapse individually while the grid remains in place. Group ids remain unique through segment splits/merges and survive front-window eviction as long as one card remains.
446
+ - **Disclosure animation is lazy and retained.** A collapsed tool body is not mounted until first use. Its first open starts from a painted closed state; later opens and closes animate the same body node, which is inert and aria-hidden while collapsed.
447
+ - **Inline recursion is explicit and bounded.** The outer list may render subtask previews; nested lists set `allowSubtaskStreams` false. Full descendant sessions remain reachable through the drill-in event rather than recursively expanding the transcript.
444
448
 
445
449
  ## Performance Optimization
446
450
 
@@ -813,4 +817,4 @@ This playbook represents the collective wisdom and patterns found in the @design
813
817
  - **Theme-aware**: Supporting light and dark modes
814
818
  - **Well-integrated**: Working seamlessly with the component ecosystem
815
819
 
816
- Remember: When in doubt, look at existing components for examples. The codebase itself is the best documentation of these patterns in action.
820
+ Remember: When in doubt, look at existing components for examples. The codebase itself is the best documentation of these patterns in action.
@@ -3,6 +3,6 @@
3
3
  */
4
4
  export const commitinfo = {
5
5
  name: '@design.estate/dees-catalog',
6
- version: '6.0.0',
6
+ version: '6.2.0',
7
7
  description: 'A comprehensive library that provides dynamic web components for building sophisticated and modern web applications using JavaScript and TypeScript.'
8
8
  }