@design.estate/dees-catalog 9.0.0 → 9.1.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 (38) hide show
  1. package/dist_bundle/bundle.js +2636 -2150
  2. package/dist_bundle/bundle.js.map +1 -1
  3. package/dist_ts_web/00_commitinfo_data.js +1 -1
  4. package/dist_ts_web/elements/00group-dataview/dees-dataview-codebox/dees-dataview-codebox.d.ts +7 -2
  5. package/dist_ts_web/elements/00group-dataview/dees-dataview-codebox/dees-dataview-codebox.js +56 -5
  6. package/dist_ts_web/elements/00group-harness/dees-harness-chat/dees-harness-chat.d.ts +1 -0
  7. package/dist_ts_web/elements/00group-harness/dees-harness-chat/dees-harness-chat.js +62 -18
  8. package/dist_ts_web/elements/00group-harness/dees-harness-composer/dees-harness-composer.d.ts +4 -2
  9. package/dist_ts_web/elements/00group-harness/dees-harness-composer/dees-harness-composer.demo.js +7 -2
  10. package/dist_ts_web/elements/00group-harness/dees-harness-composer/dees-harness-composer.js +69 -29
  11. package/dist_ts_web/elements/00group-harness/dees-harness-session-list/dees-harness-session-list.d.ts +6 -1
  12. package/dist_ts_web/elements/00group-harness/dees-harness-session-list/dees-harness-session-list.demo.d.ts +2 -0
  13. package/dist_ts_web/elements/00group-harness/dees-harness-session-list/dees-harness-session-list.demo.js +419 -83
  14. package/dist_ts_web/elements/00group-harness/dees-harness-session-list/dees-harness-session-list.js +247 -118
  15. package/dist_ts_web/elements/00group-harness/dees-harness-tool-card/dees-harness-tool-card.js +2 -2
  16. package/dist_ts_web/elements/00group-harness/dees-harness-tool-card/renderers.js +2 -4
  17. package/dist_ts_web/elements/00group-harness/interfaces.d.ts +15 -4
  18. package/dist_ts_web/elements/00group-harness/toolregistry.d.ts +2 -1
  19. package/dist_ts_web/elements/00group-harness/toolregistry.js +1 -1
  20. package/dist_ts_web/elements/00group-overlay/dees-contextmenu/dees-contextmenu.d.ts +1 -1
  21. package/dist_ts_web/elements/00group-overlay/dees-contextmenu/dees-contextmenu.js +30 -12
  22. package/dist_ts_web/elements/00theme.js +3 -1
  23. package/package.json +1 -1
  24. package/readme.md +19 -3
  25. package/readme.plan.md +97 -0
  26. package/ts_web/00_commitinfo_data.ts +1 -1
  27. package/ts_web/elements/00group-dataview/dees-dataview-codebox/dees-dataview-codebox.ts +48 -4
  28. package/ts_web/elements/00group-harness/dees-harness-chat/dees-harness-chat.ts +62 -17
  29. package/ts_web/elements/00group-harness/dees-harness-composer/dees-harness-composer.demo.ts +6 -1
  30. package/ts_web/elements/00group-harness/dees-harness-composer/dees-harness-composer.ts +60 -27
  31. package/ts_web/elements/00group-harness/dees-harness-session-list/dees-harness-session-list.demo.ts +341 -88
  32. package/ts_web/elements/00group-harness/dees-harness-session-list/dees-harness-session-list.ts +257 -125
  33. package/ts_web/elements/00group-harness/dees-harness-tool-card/dees-harness-tool-card.ts +1 -1
  34. package/ts_web/elements/00group-harness/dees-harness-tool-card/renderers.ts +1 -3
  35. package/ts_web/elements/00group-harness/interfaces.ts +16 -4
  36. package/ts_web/elements/00group-harness/toolregistry.ts +2 -1
  37. package/ts_web/elements/00group-overlay/dees-contextmenu/dees-contextmenu.ts +29 -15
  38. package/ts_web/elements/00theme.ts +2 -0
@@ -183,7 +183,7 @@ const renderFileWrite = (call: IHarnessToolCall, helpers: IHarnessToolRenderHelp
183
183
  ${helpers.diffBlock('', '', {
184
184
  language: harnessLanguageForPath(String(change.path)),
185
185
  filename: String(change.path).split('/').pop(),
186
- view: 'split', unifiedDiff: String(change.diff),
186
+ unifiedDiff: String(change.diff),
187
187
  })}
188
188
  </section>
189
189
  `)}`;
@@ -199,7 +199,6 @@ const renderFileWrite = (call: IHarnessToolCall, helpers: IHarnessToolRenderHelp
199
199
  return helpers.diffBlock(file.before, file.after, {
200
200
  language: patchLanguage,
201
201
  filename: patchFilename,
202
- view: 'split',
203
202
  unifiedDiff: file.unifiedDiff,
204
203
  showLineNumbers: file.lineNumbersKnown,
205
204
  });
@@ -232,7 +231,6 @@ const renderFileWrite = (call: IHarnessToolCall, helpers: IHarnessToolRenderHelp
232
231
  return helpers.diffBlock(previousContent, newContent, {
233
232
  language,
234
233
  filename,
235
- view: 'split',
236
234
  showLineNumbers: !isStringReplacement,
237
235
  });
238
236
  }
@@ -326,6 +326,14 @@ export interface IHarnessPermissionResponseDetail {
326
326
 
327
327
  export type THarnessSessionCardState = 'normal' | 'working' | 'finished' | 'attention' | 'error';
328
328
 
329
+ /** Host-supplied harness identity, independent of the model and session state. */
330
+ export interface IHarnessAgentIdentity {
331
+ id: string;
332
+ name: string;
333
+ /** Optional dees-icon name; identity remains readable without an icon. */
334
+ icon?: string;
335
+ }
336
+
329
337
  export interface IHarnessSessionMeta {
330
338
  id: string;
331
339
  title: string;
@@ -337,7 +345,11 @@ export interface IHarnessSessionMeta {
337
345
  icon?: string;
338
346
  /** Visual card state. Defaults to `normal`. */
339
347
  state?: THarnessSessionCardState;
340
- /** Independent activity signal for hosts that track work separately from the visual state. */
348
+ /** Short visible state description, e.g. "Starting" or "Waiting for feedback". */
349
+ statusLabel?: string;
350
+ /** Harness running this session, e.g. Codex, OpenCode or FlexHarness. */
351
+ harness?: IHarnessAgentIdentity;
352
+ /** Pulse the normal/working indicator. Defaults to state === 'working'; never pulses attention/error/finished. */
341
353
  working?: boolean;
342
354
  /** Set false for pinned, non-sortable entries such as terminals. Defaults to true. */
343
355
  draggable?: boolean;
@@ -410,13 +422,13 @@ export interface IHarnessResourceContextDetail<TState extends string = string>
410
422
  close: () => void;
411
423
  }
412
424
 
413
- /** Detail of `harness-session-context`, fired on right-click of a session item. */
425
+ /** Detail of `harness-session-context`, fired by right-click, Actions, or ContextMenu/Shift+F10. */
414
426
  export interface IHarnessSessionContextDetail {
415
427
  session: IHarnessSessionMeta;
416
- /** Viewport coordinates of the pointer, for positioning a context menu. */
428
+ /** Pointer position or invoking control anchor, in viewport coordinates. */
417
429
  clientX: number;
418
430
  clientY: number;
419
- /** The suppressed contextmenu event, e.g. for DeesContextmenu.openContextMenuWithOptions. */
431
+ /** Pass synchronously to DeesContextmenu.openContextMenuWithOptions to retain its composed dialog owner. */
420
432
  originalEvent: MouseEvent;
421
433
  }
422
434
 
@@ -1,4 +1,5 @@
1
1
  import type { TemplateResult } from '@design.estate/dees-element';
2
+ import type { TDiffViewRequest } from '../00group-dataview/dees-dataview-codebox/dees-dataview-codebox.js';
2
3
  import type { IHarnessToolCall, THarnessContentBlock } from './interfaces.js';
3
4
  import { harnessIsRecord, harnessSummaryLine } from './harness.helpers.js';
4
5
 
@@ -14,7 +15,7 @@ export interface IHarnessToolRenderHelpers {
14
15
  diffBlock(before: string, after: string, options?: {
15
16
  language?: string;
16
17
  filename?: string;
17
- view?: 'inline' | 'split';
18
+ view?: TDiffViewRequest;
18
19
  unifiedDiff?: string;
19
20
  showLineNumbers?: boolean;
20
21
  }): TemplateResult;
@@ -129,6 +129,7 @@ export class DeesContextmenu extends DeesElement {
129
129
  // backdrop-filter drops out while an opacity/transform animation runs and
130
130
  // snaps back in at the end. Appearing directly keeps the vibrancy stable.
131
131
  contextMenu.style.visibility = 'visible';
132
+ contextMenu.focus({ preventScroll: true });
132
133
  return contextMenu;
133
134
  }
134
135
 
@@ -206,8 +207,10 @@ export class DeesContextmenu extends DeesElement {
206
207
  position: relative;
207
208
  }
208
209
 
209
- .menuitem:hover {
210
+ .menuitem:hover,
211
+ .menuitem:focus {
210
212
  background: var(--dees-color-active);
213
+ outline: none;
211
214
  }
212
215
 
213
216
  .menuitem.has-submenu::after {
@@ -260,7 +263,7 @@ export class DeesContextmenu extends DeesElement {
260
263
 
261
264
  public render(): TemplateResult {
262
265
  return html`
263
- <div class="mainbox">
266
+ <div class="mainbox" role="menu">
264
267
  ${this.menuItems.map((menuItemArg) => {
265
268
  if ('divider' in menuItemArg && menuItemArg.divider) {
266
269
  return html`<div class="menu-divider"></div>`;
@@ -271,8 +274,15 @@ export class DeesContextmenu extends DeesElement {
271
274
  return html`
272
275
  <div
273
276
  class="menuitem ${menuItem.disabled ? 'disabled' : ''} ${hasSubmenu ? 'has-submenu' : ''}"
277
+ role="menuitem"
278
+ tabindex="-1"
279
+ aria-disabled=${menuItem.disabled ? 'true' : 'false'}
274
280
  @click=${() => !menuItem.disabled && !hasSubmenu && this.handleClick(menuItem)}
275
- @mouseenter=${() => this.handleMenuItemHover(menuItem, hasSubmenu)}
281
+ @mouseenter=${(event: MouseEvent) => {
282
+ if (menuItem.disabled) return;
283
+ (event.currentTarget as HTMLElement).focus({ preventScroll: true });
284
+ void this.handleMenuItemHover(menuItem, hasSubmenu);
285
+ }}
276
286
  @mouseleave=${() => this.handleMenuItemLeave()}
277
287
  >
278
288
  ${menuItem.iconName ? html`
@@ -286,7 +296,7 @@ export class DeesContextmenu extends DeesElement {
286
296
  `;
287
297
  })}
288
298
  ${this.menuItems.length === 0 ? html`
289
- <div class="menuitem" @click=${() => {
299
+ <div class="menuitem" role="menuitem" tabindex="-1" @click=${() => {
290
300
  DeesContextmenu.contextMenuDeactivated = true;
291
301
  this.destroy();
292
302
  }}>
@@ -298,7 +308,8 @@ export class DeesContextmenu extends DeesElement {
298
308
  `;
299
309
  }
300
310
 
301
- public async firstUpdated() {
311
+ public firstUpdated(changedProperties: Map<string | number | symbol, unknown>): void {
312
+ super.firstUpdated(changedProperties);
302
313
  // Focus on the menu for keyboard navigation
303
314
  this.focus();
304
315
 
@@ -307,32 +318,35 @@ export class DeesContextmenu extends DeesElement {
307
318
  }
308
319
 
309
320
  private handleKeydown = (event: KeyboardEvent) => {
310
- const menuItems = Array.from(this.shadowRoot!.querySelectorAll('.menuitem:not(.disabled)'));
311
- const currentIndex = menuItems.findIndex(item => item.matches(':hover'));
321
+ if (!['ArrowDown', 'ArrowUp', 'Enter', 'Escape'].includes(event.key)) return;
322
+ event.preventDefault();
323
+ event.stopPropagation();
324
+ const menuItems = Array.from(this.shadowRoot!.querySelectorAll<HTMLElement>('.menuitem:not(.disabled)'));
325
+ const currentIndex = menuItems.findIndex(item => item === this.shadowRoot!.activeElement);
312
326
 
313
327
  switch (event.key) {
314
328
  case 'ArrowDown':
315
- event.preventDefault();
329
+ if (!menuItems.length) return;
316
330
  const nextIndex = currentIndex + 1 < menuItems.length ? currentIndex + 1 : 0;
317
- (menuItems[nextIndex] as HTMLElement).dispatchEvent(new MouseEvent('mouseenter'));
331
+ menuItems[nextIndex].focus({ preventScroll: true });
332
+ menuItems[nextIndex].dispatchEvent(new MouseEvent('mouseenter'));
318
333
  break;
319
334
 
320
335
  case 'ArrowUp':
321
- event.preventDefault();
336
+ if (!menuItems.length) return;
322
337
  const prevIndex = currentIndex - 1 >= 0 ? currentIndex - 1 : menuItems.length - 1;
323
- (menuItems[prevIndex] as HTMLElement).dispatchEvent(new MouseEvent('mouseenter'));
338
+ menuItems[prevIndex].focus({ preventScroll: true });
339
+ menuItems[prevIndex].dispatchEvent(new MouseEvent('mouseenter'));
324
340
  break;
325
341
 
326
342
  case 'Enter':
327
- event.preventDefault();
328
343
  if (currentIndex >= 0) {
329
- (menuItems[currentIndex] as HTMLElement).click();
344
+ menuItems[currentIndex].click();
330
345
  }
331
346
  break;
332
347
 
333
348
  case 'Escape':
334
- event.preventDefault();
335
- this.destroy();
349
+ void this.destroyAll();
336
350
  break;
337
351
  }
338
352
  }
@@ -664,6 +664,8 @@ export const themeDefaultStyles: CSSResult = css`
664
664
  --dees-shadow-xl: ${cssManager.bdTheme(shadowsLight.xl, shadowsDark.xl)};
665
665
  /* upward-casting bar shadow (mirrored sm) for bottom-docked chrome */
666
666
  --dees-shadow-up-sm: ${cssManager.bdTheme(mirrorShadow(shadowsLight.sm), mirrorShadow(shadowsDark.sm))};
667
+ /* Contact shadow where scrolling content passes beneath opaque chrome. */
668
+ --dees-color-scroll-edge-shadow: ${cssManager.bdTheme('rgba(0, 0, 0, 0.11)', 'rgba(0, 0, 0, 0.55)')};
667
669
 
668
670
  /* ========================================
669
671
  * Materials / Vibrancy (theme-aware bg + opaque fallback; theme-agnostic filter)