@design.estate/dees-catalog 6.8.2 → 6.9.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.
@@ -210,7 +210,7 @@ export interface IHarnessToolCall {
210
210
  isError?: boolean;
211
211
  errorText?: string;
212
212
  mcp?: IHarnessMcpMeta;
213
- /** Session spawned by this call (subagent/task tools); enables drill-in. */
213
+ /** Session spawned by this call (delegate/subagent tools); enables drill-in. */
214
214
  childSessionId?: string;
215
215
  /** Bounded live preview of the spawned session. Consumers own hydration. */
216
216
  subtask?: IHarnessSubtaskStream;
@@ -412,6 +412,11 @@ export interface IHarnessComposerOption {
412
412
  label: string;
413
413
  value: string;
414
414
  }
415
+ export interface IHarnessComposerSuggestion {
416
+ label: string;
417
+ value: string;
418
+ description?: string;
419
+ }
415
420
  export interface IHarnessAccountChangeDetail {
416
421
  account: string;
417
422
  }
@@ -120,7 +120,7 @@ const defaultDescriptors = [
120
120
  },
121
121
  {
122
122
  kind: 'subtask',
123
- names: ['task', 'subagent'],
123
+ names: ['delegate', 'subagent'],
124
124
  label: 'Subagent',
125
125
  icon: 'lucide:Bot',
126
126
  // The child's model belongs in the collapsed header: a subagent often
@@ -142,6 +142,16 @@ const defaultDescriptors = [
142
142
  subtitle: (call) => inputField(call, 'question') || inputField(call, 'prompt') || harnessSummaryLine(call.input),
143
143
  defaultExpanded: true,
144
144
  },
145
+ {
146
+ kind: 'project-task',
147
+ names: ['task'],
148
+ label: 'Project task',
149
+ icon: 'lucide:ListChecks',
150
+ subtitle: (call) => {
151
+ const action = inputField(call, 'action');
152
+ return action ? `Action: ${action}` : harnessSummaryLine(call.input);
153
+ },
154
+ },
145
155
  {
146
156
  kind: 'todo',
147
157
  names: ['todowrite', 'todo_write', 'todoread'],
@@ -247,4 +257,4 @@ export class DeesHarnessToolRegistry {
247
257
  return new DeesHarnessToolRegistry(this.descriptors.map((descriptor) => ({ ...descriptor })));
248
258
  }
249
259
  }
250
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9vbHJlZ2lzdHJ5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdHNfd2ViL2VsZW1lbnRzLzAwZ3JvdXAtaGFybmVzcy90b29scmVnaXN0cnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFFLGVBQWUsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBc0QzRSxxRUFBcUU7QUFDckUsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFHLENBQzFCLE9BQWUsRUFDdUMsRUFBRTtJQUN4RCxNQUFNLGNBQWMsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzdDLElBQUksY0FBYyxJQUFJLENBQUMsSUFBSSxjQUFjLElBQUksT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFDbEYsT0FBTztRQUNMLFVBQVUsRUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxjQUFjLENBQUM7UUFDNUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsY0FBYyxHQUFHLENBQUMsQ0FBQztLQUM1QyxDQUFDO0FBQ0osQ0FBQyxDQUFDO0FBRUYsTUFBTSxVQUFVLEdBQUcsQ0FBQyxJQUFzQixFQUFFLEdBQVcsRUFBVSxFQUFFO0lBQ2pFLE9BQU8sZUFBZSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssUUFBUTtRQUN2RSxDQUFDLENBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQVk7UUFDN0IsQ0FBQyxDQUFDLEVBQUUsQ0FBQztBQUNULENBQUMsQ0FBQztBQUVGLE1BQU0sUUFBUSxHQUFHLENBQUMsSUFBc0IsRUFBRSxHQUFXLEVBQVcsRUFBRTtJQUNoRSxPQUFPLGVBQWUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUks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
260
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9vbHJlZ2lzdHJ5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdHNfd2ViL2VsZW1lbnRzLzAwZ3JvdXAtaGFybmVzcy90b29scmVnaXN0cnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFFLGVBQWUsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBc0QzRSxxRUFBcUU7QUFDckUsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFHLENBQzFCLE9BQWUsRUFDdUMsRUFBRTtJQUN4RCxNQUFNLGNBQWMsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzdDLElBQUksY0FBYyxJQUFJLENBQUMsSUFBSSxjQUFjLElBQUksT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFDbEYsT0FBTztRQUNMLFVBQVUsRUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxjQUFjLENBQUM7UUFDNUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsY0FBYyxHQUFHLENBQUMsQ0FBQztLQUM1QyxDQUFDO0FBQ0osQ0FBQyxDQUFDO0FBRUYsTUFBTSxVQUFVLEdBQUcsQ0FBQyxJQUFzQixFQUFFLEdBQVcsRUFBVSxFQUFFO0lBQ2pFLE9BQU8sZUFBZSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssUUFBUTtRQUN2RSxDQUFDLENBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQVk7UUFDN0IsQ0FBQyxDQUFDLEVBQUUsQ0FBQztBQUNULENBQUMsQ0FBQztBQUVGLE1BQU0sUUFBUSxHQUFHLENBQUMsSUFBc0IsRUFBRSxHQUFXLEVBQVcsRUFBRTtJQUNoRSxPQUFPLGVBQWUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUks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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@design.estate/dees-catalog",
3
- "version": "6.8.2",
3
+ "version": "6.9.1",
4
4
  "private": false,
5
5
  "description": "A comprehensive library that provides dynamic web components for building sophisticated and modern web applications using JavaScript and TypeScript.",
6
6
  "main": "dist_ts_web/index.js",
package/readme.md CHANGED
@@ -1782,6 +1782,18 @@ chat.accountOptions = [
1782
1782
  ];
1783
1783
  chat.modelOptions = ['gpt-5.5', 'o4-mini'];
1784
1784
  chat.effortOptions = ['high', 'medium', 'low'];
1785
+ const commandSuggestions = [
1786
+ { label: 'Explain code', value: 'Explain the selected code' },
1787
+ { label: 'Review diff', value: 'Review the current diff', description: 'Focus on bugs and regressions.' },
1788
+ ];
1789
+ chat.suggestions = commandSuggestions;
1790
+
1791
+ chat.addEventListener('harness-input', (event) => {
1792
+ const value = event.detail.value;
1793
+ chat.suggestions = value.startsWith('/')
1794
+ ? commandSuggestions.filter((suggestion) => suggestion.label.toLowerCase().includes(value.slice(1).toLowerCase()))
1795
+ : [];
1796
+ });
1785
1797
 
1786
1798
  chat.addEventListener('harness-send', (event) => {
1787
1799
  const { text, attachments, account, model, reasoningEffort } = event.detail;
@@ -1803,7 +1815,7 @@ chat.applyDelta({
1803
1815
  });
1804
1816
  ```
1805
1817
 
1806
- Key props: `messages`, `permissions`, `questions`, `status`, `usage`, `todos`/`showTodosPanel`, `sessionMetrics`, `scratchpad`/`scratchpadBusy`/`scratchpadError`, `sessionIntelligenceEnabled`/`intelligenceExchanges`/`intelligenceBusy`/`intelligenceError`, `showSessionSidebar`, `heading`, `subheading`, `showToolbar`, `busy`, `queuedCount`, `disabled`, `account`/`accountOptions`, `model`/`modelOptions`, `reasoningEffort`/`effortOptions`, `mode`/`modeOptions`, `toolRegistry`. Account options use human-readable `label` values and opaque stable `value` identifiers. 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.
1818
+ Key props: `messages`, `permissions`, `questions`, `status`, `usage`, `todos`/`showTodosPanel`, `sessionMetrics`, `scratchpad`/`scratchpadBusy`/`scratchpadError`, `sessionIntelligenceEnabled`/`intelligenceExchanges`/`intelligenceBusy`/`intelligenceError`, `showSessionSidebar`, `heading`, `subheading`, `showToolbar`, `busy`, `queuedCount`, `disabled`, `suggestions`, `account`/`accountOptions`, `model`/`modelOptions`, `reasoningEffort`/`effortOptions`, `mode`/`modeOptions`, `toolRegistry`. `suggestions` is forwarded unchanged to the controlled composer. Account options use human-readable `label` values and opaque stable `value` identifiers. 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.
1807
1819
 
1808
1820
  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. Collapsed sections retain their region wrapper but omit the content subtree until expansion; sidebar-owned scratchpad and intelligence drafts survive that lazy remount. 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-account-change`, `harness-model-change`, `harness-mode-change`, `harness-permission-response`, `harness-question-response`, `harness-subtask-open`, `harness-scratchpad-save`, `harness-session-intelligence-ask`.
1809
1821
 
@@ -1823,14 +1835,14 @@ One message: role accent, markdown (assistant default, `message.markdown` overri
1823
1835
 
1824
1836
  #### `DeesHarnessToolCard`
1825
1837
 
1826
- 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`. File-write cards retain the user's inline/split choice while the same call updates. Numeric patch hunks preserve their source line numbers; patches and replacement snippets without coordinates hide gutters rather than presenting fabricated positions. 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 output uses a black inner log surface and follows the live tail after reaching the card-height cap. Scrolling upward detaches the tail; leaving the card returns to the bottom after five seconds, while re-entering cancels that pending return. Terminal calls may provide `exitCode` separately when `output` is one combined process stream; the renderer retains support for `{ stdout, stderr, exitCode }` output objects.
1838
+ 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, project-task, todo, mcp, unknown — live in `renderers.ts`. File-write cards retain the user's inline/split choice while the same call updates. Numeric patch hunks preserve their source line numbers; patches and replacement snippets without coordinates hide gutters rather than presenting fabricated positions. 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 output uses a black inner log surface and follows the live tail after reaching the card-height cap. Scrolling upward detaches the tail; leaving the card returns to the bottom after five seconds, while re-entering cancels that pending return. Terminal calls may provide `exitCode` separately when `output` is one combined process stream; the renderer retains support for `{ stdout, stderr, exitCode }` output objects.
1827
1839
 
1828
1840
  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.
1829
1841
 
1830
1842
  ```typescript
1831
- taskMessage.toolCall = {
1832
- id: 'task-call-1',
1833
- name: 'task',
1843
+ delegateMessage.toolCall = {
1844
+ id: 'delegate-call-1',
1845
+ name: 'delegate',
1834
1846
  status: 'running',
1835
1847
  subtask: {
1836
1848
  sessionId: 'child-session-1',
@@ -1860,7 +1872,7 @@ Custom tool renderers receive `IHarnessToolRenderHelpers`. Its `diffBlock(before
1860
1872
 
1861
1873
  `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`.
1862
1874
 
1863
- 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.
1875
+ 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 `delegate` and `subagent` tools use the isolated `subtask` lane. The built-in `task` tool uses compact project-task presentation and prefers authoritative `{ tasks }`, `{ task }`, or `{ state: { tasks } }` output; unsupported task statuses remain visible as raw output instead of being normalized. `todowrite`, `todo_write`, and `todoread` retain todo presentation.
1864
1876
 
1865
1877
  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.
1866
1878
 
@@ -1884,7 +1896,9 @@ A question the agent asks mid-run: option buttons with descriptions (single-sele
1884
1896
 
1885
1897
  #### `DeesHarnessComposer`
1886
1898
 
1887
- Prompt input: autogrow textarea, attachment picker/paste/drag-drop with configurable `maxAttachmentCount`, `maxAttachmentBytes` (10 MB default), and `maxTotalAttachmentBytes` (30 MB default), image/text/binary classification, optional account, model, and reasoning-effort dropdowns, Cmd/Ctrl+Enter to send. Attachment count is unlimited unless the host sets it. `dees-harness-chat` forwards all three limits to its composer. Controlled component — the host owns `value`, `attachments`, `account`, and the other selections. Set `accountOptions` to `{ label, value }[]` so the dropdown displays readable labels while events retain opaque stable account values. Account changes emit `harness-account-change` with `{ account }`; `harness-send` includes optional `account` alongside `model` and `reasoningEffort`.
1899
+ Prompt input: autogrow textarea, attachment picker/paste/drag-drop with configurable `maxAttachmentCount`, `maxAttachmentBytes` (10 MB default), and `maxTotalAttachmentBytes` (30 MB default), image/text/binary classification, optional account, model, and reasoning-effort dropdowns, Cmd/Ctrl+Enter to send. Attachment count is unlimited unless the host sets it. `dees-harness-chat` forwards all three limits and `suggestions` to its composer. Controlled component — the host owns `value`, `attachments`, `suggestions`, `account`, and the other selections. Set `accountOptions` to `{ label, value }[]` so the dropdown displays readable labels while events retain opaque stable account values. Account changes emit `harness-account-change` with `{ account }`; `harness-send` includes optional `account` alongside `model` and `reasoningEffort`.
1900
+
1901
+ Set `suggestions` to `IHarnessComposerSuggestion[]`, where each item is `{ label, value, description? }`. The composer does not filter or generate suggestions: listen for `harness-input`, update the controlled `value`, and provide a fresh filtered array. While the textarea owns focus, the listbox stays anchored above the composer; moving focus to another control closes it. Arrow keys wrap through rows, Enter chooses the active row, and Escape dismisses the current list until the next text input or fresh suggestions array. Choosing a row sets `value` to the suggestion's `value` and emits the existing bubbling/composed `harness-input` event; it does not emit `harness-send`.
1888
1902
 
1889
1903
  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.
1890
1904
 
@@ -3,6 +3,6 @@
3
3
  */
4
4
  export const commitinfo = {
5
5
  name: '@design.estate/dees-catalog',
6
- version: '6.8.2',
6
+ version: '6.9.1',
7
7
  description: 'A comprehensive library that provides dynamic web components for building sophisticated and modern web applications using JavaScript and TypeScript.'
8
8
  }
@@ -260,7 +260,7 @@ const createSubagentWave = (
260
260
  createdAt: now + index,
261
261
  toolCall: {
262
262
  id: `demo-${runId}-wave-${waveNumber}-call-${index + 1}`,
263
- name: 'task',
263
+ name: 'delegate',
264
264
  status: 'running' as const,
265
265
  input: { description: scenario.description },
266
266
  childSessionId,
@@ -14,6 +14,7 @@ import type {
14
14
  IHarnessAccountChangeDetail,
15
15
  IHarnessAttachment,
16
16
  IHarnessComposerOption,
17
+ IHarnessComposerSuggestion,
17
18
  IHarnessMessage,
18
19
  IHarnessPermissionRequest,
19
20
  IHarnessQuestionRequest,
@@ -154,6 +155,9 @@ export class DeesHarnessChat extends DeesElement {
154
155
  @property({ attribute: false })
155
156
  accessor attachments: IHarnessAttachment[] = [];
156
157
 
158
+ @property({ attribute: false })
159
+ accessor suggestions: IHarnessComposerSuggestion[] = [];
160
+
157
161
  @property({ type: Number })
158
162
  accessor maxAttachmentCount: number = Number.POSITIVE_INFINITY;
159
163
 
@@ -659,6 +663,7 @@ export class DeesHarnessChat extends DeesElement {
659
663
  docked
660
664
  .value=${this.composerValue}
661
665
  .attachments=${this.attachments}
666
+ .suggestions=${this.suggestions}
662
667
  .maxAttachmentCount=${this.maxAttachmentCount}
663
668
  .maxAttachmentBytes=${this.maxAttachmentBytes}
664
669
  .maxTotalAttachmentBytes=${this.maxTotalAttachmentBytes}
@@ -6,6 +6,7 @@ import {
6
6
  customElement,
7
7
  type TemplateResult,
8
8
  property,
9
+ state,
9
10
  cssManager,
10
11
  } from '@design.estate/dees-element';
11
12
  import { themeDefaultStyles } from '../../00theme.js';
@@ -13,6 +14,7 @@ import type {
13
14
  IHarnessAttachment,
14
15
  IHarnessComposerOption,
15
16
  IHarnessComposerSendDetail,
17
+ IHarnessComposerSuggestion,
16
18
  } from '../interfaces.js';
17
19
  import {
18
20
  harnessFileToBase64,
@@ -40,6 +42,8 @@ const toDropdownOptions = (values: string[]): TDropdownOption[] =>
40
42
  const toLabeledDropdownOptions = (values: IHarnessComposerOption[]): TDropdownOption[] =>
41
43
  values.map((value) => ({ option: value.label, key: value.value }));
42
44
 
45
+ let nextSuggestionListId = 0;
46
+
43
47
  /**
44
48
  * Prompt composer: autogrow textarea, attachments (picker / paste /
45
49
  * drag-drop with per-file and total size limits), optional account, model,
@@ -47,7 +51,7 @@ const toLabeledDropdownOptions = (values: IHarnessComposerOption[]): TDropdownOp
47
51
  * additional button and Send stays available for queueing; an empty prompt
48
52
  * with queued messages offers "Steer now".
49
53
  *
50
- * Controlled component: `value` and `attachments` are owned by the host;
54
+ * Controlled component: `value`, `attachments`, and `suggestions` are owned by the host;
51
55
  * the composer emits `harness-input`, `harness-attachments-change`,
52
56
  * `harness-attachment-error`, `harness-account-change`, `harness-model-change`, `harness-send`,
53
57
  * `harness-steer`, and `harness-abort` (all bubbling + composed).
@@ -91,6 +95,21 @@ export class DeesHarnessComposer extends DeesElement {
91
95
  @property({ attribute: false })
92
96
  accessor attachments: IHarnessAttachment[] = [];
93
97
 
98
+ @property({ attribute: false })
99
+ accessor suggestions: IHarnessComposerSuggestion[] = [];
100
+
101
+ @state()
102
+ private accessor activeSuggestionIndex: number = -1;
103
+
104
+ @state()
105
+ private accessor suggestionsDismissed: boolean = false;
106
+
107
+ @state()
108
+ private accessor promptFocused: boolean = false;
109
+
110
+ private composing: boolean = false;
111
+ private readonly suggestionListId = `dees-harness-composer-suggestions-${++nextSuggestionListId}`;
112
+
94
113
  @property({ type: Number })
95
114
  accessor maxAttachmentBytes: number = harnessMaxAttachmentBytes;
96
115
 
@@ -141,6 +160,69 @@ export class DeesHarnessComposer extends DeesElement {
141
160
  container-type: inline-size;
142
161
  }
143
162
 
163
+ .composerShell {
164
+ position: relative;
165
+ min-width: 0;
166
+ }
167
+
168
+ .suggestionList {
169
+ position: absolute;
170
+ z-index: 2;
171
+ inset-inline: 0;
172
+ bottom: calc(100% + var(--dees-spacing-xs));
173
+ box-sizing: border-box;
174
+ max-height: min(240px, 35dvh);
175
+ margin: 0;
176
+ padding: var(--dees-spacing-xs);
177
+ overflow-x: hidden;
178
+ overflow-y: auto;
179
+ overscroll-behavior: contain;
180
+ list-style: none;
181
+ border: 1px solid var(--dees-color-border-subtle);
182
+ border-radius: var(--dees-radius-xl);
183
+ corner-shape: var(--dees-corner-shape);
184
+ background: var(--dees-color-bg-primary);
185
+ box-shadow: var(--dees-shadow-up-sm);
186
+ }
187
+
188
+ .suggestionOption {
189
+ display: grid;
190
+ align-content: center;
191
+ box-sizing: border-box;
192
+ min-width: 0;
193
+ min-height: 44px;
194
+ padding: var(--dees-spacing-xs) var(--dees-spacing-sm);
195
+ border-radius: var(--dees-radius-lg);
196
+ corner-shape: var(--dees-corner-shape);
197
+ color: var(--dees-color-text-primary);
198
+ cursor: pointer;
199
+ touch-action: manipulation;
200
+ }
201
+
202
+ .suggestionOption:hover,
203
+ .suggestionOption.active {
204
+ background: var(--dees-color-fill-secondary);
205
+ }
206
+
207
+ .suggestionLabel {
208
+ min-width: 0;
209
+ overflow: hidden;
210
+ font-size: var(--dees-font-control-size, 13px);
211
+ font-weight: 600;
212
+ line-height: 1.35;
213
+ text-overflow: ellipsis;
214
+ white-space: nowrap;
215
+ }
216
+
217
+ .suggestionDescription {
218
+ min-width: 0;
219
+ margin-top: 2px;
220
+ color: var(--dees-color-text-secondary);
221
+ font-size: var(--dees-font-caption1-size, 11px);
222
+ line-height: 1.35;
223
+ overflow-wrap: anywhere;
224
+ }
225
+
144
226
  .composer {
145
227
  display: grid;
146
228
  gap: var(--dees-spacing-sm);
@@ -365,18 +447,31 @@ export class DeesHarnessComposer extends DeesElement {
365
447
 
366
448
  public clear(): void {
367
449
  this.value = '';
450
+ this.resetSuggestionInteraction();
368
451
  this.emitInput('');
369
452
  this.autogrow();
370
453
  }
371
454
 
455
+ public willUpdate(changedProperties: Map<PropertyKey, unknown>): void {
456
+ super.willUpdate(changedProperties);
457
+ if (changedProperties.has('suggestions')) this.resetSuggestionInteraction();
458
+ }
459
+
460
+ public updated(changedProperties: Map<PropertyKey, unknown>): void {
461
+ super.updated(changedProperties);
462
+ this.syncTextareaSuggestionAria();
463
+ }
464
+
372
465
  public render(): TemplateResult {
373
466
  return html`
374
- <div
375
- class="composer"
376
- @dragover=${this.handleDragOver}
377
- @dragleave=${this.handleDragLeave}
378
- @drop=${this.handleDrop}
379
- >
467
+ <div class="composerShell">
468
+ ${this.suggestionsVisible ? this.renderSuggestions() : ''}
469
+ <div
470
+ class="composer"
471
+ @dragover=${this.handleDragOver}
472
+ @dragleave=${this.handleDragLeave}
473
+ @drop=${this.handleDrop}
474
+ >
380
475
  <input
381
476
  class="fileInput"
382
477
  type="file"
@@ -392,11 +487,16 @@ export class DeesHarnessComposer extends DeesElement {
392
487
  : ''}
393
488
  <textarea
394
489
  .value=${this.value}
490
+ aria-label="Message"
395
491
  placeholder=${this.placeholder}
396
492
  ?disabled=${this.disabled}
397
493
  rows="1"
398
494
  @input=${this.handleTextInput}
399
495
  @keydown=${this.handleKeydown}
496
+ @focus=${this.handlePromptFocus}
497
+ @blur=${this.handlePromptBlur}
498
+ @compositionstart=${this.handleCompositionStart}
499
+ @compositionend=${this.handleCompositionEnd}
400
500
  @paste=${this.handlePaste}
401
501
  ></textarea>
402
502
  <div class="controlsRow">
@@ -507,11 +607,42 @@ export class DeesHarnessComposer extends DeesElement {
507
607
  Send
508
608
  </dees-button>
509
609
  `}
610
+ </div>
510
611
  </div>
511
612
  </div>
512
613
  `;
513
614
  }
514
615
 
616
+ private renderSuggestions(): TemplateResult {
617
+ return html`
618
+ <ul
619
+ id=${this.suggestionListId}
620
+ class="suggestionList"
621
+ role="listbox"
622
+ aria-label="Suggestions"
623
+ @pointerdown=${this.handleSuggestionPointerDown}
624
+ >
625
+ ${this.suggestions.map((suggestion, index) => html`
626
+ <li
627
+ id=${this.suggestionOptionId(index)}
628
+ class=${`suggestionOption ${index === this.activeSuggestionIndex ? 'active' : ''}`}
629
+ role="option"
630
+ aria-selected=${String(index === this.activeSuggestionIndex)}
631
+ @pointerenter=${() => {
632
+ this.activeSuggestionIndex = index;
633
+ }}
634
+ @click=${() => void this.selectSuggestion(index)}
635
+ >
636
+ <span class="suggestionLabel">${suggestion.label}</span>
637
+ ${suggestion.description
638
+ ? html`<span class="suggestionDescription">${suggestion.description}</span>`
639
+ : ''}
640
+ </li>
641
+ `)}
642
+ </ul>
643
+ `;
644
+ }
645
+
515
646
  private renderChip(attachment: IHarnessAttachment): TemplateResult {
516
647
  const imageUrl = attachment.kind === 'image' && attachment.dataBase64
517
648
  ? `data:${attachment.mediaType};base64,${attachment.dataBase64}`
@@ -541,16 +672,42 @@ export class DeesHarnessComposer extends DeesElement {
541
672
 
542
673
  private handleTextInput = (event: Event): void => {
543
674
  this.value = (event.currentTarget as HTMLTextAreaElement).value;
675
+ this.resetSuggestionInteraction();
544
676
  this.emitInput(this.value);
545
677
  this.autogrow();
546
678
  };
547
679
 
548
680
  private handleKeydown = (event: KeyboardEvent): void => {
681
+ if (event.isComposing || this.composing) return;
549
682
  if (event.key === 'Enter' && (event.metaKey || event.ctrlKey)) {
550
683
  event.preventDefault();
551
684
  this.send();
552
685
  return;
553
686
  }
687
+ if (this.suggestionsVisible) {
688
+ if (event.key === 'Escape') {
689
+ event.preventDefault();
690
+ this.suggestionsDismissed = true;
691
+ return;
692
+ }
693
+ if (!event.altKey && !event.ctrlKey && !event.metaKey && !event.shiftKey) {
694
+ if (event.key === 'ArrowDown') {
695
+ event.preventDefault();
696
+ this.moveActiveSuggestion(1);
697
+ return;
698
+ }
699
+ if (event.key === 'ArrowUp') {
700
+ event.preventDefault();
701
+ this.moveActiveSuggestion(-1);
702
+ return;
703
+ }
704
+ if (event.key === 'Enter') {
705
+ event.preventDefault();
706
+ void this.selectSuggestion(this.activeSuggestionIndex);
707
+ return;
708
+ }
709
+ }
710
+ }
554
711
  // Shift+Tab cycles the agent mode without leaving the prompt
555
712
  if (event.key === 'Tab' && event.shiftKey && this.modeOptions.length) {
556
713
  event.preventDefault();
@@ -561,6 +718,111 @@ export class DeesHarnessComposer extends DeesElement {
561
718
  }
562
719
  };
563
720
 
721
+ private handleCompositionStart = (): void => {
722
+ this.composing = true;
723
+ };
724
+
725
+ private handleCompositionEnd = (): void => {
726
+ this.composing = false;
727
+ };
728
+
729
+ private handlePromptFocus = (): void => {
730
+ this.promptFocused = true;
731
+ };
732
+
733
+ private handlePromptBlur = (): void => {
734
+ this.promptFocused = false;
735
+ };
736
+
737
+ private handleSuggestionPointerDown = (event: PointerEvent): void => {
738
+ event.preventDefault();
739
+ };
740
+
741
+ private resetSuggestionInteraction(): void {
742
+ this.activeSuggestionIndex = this.suggestions.length ? 0 : -1;
743
+ this.suggestionsDismissed = false;
744
+ }
745
+
746
+ private get suggestionsVisible(): boolean {
747
+ return this.promptFocused
748
+ && !this.disabled
749
+ && !this.suggestionsDismissed
750
+ && this.suggestions.length > 0;
751
+ }
752
+
753
+ private suggestionOptionId(indexArg: number): string {
754
+ return `${this.suggestionListId}-option-${indexArg}`;
755
+ }
756
+
757
+ private syncTextareaSuggestionAria(): void {
758
+ const textarea = this.shadowRoot?.querySelector<HTMLTextAreaElement>('textarea');
759
+ if (!textarea) return;
760
+ const suggestionsAvailable = !this.disabled && this.suggestions.length > 0;
761
+ if (suggestionsAvailable) {
762
+ textarea.setAttribute('aria-autocomplete', 'list');
763
+ textarea.setAttribute('aria-haspopup', 'listbox');
764
+ } else {
765
+ textarea.removeAttribute('aria-autocomplete');
766
+ textarea.removeAttribute('aria-haspopup');
767
+ }
768
+ if (this.suggestionsVisible) {
769
+ textarea.setAttribute('aria-controls', this.suggestionListId);
770
+ } else {
771
+ textarea.removeAttribute('aria-controls');
772
+ }
773
+ if (
774
+ this.suggestionsVisible
775
+ && this.activeSuggestionIndex >= 0
776
+ && this.activeSuggestionIndex < this.suggestions.length
777
+ ) {
778
+ textarea.setAttribute(
779
+ 'aria-activedescendant',
780
+ this.suggestionOptionId(this.activeSuggestionIndex),
781
+ );
782
+ } else {
783
+ textarea.removeAttribute('aria-activedescendant');
784
+ }
785
+ }
786
+
787
+ private moveActiveSuggestion(offsetArg: -1 | 1): void {
788
+ if (!this.suggestions.length) return;
789
+ this.activeSuggestionIndex = this.activeSuggestionIndex < 0
790
+ ? (offsetArg === 1 ? 0 : this.suggestions.length - 1)
791
+ : (this.activeSuggestionIndex + offsetArg + this.suggestions.length) % this.suggestions.length;
792
+ void this.scrollActiveSuggestionIntoView();
793
+ }
794
+
795
+ private async scrollActiveSuggestionIntoView(): Promise<void> {
796
+ await this.updateComplete;
797
+ const list = this.shadowRoot?.getElementById(this.suggestionListId);
798
+ const option = this.shadowRoot?.getElementById(
799
+ this.suggestionOptionId(this.activeSuggestionIndex),
800
+ );
801
+ if (!list || !option) return;
802
+ const optionTop = option.offsetTop;
803
+ const optionBottom = optionTop + option.offsetHeight;
804
+ if (optionTop < list.scrollTop) {
805
+ list.scrollTop = optionTop;
806
+ } else if (optionBottom > list.scrollTop + list.clientHeight) {
807
+ list.scrollTop = optionBottom - list.clientHeight;
808
+ }
809
+ }
810
+
811
+ private async selectSuggestion(indexArg: number): Promise<void> {
812
+ if (this.disabled) return;
813
+ const suggestion = this.suggestions[indexArg];
814
+ if (!suggestion) return;
815
+ this.value = suggestion.value;
816
+ this.suggestionsDismissed = true;
817
+ this.emitInput(this.value);
818
+ await this.updateComplete;
819
+ const textarea = this.shadowRoot?.querySelector<HTMLTextAreaElement>('textarea');
820
+ if (!textarea) return;
821
+ textarea.focus();
822
+ textarea.setSelectionRange(this.value.length, this.value.length);
823
+ this.autogrow();
824
+ }
825
+
564
826
  private autogrow(): void {
565
827
  const textarea = this.shadowRoot?.querySelector<HTMLTextAreaElement>('textarea');
566
828
  if (!textarea) return;
@@ -334,6 +334,33 @@ const renderTodo = (call: IHarnessToolCall, helpers: IHarnessToolRenderHelpers):
334
334
  return html`<dees-harness-todos compact .todos=${todos}></dees-harness-todos>`;
335
335
  };
336
336
 
337
+ const projectTaskOutputItems = (output: unknown): unknown[] | undefined => {
338
+ if (!harnessIsRecord(output)) return undefined;
339
+ if (Array.isArray(output.tasks)) return output.tasks;
340
+ if (Object.prototype.hasOwnProperty.call(output, 'task')) return [output.task];
341
+ return harnessIsRecord(output.state) && Array.isArray(output.state.tasks)
342
+ ? output.state.tasks
343
+ : undefined;
344
+ };
345
+
346
+ const hasUnsupportedTodoStatus = (items: unknown[]): boolean => items.some((item) => {
347
+ if (!harnessIsRecord(item) || typeof item.status !== 'string') return false;
348
+ return item.status !== 'pending' && item.status !== 'in_progress' && item.status !== 'completed';
349
+ });
350
+
351
+ const renderProjectTask = (call: IHarnessToolCall, helpers: IHarnessToolRenderHelpers): TemplateResult => {
352
+ const output = outputText(call);
353
+ const outputItems = projectTaskOutputItems(call.output);
354
+ if (outputItems !== undefined) {
355
+ const tasks = hasUnsupportedTodoStatus(outputItems) ? [] : harnessParseTodos(outputItems);
356
+ if (tasks.length) {
357
+ return html`<dees-harness-todos compact .todos=${tasks}></dees-harness-todos>`;
358
+ }
359
+ return helpers.monoBlock(output || harnessStringifyValue(outputItems));
360
+ }
361
+ return helpers.monoBlock(output || harnessSummarizeValue(call.input));
362
+ };
363
+
337
364
  const renderMcp = (call: IHarnessToolCall, helpers: IHarnessToolRenderHelpers): TemplateResult => {
338
365
  return html`
339
366
  ${call.contentBlocks?.length ? helpers.contentBlocks(call.contentBlocks) : ''}
@@ -373,6 +400,7 @@ export const builtinBodyRenderers: Record<
373
400
  'json': renderJson,
374
401
  'search': renderSearch,
375
402
  'subtask': renderSubtask,
403
+ 'project-task': renderProjectTask,
376
404
  'todo': renderTodo,
377
405
  'mcp': renderMcp,
378
406
  'unknown': renderUnknown,