@design.estate/dees-catalog 10.0.0 → 11.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 (26) hide show
  1. package/dist_bundle/bundle.js +914 -780
  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-harness/dees-harness-chat/dees-harness-chat.demo.js +24 -1
  5. package/dist_ts_web/elements/00group-harness/dees-harness-message-list/dees-harness-message-list.js +13 -1
  6. package/dist_ts_web/elements/00group-harness/dees-harness-session-list/dees-harness-session-list.d.ts +62 -48
  7. package/dist_ts_web/elements/00group-harness/dees-harness-session-list/dees-harness-session-list.demo.js +97 -57
  8. package/dist_ts_web/elements/00group-harness/dees-harness-session-list/dees-harness-session-list.js +541 -666
  9. package/dist_ts_web/elements/00group-harness/dees-harness-tool-card/dees-harness-tool-card.js +19 -1
  10. package/dist_ts_web/elements/00group-harness/dees-terminal-view/dees-terminal-view.d.ts +45 -6
  11. package/dist_ts_web/elements/00group-harness/dees-terminal-view/dees-terminal-view.js +184 -27
  12. package/dist_ts_web/elements/00group-harness/interfaces.d.ts +59 -20
  13. package/dist_ts_web/services/DeesServiceLibLoader.d.ts +7 -0
  14. package/dist_ts_web/services/DeesServiceLibLoader.js +45 -22
  15. package/package.json +1 -2
  16. package/readme.md +37 -17
  17. package/ts_web/00_commitinfo_data.ts +1 -1
  18. package/ts_web/elements/00group-harness/dees-harness-chat/dees-harness-chat.demo.ts +23 -0
  19. package/ts_web/elements/00group-harness/dees-harness-message-list/dees-harness-message-list.ts +12 -0
  20. package/ts_web/elements/00group-harness/dees-harness-session-list/dees-harness-session-list.demo.ts +107 -55
  21. package/ts_web/elements/00group-harness/dees-harness-session-list/dees-harness-session-list.ts +622 -756
  22. package/ts_web/elements/00group-harness/dees-harness-tool-card/dees-harness-tool-card.ts +18 -0
  23. package/ts_web/elements/00group-harness/dees-terminal-view/dees-terminal-view.ts +196 -24
  24. package/ts_web/elements/00group-harness/interfaces.ts +63 -19
  25. package/ts_web/services/DeesServiceLibLoader.ts +150 -102
  26. package/.smartconfig.json +0 -86
@@ -323,11 +323,27 @@ export interface IHarnessSessionMeta {
323
323
  statusLabel?: string;
324
324
  /** Harness running this session, e.g. Codex, OpenCode or FlexHarness. */
325
325
  harness?: IHarnessAgentIdentity;
326
+ /** Host-owned project or workspace this session belongs to, shown on the identity line. */
327
+ projectLabel?: string;
326
328
  /** Pulse the normal/working indicator. Defaults to state === 'working'; never pulses attention/error/finished. */
327
329
  working?: boolean;
328
330
  /** Set false for pinned, non-sortable entries such as terminals. Defaults to true. */
329
331
  draggable?: boolean;
330
332
  }
333
+ /** Discriminates the two kinds of rows the session list orders as peers. */
334
+ export type THarnessSessionListItemKind = 'session' | 'resource';
335
+ /**
336
+ * Stable reference to one ordered row. Session ids and resource ids are
337
+ * separate namespaces, so ordering always carries the kind alongside the id.
338
+ */
339
+ export interface IHarnessSessionListItemRef {
340
+ kind: THarnessSessionListItemKind;
341
+ id: string;
342
+ }
343
+ /** Detail of `harness-session-select` and `harness-session-open`. */
344
+ export interface IHarnessSessionEventDetail {
345
+ session: IHarnessSessionMeta;
346
+ }
331
347
  /** Host-owned metadata for a resource that can be associated with a harness session. */
332
348
  export interface IHarnessResourceMeta<TState extends string = string> {
333
349
  /** Stable identity used by selection and association records. */
@@ -340,36 +356,48 @@ export interface IHarnessResourceMeta<TState extends string = string> {
340
356
  preview?: string;
341
357
  createdAt?: number;
342
358
  updatedAt?: number;
359
+ /** Host-owned project or workspace this resource belongs to, shown on the metadata line. */
360
+ projectLabel?: string;
343
361
  /** Optional host-defined display state. */
344
362
  state?: TState;
363
+ /** Set false for pinned, non-sortable entries. Defaults to true. */
364
+ draggable?: boolean;
345
365
  }
346
- /** A controlled zero-or-one session association for one resource. */
366
+ /**
367
+ * A controlled zero-or-one association for one resource. The target is any
368
+ * other list item — a session or another resource such as a terminal.
369
+ */
347
370
  export interface IHarnessResourceAssociation {
348
371
  resourceId: string;
349
- sessionId: string;
372
+ target: IHarnessSessionListItemRef;
350
373
  }
351
374
  export interface IHarnessResourceEventDetail<TState extends string = string> {
352
375
  resource: IHarnessResourceMeta<TState>;
353
- sessionId: string | null;
376
+ /** The controlled association target, or null when the resource is unattached. */
377
+ target: IHarnessSessionListItemRef | null;
354
378
  }
355
- export type THarnessResourceAssociationInteractionSource = 'drop' | 'action' | 'keyboard';
379
+ /**
380
+ * Association is an explicit host action, never a drop: dragging a resource
381
+ * only moves it inside the ordered list.
382
+ */
383
+ export type THarnessResourceAssociationInteractionSource = 'action' | 'keyboard';
356
384
  export type THarnessResourceAssociationRequestDetail<TState extends string = string> = {
357
385
  intent: 'attach';
358
386
  resource: IHarnessResourceMeta<TState>;
359
- fromSessionId: null;
360
- toSessionId: string;
387
+ fromTarget: null;
388
+ toTarget: IHarnessSessionListItemRef;
361
389
  source: THarnessResourceAssociationInteractionSource;
362
390
  } | {
363
391
  intent: 'detach';
364
392
  resource: IHarnessResourceMeta<TState>;
365
- fromSessionId: string;
366
- toSessionId: null;
393
+ fromTarget: IHarnessSessionListItemRef;
394
+ toTarget: null;
367
395
  source: THarnessResourceAssociationInteractionSource;
368
396
  } | {
369
397
  intent: 'reassign';
370
398
  resource: IHarnessResourceMeta<TState>;
371
- fromSessionId: string;
372
- toSessionId: string;
399
+ fromTarget: IHarnessSessionListItemRef;
400
+ toTarget: IHarnessSessionListItemRef;
373
401
  source: THarnessResourceAssociationInteractionSource;
374
402
  };
375
403
  export type THarnessResourceContextSource = 'pointer' | 'action' | 'keyboard';
@@ -380,7 +408,7 @@ export interface IHarnessResourceContextDetail<TState extends string = string> e
380
408
  source: THarnessResourceContextSource;
381
409
  originalEvent: MouseEvent | KeyboardEvent;
382
410
  /** Routes a host menu choice through the component's validated controlled request event. */
383
- requestAssociation: (toSessionId: string | null) => boolean;
411
+ requestAssociation: (toTarget: IHarnessSessionListItemRef | null) => boolean;
384
412
  /** Closes the external-menu disclosure state and restores focus to its invoking control. */
385
413
  close: () => void;
386
414
  }
@@ -393,21 +421,32 @@ export interface IHarnessSessionContextDetail {
393
421
  /** Pass synchronously to DeesContextmenu.openContextMenuWithOptions to retain its composed dialog owner. */
394
422
  originalEvent: MouseEvent;
395
423
  }
396
- /** A user-defined session group; ordering of `sessionIds` is the display order. */
424
+ /**
425
+ * A user-defined group of list items; ordering of `itemIds` is the display
426
+ * order. Sessions and resources may be members in any interleaving.
427
+ */
397
428
  export interface IHarnessSessionGroup {
398
429
  id: string;
399
430
  name: string;
400
- sessionIds: string[];
401
- }
402
- /** Detail of `harness-session-move`: a session was dropped into a group slot. */
403
- export interface IHarnessSessionMoveDetail {
404
- sessionId: string;
431
+ itemIds: IHarnessSessionListItemRef[];
432
+ }
433
+ export type THarnessItemMoveSource = 'pointer' | 'keyboard';
434
+ /** Detail of `harness-item-move`: one item landed in a new ordered position. */
435
+ export interface IHarnessItemMoveDetail {
436
+ item: IHarnessSessionListItemRef;
437
+ /** Group the item came from, or null for the ungrouped section. */
438
+ fromGroupId: string | null;
405
439
  /** Target group, or null for the ungrouped section. */
440
+ toGroupId: string | null;
441
+ /** Stable target anchor in the dragged-item-excluded order; null means append. */
442
+ beforeItem: IHarnessSessionListItemRef | null;
443
+ source: THarnessItemMoveSource;
444
+ }
445
+ /** The open insertion slot a drag currently targets. */
446
+ export interface IDropSlot {
406
447
  groupId: string | null;
407
- /** Compatibility insertion index using the pre-drag order for same-section moves. */
448
+ /** Index within the section's sortable, dragged-item-excluded order. */
408
449
  index: number;
409
- /** Stable target anchor in the dragged-card-excluded order; absent means append. */
410
- beforeSessionId?: string;
411
450
  }
412
451
  /** Detail of `harness-group-context`, fired on right-click of a group header. */
413
452
  export interface IHarnessGroupContextDetail {
@@ -132,6 +132,13 @@ export declare class DeesServiceLibLoader {
132
132
  * Get the singleton instance of DeesServiceLibLoader
133
133
  */
134
134
  static getInstance(): DeesServiceLibLoader;
135
+ /**
136
+ * Shares one in-flight load between concurrent callers — but only for as long
137
+ * as that load can still succeed. A rejected load clears its own cache entry,
138
+ * so the next call makes a fresh attempt instead of replaying a stale failure
139
+ * for the lifetime of the page. Every load below goes through this.
140
+ */
141
+ private shareLoad;
135
142
  /**
136
143
  * Load xterm terminal emulator from CDN
137
144
  * @returns Promise resolving to xterm module with Terminal class
@@ -49,6 +49,22 @@ export class DeesServiceLibLoader {
49
49
  }
50
50
  return DeesServiceLibLoader.instance;
51
51
  }
52
+ /**
53
+ * Shares one in-flight load between concurrent callers — but only for as long
54
+ * as that load can still succeed. A rejected load clears its own cache entry,
55
+ * so the next call makes a fresh attempt instead of replaying a stale failure
56
+ * for the lifetime of the page. Every load below goes through this.
57
+ */
58
+ shareLoad(loadArg, readArg, writeArg) {
59
+ const pending = loadArg();
60
+ writeArg(pending);
61
+ pending.catch(() => {
62
+ // Retract only this attempt; a newer one may already own the entry.
63
+ if (readArg() === pending)
64
+ writeArg(null);
65
+ });
66
+ return pending;
67
+ }
52
68
  /**
53
69
  * Load xterm terminal emulator from CDN
54
70
  * @returns Promise resolving to xterm module with Terminal class
@@ -60,7 +76,7 @@ export class DeesServiceLibLoader {
60
76
  if (this.xtermLoadingPromise) {
61
77
  return this.xtermLoadingPromise;
62
78
  }
63
- this.xtermLoadingPromise = (async () => {
79
+ return this.shareLoad(async () => {
64
80
  const url = `${CDN_BASE}/xterm@${CDN_VERSIONS.xterm}/+esm`;
65
81
  const module = await import(/* @vite-ignore */ url);
66
82
  // Also load and inject xterm CSS
@@ -69,8 +85,9 @@ export class DeesServiceLibLoader {
69
85
  Terminal: module.Terminal,
70
86
  };
71
87
  return this.xtermLib;
72
- })();
73
- return this.xtermLoadingPromise;
88
+ }, () => this.xtermLoadingPromise, (promiseArg) => {
89
+ this.xtermLoadingPromise = promiseArg;
90
+ });
74
91
  }
75
92
  /**
76
93
  * Provides xterm modules from the host application instead of the CDN.
@@ -109,15 +126,16 @@ export class DeesServiceLibLoader {
109
126
  if (this.xtermFitAddonLoadingPromise) {
110
127
  return this.xtermFitAddonLoadingPromise;
111
128
  }
112
- this.xtermFitAddonLoadingPromise = (async () => {
129
+ return this.shareLoad(async () => {
113
130
  const url = `${CDN_BASE}/xterm-addon-fit@${CDN_VERSIONS.xtermAddonFit}/+esm`;
114
131
  const module = await import(/* @vite-ignore */ url);
115
132
  this.xtermFitAddonLib = {
116
133
  FitAddon: module.FitAddon,
117
134
  };
118
135
  return this.xtermFitAddonLib;
119
- })();
120
- return this.xtermFitAddonLoadingPromise;
136
+ }, () => this.xtermFitAddonLoadingPromise, (promiseArg) => {
137
+ this.xtermFitAddonLoadingPromise = promiseArg;
138
+ });
121
139
  }
122
140
  /**
123
141
  * Load xterm-addon-search from CDN
@@ -130,15 +148,16 @@ export class DeesServiceLibLoader {
130
148
  if (this.xtermSearchAddonLoadingPromise) {
131
149
  return this.xtermSearchAddonLoadingPromise;
132
150
  }
133
- this.xtermSearchAddonLoadingPromise = (async () => {
151
+ return this.shareLoad(async () => {
134
152
  const url = `${CDN_BASE}/xterm-addon-search@${CDN_VERSIONS.xtermAddonSearch}/+esm`;
135
153
  const module = await import(/* @vite-ignore */ url);
136
154
  this.xtermSearchAddonLib = {
137
155
  SearchAddon: module.SearchAddon,
138
156
  };
139
157
  return this.xtermSearchAddonLib;
140
- })();
141
- return this.xtermSearchAddonLoadingPromise;
158
+ }, () => this.xtermSearchAddonLoadingPromise, (promiseArg) => {
159
+ this.xtermSearchAddonLoadingPromise = promiseArg;
160
+ });
142
161
  }
143
162
  /**
144
163
  * Inject xterm CSS styles into the document head
@@ -177,13 +196,14 @@ export class DeesServiceLibLoader {
177
196
  if (this.highlightJsLoadingPromise) {
178
197
  return this.highlightJsLoadingPromise;
179
198
  }
180
- this.highlightJsLoadingPromise = (async () => {
199
+ return this.shareLoad(async () => {
181
200
  const url = `${CDN_BASE}/highlight.js@${CDN_VERSIONS.highlightJs}/+esm`;
182
201
  const module = await import(/* @vite-ignore */ url);
183
202
  this.highlightJsLib = module.default;
184
203
  return this.highlightJsLib;
185
- })();
186
- return this.highlightJsLoadingPromise;
204
+ }, () => this.highlightJsLoadingPromise, (promiseArg) => {
205
+ this.highlightJsLoadingPromise = promiseArg;
206
+ });
187
207
  }
188
208
  /**
189
209
  * Load TradingView Lightweight Charts from CDN
@@ -196,7 +216,7 @@ export class DeesServiceLibLoader {
196
216
  if (this.lightweightChartsLoadingPromise) {
197
217
  return this.lightweightChartsLoadingPromise;
198
218
  }
199
- this.lightweightChartsLoadingPromise = (async () => {
219
+ return this.shareLoad(async () => {
200
220
  const url = `${CDN_BASE}/lightweight-charts@${CDN_VERSIONS.lightweightCharts}/+esm`;
201
221
  const module = await import(/* @vite-ignore */ url);
202
222
  this.lightweightChartsLib = {
@@ -208,8 +228,9 @@ export class DeesServiceLibLoader {
208
228
  CrosshairMode: module.CrosshairMode,
209
229
  };
210
230
  return this.lightweightChartsLib;
211
- })();
212
- return this.lightweightChartsLoadingPromise;
231
+ }, () => this.lightweightChartsLoadingPromise, (promiseArg) => {
232
+ this.lightweightChartsLoadingPromise = promiseArg;
233
+ });
213
234
  }
214
235
  /**
215
236
  * Load Apache ECharts from CDN
@@ -222,7 +243,7 @@ export class DeesServiceLibLoader {
222
243
  if (this.echartsLoadingPromise) {
223
244
  return this.echartsLoadingPromise;
224
245
  }
225
- this.echartsLoadingPromise = (async () => {
246
+ return this.shareLoad(async () => {
226
247
  // Use the pre-built ESM bundle which includes all chart types and components.
227
248
  // The +esm wrapper only exports the core without auto-registered chart types.
228
249
  const url = `${CDN_BASE}/echarts@${CDN_VERSIONS.echarts}/dist/echarts.esm.min.js`;
@@ -233,8 +254,9 @@ export class DeesServiceLibLoader {
233
254
  getInstanceByDom: module.getInstanceByDom,
234
255
  };
235
256
  return this.echartsLib;
236
- })();
237
- return this.echartsLoadingPromise;
257
+ }, () => this.echartsLoadingPromise, (promiseArg) => {
258
+ this.echartsLoadingPromise = promiseArg;
259
+ });
238
260
  }
239
261
  /**
240
262
  * Load Tiptap rich text editor and extensions from CDN
@@ -247,7 +269,7 @@ export class DeesServiceLibLoader {
247
269
  if (this.tiptapLoadingPromise) {
248
270
  return this.tiptapLoadingPromise;
249
271
  }
250
- this.tiptapLoadingPromise = (async () => {
272
+ return this.shareLoad(async () => {
251
273
  // Import directly from npm packages — bundled by esbuild into a single
252
274
  // module graph. CDN loading caused duplicate ProseMirror instances because
253
275
  // jsdelivr resolves each package's dependencies independently.
@@ -268,8 +290,9 @@ export class DeesServiceLibLoader {
268
290
  Typography: typographyModule.default || typographyModule.Typography,
269
291
  };
270
292
  return this.tiptapLib;
271
- })();
272
- return this.tiptapLoadingPromise;
293
+ }, () => this.tiptapLoadingPromise, (promiseArg) => {
294
+ this.tiptapLoadingPromise = promiseArg;
295
+ });
273
296
  }
274
297
  /**
275
298
  * Preload multiple libraries in parallel
@@ -310,4 +333,4 @@ export class DeesServiceLibLoader {
310
333
  }
311
334
  }
312
335
  }
313
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRGVlc1NlcnZpY2VMaWJMb2FkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90c193ZWIvc2VydmljZXMvRGVlc1NlcnZpY2VMaWJMb2FkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7QUE4R3ZEOzs7Ozs7Ozs7Ozs7R0FZRztBQUNILHVFQUF1RTtBQUN2RSxzRUFBc0U7QUFDdEUsOEVBQThFO0FBQzlFLE1BQU0sc0JBQXNCLEdBQUc7Ozs7O0NBSzlCLENBQUM7QUFFRixNQUFNLE9BQU8sb0JBQW9CO0lBQ3ZCLE1BQU0sQ0FBQyxRQUFRLENBQXVCO0lBRTlDLDRCQUE0QjtJQUNwQixRQUFRLEdBQXdCLElBQUksQ0FBQztJQUNyQyxnQkFBZ0IsR0FBZ0MsSUFBSSxDQUFDO0lBQ3JELG1CQUFtQixHQUFtQyxJQUFJLENBQUM7SUFDM0QsY0FBYyxHQUFtQixJQUFJLENBQUM7SUFDdEMsb0JBQW9CLEdBQW9DLElBQUksQ0FBQztJQUM3RCxVQUFVLEdBQTBCLElBQUksQ0FBQztJQUN6QyxTQUFTLEdBQXlCLElBQUksQ0FBQztJQUUvQyx5REFBeUQ7SUFDakQsbUJBQW1CLEdBQWlDLElBQUksQ0FBQztJQUN6RCwyQkFBMkIsR0FBeUMsSUFBSSxDQUFDO0lBQ3pFLDhCQUE4QixHQUE0QyxJQUFJLENBQUM7SUFDL0UseUJBQXlCLEdBQTRCLElBQUksQ0FBQztJQUMxRCwrQkFBK0IsR0FBNkMsSUFBSSxDQUFDO0lBQ2pGLHFCQUFxQixHQUFtQyxJQUFJLENBQUM7SUFDN0Qsb0JBQW9CLEdBQWtDLElBQUksQ0FBQztJQUVuRSxnQkFBdUIsQ0FBQztJQUV4Qjs7T0FFRztJQUNJLE1BQU0sQ0FBQyxXQUFXO1FBQ3ZCLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNuQyxvQkFBb0IsQ0FBQyxRQUFRLEdBQUcsSUFBSSxvQkFBb0Is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
336
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRGVlc1NlcnZpY2VMaWJMb2FkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90c193ZWIvc2VydmljZXMvRGVlc1NlcnZpY2VMaWJMb2FkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7QUE4R3ZEOzs7Ozs7Ozs7Ozs7R0FZRztBQUNILHVFQUF1RTtBQUN2RSxzRUFBc0U7QUFDdEUsOEVBQThFO0FBQzlFLE1BQU0sc0JBQXNCLEdBQUc7Ozs7O0NBSzlCLENBQUM7QUFFRixNQUFNLE9BQU8sb0JBQW9CO0lBQ3ZCLE1BQU0sQ0FBQyxRQUFRLENBQXVCO0lBRTlDLDRCQUE0QjtJQUNwQixRQUFRLEdBQXdCLElBQUksQ0FBQztJQUNyQyxnQkFBZ0IsR0FBZ0MsSUFBSSxDQUFDO0lBQ3JELG1CQUFtQixHQUFtQyxJQUFJLENBQUM7SUFDM0QsY0FBYyxHQUFtQixJQUFJLENBQUM7SUFDdEMsb0JBQW9CLEdBQW9DLElBQUksQ0FBQztJQUM3RCxVQUFVLEdBQTBCLElBQUksQ0FBQztJQUN6QyxTQUFTLEdBQXlCLElBQUksQ0FBQztJQUUvQyx5REFBeUQ7SUFDakQsbUJBQW1CLEdBQWlDLElBQUksQ0FBQztJQUN6RCwyQkFBMkIsR0FBeUMsSUFBSSxDQUFDO0lBQ3pFLDhCQUE4QixHQUE0QyxJQUFJLENBQUM7SUFDL0UseUJBQXlCLEdBQTRCLElBQUksQ0FBQztJQUMxRCwrQkFBK0IsR0FBNkMsSUFBSSxDQUFDO0lBQ2pGLHFCQUFxQixHQUFtQyxJQUFJLENBQUM7SUFDN0Qsb0JBQW9CLEdBQWtDLElBQUksQ0FBQztJQUVuRSxnQkFBdUIsQ0FBQztJQUV4Qjs7T0FFRztJQUNJLE1BQU0sQ0FBQyxXQUFXO1FBQ3ZCLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNuQyxvQkFBb0IsQ0FBQyxRQUFRLEdBQUcsSUFBSSxvQkFBb0Is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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@design.estate/dees-catalog",
3
- "version": "10.0.0",
3
+ "version": "11.1.0",
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",
@@ -62,7 +62,6 @@
62
62
  "assets/**/*",
63
63
  "scripts/**/*",
64
64
  "cli.js",
65
- ".smartconfig.json",
66
65
  "readme.md",
67
66
  "third-party-notices.md"
68
67
  ],
package/readme.md CHANGED
@@ -229,7 +229,7 @@ task guide and examples deliberately; the generated table does not replace them.
229
229
  | `dees-storage-keys` | dataview | — | [Source](ts_web/elements/00group-dataview/dees-storage-browser/dees-storage-keys.ts) |
230
230
  | `dees-storage-preview` | dataview | — | [Source](ts_web/elements/00group-dataview/dees-storage-browser/dees-storage-preview.ts) |
231
231
  | `dees-table` | dataview | [DeesTable](#deestable) | [Source](ts_web/elements/00group-dataview/dees-table/dees-table.ts) |
232
- | `dees-terminal-view` | harness | — | [Source](ts_web/elements/00group-harness/dees-terminal-view/dees-terminal-view.ts) |
232
+ | `dees-terminal-view` | harness | [DeesTerminalView](#deesterminalview) | [Source](ts_web/elements/00group-harness/dees-terminal-view/dees-terminal-view.ts) |
233
233
  | `dees-theme` | utility | [DeesTheme](#deestheme) | [Source](ts_web/elements/00group-utility/dees-theme/dees-theme.ts) |
234
234
  | `dees-thumbnail-audio` | media | [DeesThumbnailAudio](#deesthumbnailaudio) | [Source](ts_web/elements/00group-media/dees-thumbnail-audio/component.ts) |
235
235
  | `dees-thumbnail-folder` | media | [DeesThumbnailFolder](#deesthumbnailfolder) | [Source](ts_web/elements/00group-media/dees-thumbnail-folder/component.ts) |
@@ -2640,7 +2640,7 @@ Scrollable streaming-safe log. Up to 40 canonical entries (`messages` + `permiss
2640
2640
 
2641
2641
  `refreshMessages(ids?)` reconciles in-place host mutations without replacing canonical objects. With IDs, it refreshes only matching message rows that are currently mounted; matching offscreen rows remain unmounted and use the mutated canonical objects when later mounted. With IDs omitted, it rebuilds structural transcript state and refreshes all mounted rows. `[]` is a no-op.
2642
2642
 
2643
- Producers with authoritative source chronology can set `IHarnessMessage.order` to `{ messageIndex, partIndex }`; explicitly ordered messages retain that relative order while timestamps continue to place legacy messages and ancillary cards. 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. Consecutive same-layout runs are always capped at four cards per group row, even when their tool kinds differ. Columns respond to the row's own width rather than the viewport, and status changes never regroup cards. Because a compact group sits inside the content measure, its column count is bounded by that measure — two columns at the 820px default; the wider three- and four-column steps apply when a host widens `--dees-harness-content-width`. Rows are held to a reading measure — `--dees-harness-content-width`, default `820px`, capped at the available width — while terminal and file-write rows keep the full pane, so prose stays readable and diffs and command output get the room they need. A subagent group takes the pane only from three cards upward; one or two stay on the measure. The docked composer keeps its full-bleed bar and insets its content to the same measure, so the prompt lines up with the messages above it. Set the custom property on the chat or the list to widen or disable the column; it is read when rows are measured, so change it at mount rather than while a virtualized transcript is scrolled. Untouched projected subtask cards collapse individually on completion with the normal disclosure animation; other cards retain their descriptor or user-selected disclosure state. 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`, `viewState`, `transcriptKey`, `hasEarlierMessages`, `loadingEarlier`, `autoFollow`, `hideScrollbar`, `fadeScrollEdges`, `showRoles`, `showTimestamps`, `allowSubtaskStreams`, `markdownWhileStreaming` (default `true`), `emptyTitle`/`emptyText` (+ `slot="empty"`). Native browser find and selection cover the mounted window; hosts that require complete-history search or copy should operate on their canonical `messages`, `permissions`, and `questions` models.
2643
+ Producers with authoritative source chronology can set `IHarnessMessage.order` to `{ messageIndex, partIndex }`; explicitly ordered messages retain that relative order while timestamps continue to place legacy messages and ancillary cards. 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. Consecutive same-layout runs are always capped at four cards per group row, even when their tool kinds differ. Columns respond to the row's own width rather than the viewport, and status changes never regroup cards. Because a compact group sits inside the content measure, its column count is bounded by that measure — two columns at the 820px default; the wider three- and four-column steps apply when a host widens `--dees-harness-content-width`. Rows are held to a reading measure — `--dees-harness-content-width`, default `820px`, capped at the available width — while terminal and file-write rows keep the full pane, so prose stays readable and diffs and command output get the room they need. A subagent group takes the pane only from three cards upward; one or two stay on the measure. A terminal or file-write card that sits alone in its row keeps the pane only while it is open: once collapsed it returns to the reading measure, because a one-line header does not need the room its output did. The row itself still spans the pane; the card centres inside it and animates between the two widths with the standard disclosure timing. Cards that share a row as a multi-card grid keep their cell width in both states, since there the cell is the layout. The list publishes the collapsed width to its rows as `--dees-harness-collapsed-tool-width` (single cards only, derived from `--dees-harness-content-width`); a host can set it on a single row to widen that card, or set `100%` to keep collapsed cards full-bleed; setting it on the chat or the list also reaches grid cells, so prefer row-level overrides. The docked composer keeps its full-bleed bar and insets its content to the same measure, so the prompt lines up with the messages above it. Set the custom property on the chat or the list to widen or disable the column; it is read when rows are measured, so change it at mount rather than while a virtualized transcript is scrolled. Untouched projected subtask cards collapse individually on completion with the normal disclosure animation; other cards retain their descriptor or user-selected disclosure state. 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`, `viewState`, `transcriptKey`, `hasEarlierMessages`, `loadingEarlier`, `autoFollow`, `hideScrollbar`, `fadeScrollEdges`, `showRoles`, `showTimestamps`, `allowSubtaskStreams`, `markdownWhileStreaming` (default `true`), `emptyTitle`/`emptyText` (+ `slot="empty"`). Native browser find and selection cover the mounted window; hosts that require complete-history search or copy should operate on their canonical `messages`, `permissions`, and `questions` models.
2644
2644
 
2645
2645
  #### `DeesHarnessMessage`
2646
2646
 
@@ -2654,7 +2654,7 @@ One message: role accent, markdown (assistant default, `message.markdown` overri
2654
2654
 
2655
2655
  #### `DeesHarnessToolCard`
2656
2656
 
2657
- 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. A producer-supplied `IHarnessToolCall.title` leads the subtitle when present — a harness's own one-line description of the call, such as `Read SKILL.md` for a shell invocation — and the descriptor-derived line stays reachable as the hover tooltip; a blank title falls back to the derived line. 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, and a terminal card collapses itself again once its command can be proven to have succeeded, meaning an exit code of 0. A non-zero exit, an error, a stopped command, and a command that reports no exit code at all keep their output on screen — an absent exit code is not evidence of success, so a producer that reports a failed command as completed never has that failure hidden behind a summary. A collapsed terminal shows a one-line outcome (exit code, line count, and the last meaningful line) beneath the command. It is derived from the call's own output rather than from any producer-supplied description, so it is present for every producer. An explicit expand or collapse by the user always wins and is never overridden when the call settles. Descriptors opt in through `collapseWhenFinished` and supply the line through `summary`. 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. A subagent card is capped by `--dees-harness-active-subtask-height` (default `320px`) rather than fixed to it: a settled agent whose brief and result fit sizes to its own text, and only content past the cap hands the overflow to the panels, which scroll with a hidden scrollbar and a fade mask at the clipped edge. Both the Agent Brief and the Result carry that affordance, and the drill-in action stays pinned at the bottom of the card. A live child keeps the full window so its streaming transcript has a stable area to scroll in.
2657
+ 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. A producer-supplied `IHarnessToolCall.title` leads the subtitle when present — a harness's own one-line description of the call, such as `Read SKILL.md` for a shell invocation — and the descriptor-derived line stays reachable as the hover tooltip; a blank title falls back to the derived line. 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. A closed card also reflects `data-collapsed` on its host and honours `--dees-harness-collapsed-tool-width` as its own `max-width`, so a transcript row can hold a collapsed card to a narrower measure than an open one; unset — a direct tool-card host, a grid cell — the card fills its row in both states. Long outputs truncate at 6,000 chars with a "Show all" expander. Terminal and error cards open by default, and a terminal card collapses itself again once its command can be proven to have succeeded, meaning an exit code of 0. A non-zero exit, an error, a stopped command, and a command that reports no exit code at all keep their output on screen — an absent exit code is not evidence of success, so a producer that reports a failed command as completed never has that failure hidden behind a summary. A collapsed terminal shows a one-line outcome (exit code, line count, and the last meaningful line) beneath the command. It is derived from the call's own output rather than from any producer-supplied description, so it is present for every producer. An explicit expand or collapse by the user always wins and is never overridden when the call settles. Descriptors opt in through `collapseWhenFinished` and supply the line through `summary`. 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. A subagent card is capped by `--dees-harness-active-subtask-height` (default `320px`) rather than fixed to it: a settled agent whose brief and result fit sizes to its own text, and only content past the cap hands the overflow to the panels, which scroll with a hidden scrollbar and a fade mask at the clipped edge. Both the Agent Brief and the Result carry that affordance, and the drill-in action stays pinned at the bottom of the card. A live child keeps the full window so its streaming transcript has a stable area to scroll in.
2658
2658
 
2659
2659
  After mutating a canonical tool call in place, call `refreshCall()`. It refreshes the mounted card, any mounted nested subtask transcript, and any open fullscreen card while retaining the same canonical call and nested-message object references; it does not clone or replace them.
2660
2660
 
@@ -2751,6 +2751,14 @@ Idle/busy/error line with animated dots and `aria-live="polite"`. Renders nothin
2751
2751
 
2752
2752
  Token usage chip (`in · out · total`, `compact` shows the total only); cache read/write detail in the tooltip.
2753
2753
 
2754
+ #### `DeesTerminalView`
2755
+
2756
+ Transport-agnostic xterm.js surface. The host pipes remote PTY output in with `write(data)` and receives keystrokes as `terminal-input` (`{ data }`); there is no process, runtime or socket coupling. `terminal-resize` (`{ rows, cols }`) reports the grid after every refit so the host can negotiate a PTY size, and `currentSize` reads it back (`undefined` while no terminal is live). `fontSize` sets the grid font, `disabled` stops `terminal-input` from being emitted, and `focus()` focuses the grid. xterm is loaded through `DeesServiceLibLoader`; CSP-locked or offline hosts call `provideXtermModules()` first to supply their own bundled copy instead of the CDN.
2757
+
2758
+ `write()` is safe before the terminal exists and while the element is detached: output is buffered and replayed in order on the next connection, bounded by the exported `maxPendingWriteBytes` (8 MiB — `Uint8Array` chunks count their `byteLength`, strings their UTF-16 memory). Past that bound the oldest chunks are dropped and the replay emits RIS first, so a truncated prefix is never rendered as if it were contiguous. `clear()` resets screen and scrollback through the write stream (RIS, `ESC c`) rather than around it, so it is ordered against output already queued in xterm — write, `clear()`, write leaves only the later output on screen.
2759
+
2760
+ `ready` resolves once the terminal of the current connection is live; a fresh promise is created per connection, so a reattached element can be awaited again. Every connection builds a terminal and every disconnection disposes it, so an element moved between containers, or returned to, is a live surface rather than a dead one; buffered output survives the move. A failed xterm load is not an unhandled rejection: it dispatches the bubbling, composed `terminal-error` (`ITerminalErrorDetail { error }`), rejects `ready` with the same error, leaves the element writable, and is retried on the next connection. xterm's own flow-control refusal is reported the same way. Sizing comes from the host element — give it a bounded height, as the demo does.
2761
+
2754
2762
  #### `DeesHarnessSessionSidebar`
2755
2763
 
2756
2764
  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.
@@ -2765,17 +2773,29 @@ Searchable, card-based conversation column for sidebars or a `DeesModal` (`harne
2765
2773
 
2766
2774
  Each card exposes an Actions button. Actions, right-click, and ContextMenu/Shift+F10 on the primary or Actions control emit `harness-session-context` with the unchanged `IHarnessSessionContextDetail` (`session`, viewport `clientX`/`clientY`, and `originalEvent: MouseEvent`). Button and keyboard requests anchor the menu below the invoking control; pointer requests keep the pointer coordinates. Actions do not select, open, expand, or drag the session. Hosts own the menu choices and focus restoration. Call `DeesContextmenu.openContextMenuWithOptions(detail.originalEvent, items)` synchronously in the event handler, before any `await`, so the event's composed path retains the owning dialog. The session demo shows menu cleanup and focus restoration through `registerGarbageFunction()`.
2767
2775
 
2768
- `IHarnessSessionMeta.state` accepts `normal`, `working`, `finished`, `attention`, or `error`. Every collapsed row shows its status icon and text. Optional `statusLabel` refines the description (for example, `Starting`, `Waiting for feedback`, or `Approval needed`); blank labels fall back to the standard state name. Optional `harness: IHarnessAgentIdentity` supplies `{ id, name, icon? }`, independently of the model and state. The harness name stays on its own metadata line; omitted identity renders no guessed provider. Search includes harness names/ids and status labels.
2776
+ `IHarnessSessionMeta.state` accepts `normal`, `working`, `finished`, `attention`, or `error`. Every collapsed row shows its status icon and text. Optional `statusLabel` refines the description (for example, `Starting`, `Waiting for feedback`, or `Approval needed`); blank labels fall back to the standard state name. Optional `harness: IHarnessAgentIdentity` supplies `{ id, name, icon? }`, independently of the model and state. Optional `projectLabel` names the project or workspace the session belongs to and renders beside the harness on the same collapsed identity line, elided when it does not fit; it is host-owned and never derived from the title or id. The harness name stays on its own metadata line; omitted identity renders no guessed provider. Search includes harness names/ids, project labels and status labels.
2769
2777
 
2770
2778
  Attention and error rows retain a colored edge even when selected. Group headings count both states, including when collapsed. `working` controls the small activity pulse on normal/working rows, defaulting to `state === 'working'`; attention, error and finished indicators remain stationary. Reduced-motion preferences disable the pulse. State changes preserve row height, selection, expansion and host-provided order.
2771
2779
 
2772
- 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.
2780
+ **Sessions and resources are peers in one ordered list.** Every sortable row — conversation or resource — carries a focusable grip: drag it anywhere the other kind can go, including between sessions and into or out of groups, or reorder it with ArrowUp, ArrowDown, Home, and End. Pointer dragging moves a preview the size of the dragged row, opens a matching drop slot, and animates surrounding rows. Reordering does not require `enableGrouping`, which now only adds group chrome; an active search query renders one flat, non-sortable, recency-ordered section and cancels a drag in flight.
2781
+
2782
+ Every move emits `harness-item-move` with `IHarnessItemMoveDetail`: `{ item, fromGroupId, toGroupId, beforeItem, source }`, where `item` and `beforeItem` are `IHarnessSessionListItemRef` values (`{ kind: 'session' | 'resource'; id }`) and a null `beforeItem` means append. Groups hold `itemIds: IHarnessSessionListItemRef[]`, and `ungroupedItemIds` controls the order outside groups; omitted or unknown entries of either kind fall back to `updatedAt ?? createdAt` recency. Set `draggable: false` on a session or a resource for pinned entries such as terminals; pinned entries sort first in the ungrouped section and stay outside the sortable order.
2773
2783
 
2774
2784
  The compact **New group** button sits beside search whenever `enableGrouping` is true, including while filtering, and emits `harness-group-create-request`. The host owns creation; the list keeps its current search until the host chooses to clear it. The demo clears search after adding the group. Both search and the group action use 44px targets for coarse pointers.
2775
2785
 
2776
2786
  The Sessions demo pairs the list with a selected-session workspace. Its controls step through starting, working, feedback, approval, completion and failure without timers or backend operations. Question and permission responses update the selected session; declining approval pauses it. The narrow layout switches between the preserved list and detail panes with an **All sessions** control that restores row focus.
2777
2787
 
2778
- Generic host resources use the exported `IHarnessResourceMeta` and `IHarnessResourceAssociation` contracts. Set `.resources`, `.resourceAssociations`, `.selectedResourceId`, and `.eligibleSessionIdsByResourceId`. Unattached resources render in a labelled **Resources** list; attached resources render as compact persistent child rows inside their exact session article and stay visible while session details are collapsed. Resource metadata is presentation-only: the list never mounts a terminal, browser, file viewer, or other runtime.
2788
+ Generic host resources use the exported `IHarnessResourceMeta` and `IHarnessResourceAssociation` contracts. Set `.resources`, `.resourceAssociations`, `.selectedResourceId`, and `.eligibleTargetsByResourceId`. Resource rows render as top-level rows in the ordered list, never as children of a session. Optional `projectLabel` renders on the resource metadata line after the kind and is searched like the title and preview. Resource metadata is presentation-only: the list never mounts a terminal, browser, file viewer, or other runtime.
2789
+
2790
+ **Attaching is a separate explicit action, not a drop.** An association is an access grant: it shows as a decorative marker on the resource row (a link icon plus the target's title, resolved from `sessions` or `resources` regardless of search or collapse) and never moves the row. Dropping is purely positional and never attaches. The association stays single-valued — a resource has at most one target — and the target is any other item, so a resource may be attached to a session **or** to another resource such as a terminal:
2791
+
2792
+ ```typescript
2793
+ list.resourceAssociations = [
2794
+ { resourceId: 'file:notes', target: { kind: 'resource', id: 'terminal:build' } },
2795
+ ];
2796
+ ```
2797
+
2798
+ Association records are projected only when the resource exists, the target exists, the target is not the resource itself, and no earlier record claimed that resource. `eligibleTargetsByResourceId` restricts attach/reassign targets for host menus: a missing entry leaves the resource unrestricted, an empty array means no eligible target. Which resource kinds may host an attachment is the host's rule, not the component's.
2779
2799
 
2780
2800
  ```typescript
2781
2801
  import type {
@@ -2790,17 +2810,17 @@ list.resources = [
2790
2810
  { id: 'file:notes', kind: 'file', title: 'Release notes', preview: '6.7.0 draft' },
2791
2811
  ];
2792
2812
  list.resourceAssociations = [
2793
- { resourceId: 'shell:build', sessionId: 'session-1' },
2813
+ { resourceId: 'shell:build', target: { kind: 'session', id: 'session-1' } },
2794
2814
  ];
2795
- list.eligibleSessionIdsByResourceId = {
2796
- 'shell:build': ['session-1', 'session-2'],
2797
- 'file:notes': ['session-2'],
2815
+ list.eligibleTargetsByResourceId = {
2816
+ 'shell:build': [{ kind: 'session', id: 'session-1' }, { kind: 'session', id: 'session-2' }],
2817
+ 'file:notes': [{ kind: 'session', id: 'session-2' }, { kind: 'resource', id: 'shell:build' }],
2798
2818
  };
2799
2819
 
2800
2820
  list.addEventListener('harness-resource-association-request', async (event) => {
2801
2821
  const resourceEvent = event as CustomEvent<THarnessResourceAssociationRequestDetail>;
2802
- const { resource, toSessionId } = resourceEvent.detail;
2803
- await persistAssociation(resource.id, toSessionId);
2822
+ const { resource, toTarget } = resourceEvent.detail;
2823
+ await persistAssociation(resource.id, toTarget);
2804
2824
  list.resourceAssociations = await loadAssociations();
2805
2825
  });
2806
2826
 
@@ -2809,20 +2829,20 @@ list.addEventListener('harness-resource-context', (event) => {
2809
2829
  openHostMenu({
2810
2830
  x: resourceEvent.detail.clientX,
2811
2831
  y: resourceEvent.detail.clientY,
2812
- attach: (sessionId) => resourceEvent.detail.requestAssociation(sessionId),
2832
+ attach: (target) => resourceEvent.detail.requestAssociation(target),
2813
2833
  detach: () => resourceEvent.detail.requestAssociation(null),
2814
2834
  onClose: resourceEvent.detail.close,
2815
2835
  });
2816
2836
  });
2817
2837
  ```
2818
2838
 
2819
- `harness-resource-select` and `harness-resource-open` carry `{ resource, sessionId }`. `harness-resource-context` adds viewport coordinates, the pointer/Actions/keyboard source, the original event, `requestAssociation(toSessionId)`, and `close()` for focus restoration. The visible Actions button has menu disclosure semantics; native `ContextMenu` and `Shift+F10` invoke the same host-owned path. The component does not require `DeesContextmenu` and does not own menu choices.
2839
+ `harness-resource-select` and `harness-resource-open` carry `{ resource, target }`, where `target` is the controlled association ref or null. `harness-resource-context` adds viewport coordinates, the pointer/Actions/keyboard source, the original event, `requestAssociation(toTarget)`, and `close()` for focus restoration. The visible Actions button has menu disclosure semantics; native `ContextMenu` and `Shift+F10` invoke the same host-owned path. The component does not require `DeesContextmenu` and does not own menu choices.
2820
2840
 
2821
- All component-originated association request paths converge on the public `requestResourceAssociation(resourceId, toSessionId, source?)` method. A valid change emits one bubbling/composed `harness-resource-association-request` discriminated by `intent: 'attach' | 'detach' | 'reassign'` and carrying `resource`, `fromSessionId`, `toSessionId`, and `source: 'drop' | 'action' | 'keyboard'`. The method returns `false` and emits nothing for unknown resources/sessions, ineligible targets, detach from an unattached resource, or the current target. It never mutates resources, associations, selection, session groups, or session order.
2841
+ All component-originated association request paths converge on the public `requestResourceAssociation(resourceId, toTarget, source?)` method. A valid change emits one bubbling/composed `harness-resource-association-request` discriminated by `intent: 'attach' | 'detach' | 'reassign'` and carrying `resource`, `fromTarget`, `toTarget`, and `source: 'action' | 'keyboard'`. The method returns `false` and emits nothing for unknown resources, unknown or ineligible targets, a target that is the resource itself, detach from an unattached resource, or the current target. It never mutates resources, associations, selection, groups, or order.
2822
2842
 
2823
- Association projection is deterministic and non-destructive: resource records without a non-empty ID, kind, or title, unknown resource/session references, and later duplicate records for a resource are ignored; the first valid association wins. Duplicate resource metadata IDs likewise use the first resource. Missing eligibility entries mean no eligible attach/reassign target. Eligibility does not hide an existing authoritative association, which remains visible and detachable. Requested changes are announced separately from completion; completion is announced only after the controlled association input reflects the requested target.
2843
+ Association projection is deterministic and non-destructive: resource records without a non-empty ID, kind, or title, unknown resource/target references, self-targets, and later duplicate records for a resource are ignored; the first valid association wins. Duplicate resource metadata IDs likewise use the first resource. Eligibility does not hide an existing authoritative association, which remains visible and detachable. Requested changes are announced separately from completion; completion is announced only after the controlled association input reflects the requested target.
2824
2844
 
2825
- Search covers resource ID, kind, title, and preview. A matching attached resource reveals its parent session and only matching children; a matching session reveals all its resources; matching unattached resources remain in **Resources**. Resources render with zero sessions. Resource grip dragging edge-scrolls the list and targets only eligible whole session cards, including hits on nested card content, while never creating session reorder placeholders or emitting `harness-session-move`. Use the Actions/context path for keyboard and mobile association workflows; coarse-pointer grip and Actions targets are at least 44px.
2845
+ Search covers resource ID, kind, title, and preview, and matches sessions and resources as peers — a matching session no longer reveals its attached resources, and a matching resource no longer reveals its target. Resources render with zero sessions. Resource dragging edge-scrolls the list exactly like session dragging and emits only `harness-item-move`. Use the Actions/context path for keyboard and mobile association workflows; coarse-pointer grip and Actions targets are at least 44px.
2826
2846
 
2827
2847
  ---
2828
2848
 
@@ -3,6 +3,6 @@
3
3
  */
4
4
  export const commitinfo = {
5
5
  name: '@design.estate/dees-catalog',
6
- version: '10.0.0',
6
+ version: '11.1.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
  }
@@ -69,6 +69,29 @@ const toolShowcase = (): IHarnessMessage[] => {
69
69
  finishedAt: now - 152_000,
70
70
  },
71
71
  },
72
+ {
73
+ id: 'demo-t4',
74
+ role: 'assistant',
75
+ text: 'Re-ran the suite to confirm the cache key fix.',
76
+ createdAt: now - 140_000,
77
+ },
78
+ // A terminal card alone in its row: expanded it takes the pane, and once it collapses it
79
+ // returns to the reading measure like the prose around it.
80
+ {
81
+ id: 'demo-t5',
82
+ role: 'tool',
83
+ text: '',
84
+ createdAt: now - 130_000,
85
+ toolCall: {
86
+ id: 'call-5',
87
+ name: 'run_command',
88
+ status: 'completed',
89
+ input: { command: 'pnpm test --filter sitemap', cwd: '/srv/app' },
90
+ output: { exitCode: 0, stdout: '14 tests passed\n0 failed' },
91
+ startedAt: now - 136_000,
92
+ finishedAt: now - 131_000,
93
+ },
94
+ },
72
95
  ];
73
96
  };
74
97
 
@@ -343,6 +343,18 @@ export class DeesHarnessMessageList extends DeesElement {
343
343
  width: 100%;
344
344
  }
345
345
 
346
+ /*
347
+ * The pane is what an open command or diff needs, not what its one-line collapsed header
348
+ * needs, so a closed card returns to the reading measure inside its row. Only a row holding
349
+ * a single card offers it: in a multi-card grid the cell width is the layout, and shrinking
350
+ * one card would break the row. The card applies this itself — it alone knows whether it is
351
+ * open — and the measure stays defined here, with the rest of the column rules.
352
+ */
353
+ .stack > [data-tool-layout='full-row'][data-tool-count='1'],
354
+ .virtualItem[data-tool-layout='full-row'][data-tool-count='1'] {
355
+ --dees-harness-collapsed-tool-width: min(var(--dees-harness-content-width, 820px), 100%);
356
+ }
357
+
346
358
  /*
347
359
  * One or two subagents are read like any other content, so they stay on the measure. The
348
360
  * pane is only worth taking once three or more cards have to sit side by side.