@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.
- package/dist_bundle/bundle.js +2636 -2150
- package/dist_bundle/bundle.js.map +1 -1
- package/dist_ts_web/00_commitinfo_data.js +1 -1
- package/dist_ts_web/elements/00group-dataview/dees-dataview-codebox/dees-dataview-codebox.d.ts +7 -2
- package/dist_ts_web/elements/00group-dataview/dees-dataview-codebox/dees-dataview-codebox.js +56 -5
- package/dist_ts_web/elements/00group-harness/dees-harness-chat/dees-harness-chat.d.ts +1 -0
- package/dist_ts_web/elements/00group-harness/dees-harness-chat/dees-harness-chat.js +62 -18
- package/dist_ts_web/elements/00group-harness/dees-harness-composer/dees-harness-composer.d.ts +4 -2
- package/dist_ts_web/elements/00group-harness/dees-harness-composer/dees-harness-composer.demo.js +7 -2
- package/dist_ts_web/elements/00group-harness/dees-harness-composer/dees-harness-composer.js +69 -29
- package/dist_ts_web/elements/00group-harness/dees-harness-session-list/dees-harness-session-list.d.ts +6 -1
- package/dist_ts_web/elements/00group-harness/dees-harness-session-list/dees-harness-session-list.demo.d.ts +2 -0
- package/dist_ts_web/elements/00group-harness/dees-harness-session-list/dees-harness-session-list.demo.js +419 -83
- package/dist_ts_web/elements/00group-harness/dees-harness-session-list/dees-harness-session-list.js +247 -118
- package/dist_ts_web/elements/00group-harness/dees-harness-tool-card/dees-harness-tool-card.js +2 -2
- package/dist_ts_web/elements/00group-harness/dees-harness-tool-card/renderers.js +2 -4
- package/dist_ts_web/elements/00group-harness/interfaces.d.ts +15 -4
- package/dist_ts_web/elements/00group-harness/toolregistry.d.ts +2 -1
- package/dist_ts_web/elements/00group-harness/toolregistry.js +1 -1
- package/dist_ts_web/elements/00group-overlay/dees-contextmenu/dees-contextmenu.d.ts +1 -1
- package/dist_ts_web/elements/00group-overlay/dees-contextmenu/dees-contextmenu.js +30 -12
- package/dist_ts_web/elements/00theme.js +3 -1
- package/package.json +1 -1
- package/readme.md +19 -3
- package/readme.plan.md +97 -0
- package/ts_web/00_commitinfo_data.ts +1 -1
- package/ts_web/elements/00group-dataview/dees-dataview-codebox/dees-dataview-codebox.ts +48 -4
- package/ts_web/elements/00group-harness/dees-harness-chat/dees-harness-chat.ts +62 -17
- package/ts_web/elements/00group-harness/dees-harness-composer/dees-harness-composer.demo.ts +6 -1
- package/ts_web/elements/00group-harness/dees-harness-composer/dees-harness-composer.ts +60 -27
- package/ts_web/elements/00group-harness/dees-harness-session-list/dees-harness-session-list.demo.ts +341 -88
- package/ts_web/elements/00group-harness/dees-harness-session-list/dees-harness-session-list.ts +257 -125
- package/ts_web/elements/00group-harness/dees-harness-tool-card/dees-harness-tool-card.ts +1 -1
- package/ts_web/elements/00group-harness/dees-harness-tool-card/renderers.ts +1 -3
- package/ts_web/elements/00group-harness/interfaces.ts +16 -4
- package/ts_web/elements/00group-harness/toolregistry.ts +2 -1
- package/ts_web/elements/00group-overlay/dees-contextmenu/dees-contextmenu.ts +29 -15
- package/ts_web/elements/00theme.ts +2 -0
|
@@ -278,6 +278,8 @@ export class DeesHarnessChat extends DeesElement {
|
|
|
278
278
|
min-height: 0;
|
|
279
279
|
display: flex;
|
|
280
280
|
flex-direction: column;
|
|
281
|
+
/* Keep composer/suggestion layers below the adjacent narrow drawer. */
|
|
282
|
+
isolation: isolate;
|
|
281
283
|
}
|
|
282
284
|
|
|
283
285
|
.sessionPanel {
|
|
@@ -341,6 +343,11 @@ export class DeesHarnessChat extends DeesElement {
|
|
|
341
343
|
/* Narrow hosts keep every session section reachable in an overlay.
|
|
342
344
|
Todo tool cards remain a second transcript-level representation. */
|
|
343
345
|
@container (max-width: 680px) {
|
|
346
|
+
.chatBody {
|
|
347
|
+
/* The closed off-canvas drawer must not widen its owning chat. */
|
|
348
|
+
overflow-x: clip;
|
|
349
|
+
}
|
|
350
|
+
|
|
344
351
|
.sessionPanel {
|
|
345
352
|
position: absolute;
|
|
346
353
|
inset: 0 0 0 auto;
|
|
@@ -455,9 +462,40 @@ export class DeesHarnessChat extends DeesElement {
|
|
|
455
462
|
min-height: 0;
|
|
456
463
|
}
|
|
457
464
|
|
|
458
|
-
/*
|
|
459
|
-
|
|
460
|
-
|
|
465
|
+
/* Stationary contact shadows keep the transcript beneath the chrome.
|
|
466
|
+
They neither mask the scroll surface nor participate in hit testing. */
|
|
467
|
+
.transcriptColumn > dees-harness-message-list::before,
|
|
468
|
+
.transcriptColumn > dees-harness-message-list::after {
|
|
469
|
+
content: '';
|
|
470
|
+
position: absolute;
|
|
471
|
+
inset-inline: 0;
|
|
472
|
+
height: 20px;
|
|
473
|
+
z-index: 1;
|
|
474
|
+
pointer-events: none;
|
|
475
|
+
}
|
|
476
|
+
|
|
477
|
+
.transcriptColumn > dees-harness-message-list::before {
|
|
478
|
+
content: none;
|
|
479
|
+
top: 0;
|
|
480
|
+
}
|
|
481
|
+
|
|
482
|
+
.toolbar + .chatBody .transcriptColumn > dees-harness-message-list::before {
|
|
483
|
+
content: '';
|
|
484
|
+
background: linear-gradient(to bottom,
|
|
485
|
+
var(--dees-color-scroll-edge-shadow),
|
|
486
|
+
color-mix(in srgb, var(--dees-color-scroll-edge-shadow) 35%, transparent) 6px,
|
|
487
|
+
transparent 100%);
|
|
488
|
+
}
|
|
489
|
+
|
|
490
|
+
.transcriptColumn > dees-harness-message-list::after {
|
|
491
|
+
bottom: 0;
|
|
492
|
+
background: linear-gradient(to top,
|
|
493
|
+
var(--dees-color-scroll-edge-shadow),
|
|
494
|
+
color-mix(in srgb, var(--dees-color-scroll-edge-shadow) 35%, transparent) 6px,
|
|
495
|
+
transparent 100%);
|
|
496
|
+
}
|
|
497
|
+
|
|
498
|
+
/* Dock only within the conversation column, above transcript content. */
|
|
461
499
|
.composerRow {
|
|
462
500
|
flex: 0 0 auto;
|
|
463
501
|
position: relative;
|
|
@@ -469,11 +507,10 @@ export class DeesHarnessChat extends DeesElement {
|
|
|
469
507
|
display: flex;
|
|
470
508
|
align-items: center;
|
|
471
509
|
gap: var(--dees-spacing-xs);
|
|
472
|
-
padding:
|
|
473
|
-
background: var(--dees-color-bg-secondary);
|
|
510
|
+
padding: 8px 12px 0;
|
|
474
511
|
color: var(--dees-color-text-muted);
|
|
475
|
-
font-size: var(--dees-font-
|
|
476
|
-
line-height:
|
|
512
|
+
font-size: var(--dees-font-caption1-size, 11px);
|
|
513
|
+
line-height: 16px;
|
|
477
514
|
}
|
|
478
515
|
|
|
479
516
|
.composerContextBar dees-icon {
|
|
@@ -640,15 +677,7 @@ export class DeesHarnessChat extends DeesElement {
|
|
|
640
677
|
.markdownWhileStreaming=${this.markdownWhileStreaming}
|
|
641
678
|
.toolRegistry=${this.toolRegistry}
|
|
642
679
|
></dees-harness-message-list>
|
|
643
|
-
${this.
|
|
644
|
-
? html`
|
|
645
|
-
<div class="composerContextBar" title=${`Replying to ${this.heading}`}>
|
|
646
|
-
<dees-icon icon="lucide:MessageSquare" iconSize="11"></dees-icon>
|
|
647
|
-
<span class="composerContextLabel">Replying to</span>
|
|
648
|
-
<span class="composerContextTitle">${this.heading}</span>
|
|
649
|
-
</div>
|
|
650
|
-
`
|
|
651
|
-
: ''}
|
|
680
|
+
${this.renderComposer()}
|
|
652
681
|
${this.hasSessionSidebar && !this.showToolbar ? html`
|
|
653
682
|
<button
|
|
654
683
|
class="sessionPanelToggle"
|
|
@@ -723,9 +752,15 @@ export class DeesHarnessChat extends DeesElement {
|
|
|
723
752
|
`
|
|
724
753
|
: ''}
|
|
725
754
|
</div>
|
|
755
|
+
`;
|
|
756
|
+
}
|
|
757
|
+
|
|
758
|
+
private renderComposer(): TemplateResult {
|
|
759
|
+
return html`
|
|
726
760
|
<div class="composerRow">
|
|
727
761
|
<dees-harness-composer
|
|
728
762
|
docked
|
|
763
|
+
.contextDescription=${this.heading ? `Replying to ${this.heading}` : ''}
|
|
729
764
|
.value=${this.composerValue}
|
|
730
765
|
.attachments=${this.attachments}
|
|
731
766
|
.suggestions=${this.suggestions}
|
|
@@ -762,7 +797,17 @@ export class DeesHarnessChat extends DeesElement {
|
|
|
762
797
|
@harness-mode-change=${(event: CustomEvent<{ mode?: string }>) => {
|
|
763
798
|
if (event.detail?.mode) this.mode = event.detail.mode;
|
|
764
799
|
}}
|
|
765
|
-
|
|
800
|
+
>
|
|
801
|
+
${this.heading
|
|
802
|
+
? html`
|
|
803
|
+
<div slot="context" class="composerContextBar" title=${`Replying to ${this.heading}`}>
|
|
804
|
+
<dees-icon icon="lucide:MessageSquare" iconSize="11" aria-hidden="true"></dees-icon>
|
|
805
|
+
<span class="composerContextLabel">Replying to</span>
|
|
806
|
+
<span class="composerContextTitle">${this.heading}</span>
|
|
807
|
+
</div>
|
|
808
|
+
`
|
|
809
|
+
: ''}
|
|
810
|
+
</dees-harness-composer>
|
|
766
811
|
</div>
|
|
767
812
|
`;
|
|
768
813
|
}
|
|
@@ -21,6 +21,7 @@ export const demoFunc = () => demoPage('Composer', 'Write, attach files, choose
|
|
|
21
21
|
>
|
|
22
22
|
<div class="dees-demo-label">Account, model and mode</div>
|
|
23
23
|
<dees-harness-composer
|
|
24
|
+
contextDescription="Replying to Deploy assistant"
|
|
24
25
|
account="account-1"
|
|
25
26
|
model="gpt-5.5"
|
|
26
27
|
reasoningEffort="high"
|
|
@@ -32,7 +33,11 @@ export const demoFunc = () => demoPage('Composer', 'Write, attach files, choose
|
|
|
32
33
|
]}
|
|
33
34
|
.modelOptions=${['gpt-5.5', 'gpt-5', 'o4-mini']}
|
|
34
35
|
.effortOptions=${['xhigh', 'high', 'medium', 'low']}
|
|
35
|
-
|
|
36
|
+
>
|
|
37
|
+
<div slot="context" style="padding:8px 12px 0;font-size:11px;line-height:16px;color:var(--dees-color-text-secondary)">
|
|
38
|
+
Replying to <strong>Deploy assistant</strong>
|
|
39
|
+
</div>
|
|
40
|
+
</dees-harness-composer>
|
|
36
41
|
<div class="dees-demo-label">Queue a follow-up while the agent works</div>
|
|
37
42
|
<dees-harness-composer busy value="Refactor the sitemap job…"></dees-harness-composer>
|
|
38
43
|
<div class="dees-demo-label">Steer the task with queued messages</div>
|
|
@@ -68,11 +68,14 @@ export class DeesHarnessComposer extends DeesElement {
|
|
|
68
68
|
@property()
|
|
69
69
|
accessor placeholder: string = 'Message the agent — drop or paste files to attach…';
|
|
70
70
|
|
|
71
|
+
/** Accessible description of the optional `context` slot inside the prompt field. */
|
|
72
|
+
@property()
|
|
73
|
+
accessor contextDescription: string = '';
|
|
74
|
+
|
|
71
75
|
/**
|
|
72
76
|
* Docked composers sit flush against their container edge-to-edge (a
|
|
73
77
|
* top border instead of the floating card chrome) — used by
|
|
74
|
-
* dees-harness-chat
|
|
75
|
-
* without a gap.
|
|
78
|
+
* dees-harness-chat at the bottom of its conversation column.
|
|
76
79
|
*/
|
|
77
80
|
@property({ type: Boolean, reflect: true })
|
|
78
81
|
accessor docked: boolean = false;
|
|
@@ -268,15 +271,37 @@ export class DeesHarnessComposer extends DeesElement {
|
|
|
268
271
|
display: none;
|
|
269
272
|
}
|
|
270
273
|
|
|
274
|
+
.promptField {
|
|
275
|
+
display: grid;
|
|
276
|
+
grid-template-columns: minmax(0, 1fr);
|
|
277
|
+
min-width: 0;
|
|
278
|
+
border: 1px solid var(--dees-color-control-border);
|
|
279
|
+
border-radius: var(--dees-radius-xl);
|
|
280
|
+
corner-shape: var(--dees-corner-shape);
|
|
281
|
+
background: var(--dees-color-control-bg);
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
.promptField:focus-within {
|
|
285
|
+
border-color: var(--dees-color-accent-primary);
|
|
286
|
+
outline: 2px solid var(--dees-color-focus-ring);
|
|
287
|
+
outline-offset: 1px;
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
.promptField:has(textarea:disabled) {
|
|
291
|
+
opacity: 0.55;
|
|
292
|
+
}
|
|
293
|
+
|
|
271
294
|
textarea {
|
|
295
|
+
display: block;
|
|
272
296
|
width: 100%;
|
|
273
|
-
min-
|
|
297
|
+
min-width: 0;
|
|
298
|
+
min-height: 62px;
|
|
274
299
|
max-height: 40vh;
|
|
275
300
|
resize: none;
|
|
276
301
|
padding: 10px 12px;
|
|
277
|
-
border:
|
|
278
|
-
border-radius:
|
|
279
|
-
background:
|
|
302
|
+
border: 0;
|
|
303
|
+
border-radius: inherit;
|
|
304
|
+
background: transparent;
|
|
280
305
|
color: var(--dees-color-text-primary);
|
|
281
306
|
font-family: inherit;
|
|
282
307
|
font-size: var(--dees-font-control-size, 13px);
|
|
@@ -290,13 +315,7 @@ export class DeesHarnessComposer extends DeesElement {
|
|
|
290
315
|
}
|
|
291
316
|
|
|
292
317
|
textarea:focus-visible {
|
|
293
|
-
|
|
294
|
-
outline: 2px solid var(--dees-color-focus-ring);
|
|
295
|
-
outline-offset: 1px;
|
|
296
|
-
}
|
|
297
|
-
|
|
298
|
-
textarea:disabled {
|
|
299
|
-
opacity: 0.55;
|
|
318
|
+
outline: none;
|
|
300
319
|
}
|
|
301
320
|
|
|
302
321
|
.attachmentRow {
|
|
@@ -515,20 +534,24 @@ export class DeesHarnessComposer extends DeesElement {
|
|
|
515
534
|
</div>
|
|
516
535
|
`
|
|
517
536
|
: ''}
|
|
518
|
-
<
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
537
|
+
<div class="promptField" @click=${this.handlePromptFieldClick}>
|
|
538
|
+
<slot name="context"></slot>
|
|
539
|
+
<textarea
|
|
540
|
+
.value=${this.value}
|
|
541
|
+
aria-label="Message"
|
|
542
|
+
aria-description=${this.contextDescription}
|
|
543
|
+
placeholder=${this.placeholder}
|
|
544
|
+
?disabled=${this.disabled}
|
|
545
|
+
rows="1"
|
|
546
|
+
@input=${this.handleTextInput}
|
|
547
|
+
@keydown=${this.handleKeydown}
|
|
548
|
+
@focus=${this.handlePromptFocus}
|
|
549
|
+
@blur=${this.handlePromptBlur}
|
|
550
|
+
@compositionstart=${this.handleCompositionStart}
|
|
551
|
+
@compositionend=${this.handleCompositionEnd}
|
|
552
|
+
@paste=${this.handlePaste}
|
|
553
|
+
></textarea>
|
|
554
|
+
</div>
|
|
532
555
|
<div class="controlsRow">
|
|
533
556
|
<dees-button
|
|
534
557
|
size="sm"
|
|
@@ -653,6 +676,16 @@ export class DeesHarnessComposer extends DeesElement {
|
|
|
653
676
|
`;
|
|
654
677
|
}
|
|
655
678
|
|
|
679
|
+
private handlePromptFieldClick(event: MouseEvent): void {
|
|
680
|
+
// Context text is part of the field; preserve native interactions in slotted controls.
|
|
681
|
+
for (const target of event.composedPath()) {
|
|
682
|
+
if (target === event.currentTarget) break;
|
|
683
|
+
if (target instanceof Element
|
|
684
|
+
&& target.matches('a[href], button, input, textarea, select, label, [tabindex], [contenteditable]')) return;
|
|
685
|
+
}
|
|
686
|
+
if (!this.disabled) this.shadowRoot?.querySelector<HTMLTextAreaElement>('textarea')?.focus();
|
|
687
|
+
}
|
|
688
|
+
|
|
656
689
|
private renderSuggestions(): TemplateResult {
|
|
657
690
|
return html`
|
|
658
691
|
<ul
|