@design.estate/dees-catalog 6.0.0 → 6.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/dist_bundle/bundle.js +3105 -1500
  2. package/dist_ts_web/00_commitinfo_data.js +1 -1
  3. package/dist_ts_web/elements/00group-harness/dees-harness-chat/dees-harness-chat.d.ts +2 -0
  4. package/dist_ts_web/elements/00group-harness/dees-harness-chat/dees-harness-chat.demo.js +484 -8
  5. package/dist_ts_web/elements/00group-harness/dees-harness-chat/dees-harness-chat.js +10 -1
  6. package/dist_ts_web/elements/00group-harness/dees-harness-message/dees-harness-message.d.ts +3 -1
  7. package/dist_ts_web/elements/00group-harness/dees-harness-message/dees-harness-message.js +24 -4
  8. package/dist_ts_web/elements/00group-harness/dees-harness-message-list/dees-harness-message-list.d.ts +26 -0
  9. package/dist_ts_web/elements/00group-harness/dees-harness-message-list/dees-harness-message-list.js +398 -94
  10. package/dist_ts_web/elements/00group-harness/dees-harness-overflow-text.d.ts +32 -0
  11. package/dist_ts_web/elements/00group-harness/dees-harness-overflow-text.demo.d.ts +1 -0
  12. package/dist_ts_web/elements/00group-harness/dees-harness-overflow-text.demo.js +31 -0
  13. package/dist_ts_web/elements/00group-harness/dees-harness-overflow-text.js +297 -0
  14. package/dist_ts_web/elements/00group-harness/dees-harness-session-list/dees-harness-session-list.js +1 -9
  15. package/dist_ts_web/elements/00group-harness/dees-harness-session-sidebar/dees-harness-session-sidebar.d.ts +10 -1
  16. package/dist_ts_web/elements/00group-harness/dees-harness-session-sidebar/dees-harness-session-sidebar.js +181 -2
  17. package/dist_ts_web/elements/00group-harness/dees-harness-tool-card/dees-harness-tool-card.d.ts +17 -1
  18. package/dist_ts_web/elements/00group-harness/dees-harness-tool-card/dees-harness-tool-card.js +480 -36
  19. package/dist_ts_web/elements/00group-harness/dees-harness-tool-card/renderers.js +28 -24
  20. package/dist_ts_web/elements/00group-harness/harness.helpers.d.ts +5 -1
  21. package/dist_ts_web/elements/00group-harness/harness.helpers.js +66 -1
  22. package/dist_ts_web/elements/00group-harness/index.d.ts +1 -0
  23. package/dist_ts_web/elements/00group-harness/index.js +2 -1
  24. package/dist_ts_web/elements/00group-harness/interfaces.d.ts +33 -2
  25. package/dist_ts_web/elements/00group-harness/toolregistry.d.ts +4 -0
  26. package/dist_ts_web/elements/00group-harness/toolregistry.js +8 -1
  27. package/package.json +2 -2
  28. package/readme.hints.md +16 -1
  29. package/readme.md +41 -9
  30. package/readme.playbook.md +8 -4
  31. package/ts_web/00_commitinfo_data.ts +1 -1
  32. package/ts_web/elements/00group-harness/dees-harness-chat/dees-harness-chat.demo.ts +490 -7
  33. package/ts_web/elements/00group-harness/dees-harness-chat/dees-harness-chat.ts +9 -0
  34. package/ts_web/elements/00group-harness/dees-harness-message/dees-harness-message.ts +24 -3
  35. package/ts_web/elements/00group-harness/dees-harness-message-list/dees-harness-message-list.ts +397 -84
  36. package/ts_web/elements/00group-harness/dees-harness-overflow-text.demo.ts +31 -0
  37. package/ts_web/elements/00group-harness/dees-harness-overflow-text.ts +236 -0
  38. package/ts_web/elements/00group-harness/dees-harness-session-list/dees-harness-session-list.ts +0 -8
  39. package/ts_web/elements/00group-harness/dees-harness-session-sidebar/dees-harness-session-sidebar.ts +193 -1
  40. package/ts_web/elements/00group-harness/dees-harness-tool-card/dees-harness-tool-card.ts +484 -34
  41. package/ts_web/elements/00group-harness/dees-harness-tool-card/renderers.ts +29 -25
  42. package/ts_web/elements/00group-harness/harness.helpers.ts +68 -1
  43. package/ts_web/elements/00group-harness/index.ts +1 -0
  44. package/ts_web/elements/00group-harness/interfaces.ts +38 -2
  45. package/ts_web/elements/00group-harness/toolregistry.ts +12 -0
@@ -37,6 +37,7 @@ import { DeesElement, html, css, customElement, property, state, cssManager, dir
37
37
  import { themeDefaultStyles } from '../../00theme.js';
38
38
  import { DeesHarnessMessage } from '../dees-harness-message/dees-harness-message.js';
39
39
  import { DeesHarnessToolRegistry } from '../toolregistry.js';
40
+ import { harnessApplyMessageDelta } from '../harness.helpers.js';
40
41
  import '../dees-harness-status/dees-harness-status.js';
41
42
  import '../dees-harness-permission-card/dees-harness-permission-card.js';
42
43
  import '../dees-harness-question-card/dees-harness-question-card.js';
@@ -74,9 +75,18 @@ let DeesHarnessMessageList = (() => {
74
75
  let _autoFollow_decorators;
75
76
  let _autoFollow_initializers = [];
76
77
  let _autoFollow_extraInitializers = [];
78
+ let _hideScrollbar_decorators;
79
+ let _hideScrollbar_initializers = [];
80
+ let _hideScrollbar_extraInitializers = [];
81
+ let _fadeScrollEdges_decorators;
82
+ let _fadeScrollEdges_initializers = [];
83
+ let _fadeScrollEdges_extraInitializers = [];
77
84
  let _toolRegistry_decorators;
78
85
  let _toolRegistry_initializers = [];
79
86
  let _toolRegistry_extraInitializers = [];
87
+ let _allowSubtaskStreams_decorators;
88
+ let _allowSubtaskStreams_initializers = [];
89
+ let _allowSubtaskStreams_extraInitializers = [];
80
90
  let _showRoles_decorators;
81
91
  let _showRoles_initializers = [];
82
92
  let _showRoles_extraInitializers = [];
@@ -95,6 +105,12 @@ let DeesHarnessMessageList = (() => {
95
105
  let _entryAnimationsEnabled_decorators;
96
106
  let _entryAnimationsEnabled_initializers = [];
97
107
  let _entryAnimationsEnabled_extraInitializers = [];
108
+ let _scrollFadeTop_decorators;
109
+ let _scrollFadeTop_initializers = [];
110
+ let _scrollFadeTop_extraInitializers = [];
111
+ let _scrollFadeBottom_decorators;
112
+ let _scrollFadeBottom_initializers = [];
113
+ let _scrollFadeBottom_extraInitializers = [];
98
114
  var DeesHarnessMessageList = class extends _classSuper {
99
115
  static { _classThis = this; }
100
116
  static {
@@ -105,26 +121,36 @@ let DeesHarnessMessageList = (() => {
105
121
  _permissionsBusy_decorators = [property({ type: Boolean })];
106
122
  _questions_decorators = [property({ attribute: false })];
107
123
  _autoFollow_decorators = [property({ type: Boolean })];
124
+ _hideScrollbar_decorators = [property({ type: Boolean })];
125
+ _fadeScrollEdges_decorators = [property({ type: Boolean })];
108
126
  _toolRegistry_decorators = [property({ attribute: false })];
127
+ _allowSubtaskStreams_decorators = [property({ type: Boolean })];
109
128
  _showRoles_decorators = [property({ type: Boolean })];
110
129
  _showTimestamps_decorators = [property({ type: Boolean })];
111
130
  _emptyTitle_decorators = [property()];
112
131
  _emptyText_decorators = [property()];
113
132
  _showJumpChip_decorators = [state()];
114
133
  _entryAnimationsEnabled_decorators = [state()];
134
+ _scrollFadeTop_decorators = [state()];
135
+ _scrollFadeBottom_decorators = [state()];
115
136
  __esDecorate(this, null, _messages_decorators, { kind: "accessor", name: "messages", static: false, private: false, access: { has: obj => "messages" in obj, get: obj => obj.messages, set: (obj, value) => { obj.messages = value; } }, metadata: _metadata }, _messages_initializers, _messages_extraInitializers);
116
137
  __esDecorate(this, null, _status_decorators, { kind: "accessor", name: "status", static: false, private: false, access: { has: obj => "status" in obj, get: obj => obj.status, set: (obj, value) => { obj.status = value; } }, metadata: _metadata }, _status_initializers, _status_extraInitializers);
117
138
  __esDecorate(this, null, _permissions_decorators, { kind: "accessor", name: "permissions", static: false, private: false, access: { has: obj => "permissions" in obj, get: obj => obj.permissions, set: (obj, value) => { obj.permissions = value; } }, metadata: _metadata }, _permissions_initializers, _permissions_extraInitializers);
118
139
  __esDecorate(this, null, _permissionsBusy_decorators, { kind: "accessor", name: "permissionsBusy", static: false, private: false, access: { has: obj => "permissionsBusy" in obj, get: obj => obj.permissionsBusy, set: (obj, value) => { obj.permissionsBusy = value; } }, metadata: _metadata }, _permissionsBusy_initializers, _permissionsBusy_extraInitializers);
119
140
  __esDecorate(this, null, _questions_decorators, { kind: "accessor", name: "questions", static: false, private: false, access: { has: obj => "questions" in obj, get: obj => obj.questions, set: (obj, value) => { obj.questions = value; } }, metadata: _metadata }, _questions_initializers, _questions_extraInitializers);
120
141
  __esDecorate(this, null, _autoFollow_decorators, { kind: "accessor", name: "autoFollow", static: false, private: false, access: { has: obj => "autoFollow" in obj, get: obj => obj.autoFollow, set: (obj, value) => { obj.autoFollow = value; } }, metadata: _metadata }, _autoFollow_initializers, _autoFollow_extraInitializers);
142
+ __esDecorate(this, null, _hideScrollbar_decorators, { kind: "accessor", name: "hideScrollbar", static: false, private: false, access: { has: obj => "hideScrollbar" in obj, get: obj => obj.hideScrollbar, set: (obj, value) => { obj.hideScrollbar = value; } }, metadata: _metadata }, _hideScrollbar_initializers, _hideScrollbar_extraInitializers);
143
+ __esDecorate(this, null, _fadeScrollEdges_decorators, { kind: "accessor", name: "fadeScrollEdges", static: false, private: false, access: { has: obj => "fadeScrollEdges" in obj, get: obj => obj.fadeScrollEdges, set: (obj, value) => { obj.fadeScrollEdges = value; } }, metadata: _metadata }, _fadeScrollEdges_initializers, _fadeScrollEdges_extraInitializers);
121
144
  __esDecorate(this, null, _toolRegistry_decorators, { kind: "accessor", name: "toolRegistry", static: false, private: false, access: { has: obj => "toolRegistry" in obj, get: obj => obj.toolRegistry, set: (obj, value) => { obj.toolRegistry = value; } }, metadata: _metadata }, _toolRegistry_initializers, _toolRegistry_extraInitializers);
145
+ __esDecorate(this, null, _allowSubtaskStreams_decorators, { kind: "accessor", name: "allowSubtaskStreams", static: false, private: false, access: { has: obj => "allowSubtaskStreams" in obj, get: obj => obj.allowSubtaskStreams, set: (obj, value) => { obj.allowSubtaskStreams = value; } }, metadata: _metadata }, _allowSubtaskStreams_initializers, _allowSubtaskStreams_extraInitializers);
122
146
  __esDecorate(this, null, _showRoles_decorators, { kind: "accessor", name: "showRoles", static: false, private: false, access: { has: obj => "showRoles" in obj, get: obj => obj.showRoles, set: (obj, value) => { obj.showRoles = value; } }, metadata: _metadata }, _showRoles_initializers, _showRoles_extraInitializers);
123
147
  __esDecorate(this, null, _showTimestamps_decorators, { kind: "accessor", name: "showTimestamps", static: false, private: false, access: { has: obj => "showTimestamps" in obj, get: obj => obj.showTimestamps, set: (obj, value) => { obj.showTimestamps = value; } }, metadata: _metadata }, _showTimestamps_initializers, _showTimestamps_extraInitializers);
124
148
  __esDecorate(this, null, _emptyTitle_decorators, { kind: "accessor", name: "emptyTitle", static: false, private: false, access: { has: obj => "emptyTitle" in obj, get: obj => obj.emptyTitle, set: (obj, value) => { obj.emptyTitle = value; } }, metadata: _metadata }, _emptyTitle_initializers, _emptyTitle_extraInitializers);
125
149
  __esDecorate(this, null, _emptyText_decorators, { kind: "accessor", name: "emptyText", static: false, private: false, access: { has: obj => "emptyText" in obj, get: obj => obj.emptyText, set: (obj, value) => { obj.emptyText = value; } }, metadata: _metadata }, _emptyText_initializers, _emptyText_extraInitializers);
126
150
  __esDecorate(this, null, _showJumpChip_decorators, { kind: "accessor", name: "showJumpChip", static: false, private: false, access: { has: obj => "showJumpChip" in obj, get: obj => obj.showJumpChip, set: (obj, value) => { obj.showJumpChip = value; } }, metadata: _metadata }, _showJumpChip_initializers, _showJumpChip_extraInitializers);
127
151
  __esDecorate(this, null, _entryAnimationsEnabled_decorators, { kind: "accessor", name: "entryAnimationsEnabled", static: false, private: false, access: { has: obj => "entryAnimationsEnabled" in obj, get: obj => obj.entryAnimationsEnabled, set: (obj, value) => { obj.entryAnimationsEnabled = value; } }, metadata: _metadata }, _entryAnimationsEnabled_initializers, _entryAnimationsEnabled_extraInitializers);
152
+ __esDecorate(this, null, _scrollFadeTop_decorators, { kind: "accessor", name: "scrollFadeTop", static: false, private: false, access: { has: obj => "scrollFadeTop" in obj, get: obj => obj.scrollFadeTop, set: (obj, value) => { obj.scrollFadeTop = value; } }, metadata: _metadata }, _scrollFadeTop_initializers, _scrollFadeTop_extraInitializers);
153
+ __esDecorate(this, null, _scrollFadeBottom_decorators, { kind: "accessor", name: "scrollFadeBottom", static: false, private: false, access: { has: obj => "scrollFadeBottom" in obj, get: obj => obj.scrollFadeBottom, set: (obj, value) => { obj.scrollFadeBottom = value; } }, metadata: _metadata }, _scrollFadeBottom_initializers, _scrollFadeBottom_extraInitializers);
128
154
  __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
129
155
  DeesHarnessMessageList = _classThis = _classDescriptor.value;
130
156
  if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
@@ -152,10 +178,20 @@ let DeesHarnessMessageList = (() => {
152
178
  #autoFollow_accessor_storage = (__runInitializers(this, _questions_extraInitializers), __runInitializers(this, _autoFollow_initializers, true));
153
179
  get autoFollow() { return this.#autoFollow_accessor_storage; }
154
180
  set autoFollow(value) { this.#autoFollow_accessor_storage = value; }
155
- #toolRegistry_accessor_storage = (__runInitializers(this, _autoFollow_extraInitializers), __runInitializers(this, _toolRegistry_initializers, DeesHarnessToolRegistry.default));
181
+ #hideScrollbar_accessor_storage = (__runInitializers(this, _autoFollow_extraInitializers), __runInitializers(this, _hideScrollbar_initializers, false));
182
+ get hideScrollbar() { return this.#hideScrollbar_accessor_storage; }
183
+ set hideScrollbar(value) { this.#hideScrollbar_accessor_storage = value; }
184
+ #fadeScrollEdges_accessor_storage = (__runInitializers(this, _hideScrollbar_extraInitializers), __runInitializers(this, _fadeScrollEdges_initializers, false));
185
+ get fadeScrollEdges() { return this.#fadeScrollEdges_accessor_storage; }
186
+ set fadeScrollEdges(value) { this.#fadeScrollEdges_accessor_storage = value; }
187
+ #toolRegistry_accessor_storage = (__runInitializers(this, _fadeScrollEdges_extraInitializers), __runInitializers(this, _toolRegistry_initializers, DeesHarnessToolRegistry.default));
156
188
  get toolRegistry() { return this.#toolRegistry_accessor_storage; }
157
189
  set toolRegistry(value) { this.#toolRegistry_accessor_storage = value; }
158
- #showRoles_accessor_storage = (__runInitializers(this, _toolRegistry_extraInitializers), __runInitializers(this, _showRoles_initializers, true));
190
+ #allowSubtaskStreams_accessor_storage = (__runInitializers(this, _toolRegistry_extraInitializers), __runInitializers(this, _allowSubtaskStreams_initializers, true));
191
+ /** Nested transcripts set this false to prevent recursive inline streams. */
192
+ get allowSubtaskStreams() { return this.#allowSubtaskStreams_accessor_storage; }
193
+ set allowSubtaskStreams(value) { this.#allowSubtaskStreams_accessor_storage = value; }
194
+ #showRoles_accessor_storage = (__runInitializers(this, _allowSubtaskStreams_extraInitializers), __runInitializers(this, _showRoles_initializers, true));
159
195
  get showRoles() { return this.#showRoles_accessor_storage; }
160
196
  set showRoles(value) { this.#showRoles_accessor_storage = value; }
161
197
  #showTimestamps_accessor_storage = (__runInitializers(this, _showRoles_extraInitializers), __runInitializers(this, _showTimestamps_initializers, false));
@@ -173,6 +209,15 @@ let DeesHarnessMessageList = (() => {
173
209
  #entryAnimationsEnabled_accessor_storage = (__runInitializers(this, _showJumpChip_extraInitializers), __runInitializers(this, _entryAnimationsEnabled_initializers, false));
174
210
  get entryAnimationsEnabled() { return this.#entryAnimationsEnabled_accessor_storage; }
175
211
  set entryAnimationsEnabled(value) { this.#entryAnimationsEnabled_accessor_storage = value; }
212
+ #scrollFadeTop_accessor_storage = (__runInitializers(this, _entryAnimationsEnabled_extraInitializers), __runInitializers(this, _scrollFadeTop_initializers, false));
213
+ get scrollFadeTop() { return this.#scrollFadeTop_accessor_storage; }
214
+ set scrollFadeTop(value) { this.#scrollFadeTop_accessor_storage = value; }
215
+ #scrollFadeBottom_accessor_storage = (__runInitializers(this, _scrollFadeTop_extraInitializers), __runInitializers(this, _scrollFadeBottom_initializers, false));
216
+ get scrollFadeBottom() { return this.#scrollFadeBottom_accessor_storage; }
217
+ set scrollFadeBottom(value) { this.#scrollFadeBottom_accessor_storage = value; }
218
+ toolGroupIdByMessageId = (__runInitializers(this, _scrollFadeBottom_extraInitializers), new Map());
219
+ nextToolGroupId = 1;
220
+ timelineRenderItems = [];
176
221
  static styles = [
177
222
  themeDefaultStyles,
178
223
  cssManager.defaultStyles,
@@ -189,10 +234,47 @@ let DeesHarnessMessageList = (() => {
189
234
  .scroll {
190
235
  height: 100%;
191
236
  overflow-y: auto;
237
+ overscroll-behavior: contain;
192
238
  scrollbar-width: thin;
193
239
  scrollbar-color: var(--dees-color-scrollbar-thumb) transparent;
194
240
  padding: var(--dees-spacing-md);
195
241
  box-sizing: border-box;
242
+ container: harness-transcript / inline-size;
243
+ }
244
+
245
+ .scroll.hideScrollbar {
246
+ scrollbar-width: none;
247
+ }
248
+
249
+ .scroll.hideScrollbar::-webkit-scrollbar {
250
+ display: none;
251
+ }
252
+
253
+ .scroll.fadeTop {
254
+ -webkit-mask-image: linear-gradient(to bottom, transparent 0, black 40px, black 100%);
255
+ mask-image: linear-gradient(to bottom, transparent 0, black 40px, black 100%);
256
+ }
257
+
258
+ .scroll.fadeBottom {
259
+ -webkit-mask-image: linear-gradient(to bottom, black 0, black calc(100% - 40px), transparent 100%);
260
+ mask-image: linear-gradient(to bottom, black 0, black calc(100% - 40px), transparent 100%);
261
+ }
262
+
263
+ .scroll.fadeTop.fadeBottom {
264
+ -webkit-mask-image: linear-gradient(
265
+ to bottom,
266
+ transparent 0,
267
+ black 40px,
268
+ black calc(100% - 40px),
269
+ transparent 100%
270
+ );
271
+ mask-image: linear-gradient(
272
+ to bottom,
273
+ transparent 0,
274
+ black 40px,
275
+ black calc(100% - 40px),
276
+ transparent 100%
277
+ );
196
278
  }
197
279
 
198
280
  /* observed by the follow ResizeObserver; fills the viewport so the
@@ -203,14 +285,62 @@ let DeesHarnessMessageList = (() => {
203
285
  flex-direction: column;
204
286
  }
205
287
 
206
- .stack {
288
+ ::slotted([slot='leading']) {
207
289
  display: block;
290
+ min-width: 0;
291
+ margin-bottom: var(--dees-spacing-sm);
292
+ }
293
+
294
+ .stack {
295
+ display: grid;
296
+ grid-template-columns: minmax(0, 1fr);
297
+ gap: var(--dees-spacing-sm);
298
+ }
299
+
300
+ .stack > * {
301
+ min-width: 0;
302
+ grid-column: 1 / -1;
303
+ }
304
+
305
+ .toolGroup {
306
+ min-width: 0;
307
+ }
308
+
309
+ .toolGrid {
310
+ display: grid;
311
+ grid-template-columns: minmax(0, 1fr);
312
+ gap: var(--dees-spacing-sm);
313
+ min-width: 0;
314
+ }
315
+
316
+ .toolGrid > dees-harness-message {
317
+ min-width: 0;
318
+ align-self: start;
208
319
  }
209
320
 
210
- /* spacing via sibling margins (not grid gap) so a new entry's margin
211
- animates together with its height while it fades in */
212
- .stack > * + * {
213
- margin-top: var(--dees-spacing-sm);
321
+ .toolGrid > dees-harness-message[data-tool-layout='full-row'] {
322
+ grid-column: 1 / -1;
323
+ }
324
+
325
+ @container harness-transcript (min-width: 760px) {
326
+ .toolGrid.toolCount2,
327
+ .toolGrid.toolCount3,
328
+ .toolGrid.toolCount4 {
329
+ grid-template-columns: repeat(2, minmax(0, 1fr));
330
+ }
331
+ }
332
+
333
+ @container harness-transcript (min-width: 1120px) {
334
+ .toolGrid.toolCount3,
335
+ .toolGrid.toolCount4 {
336
+ grid-template-columns: repeat(3, minmax(0, 1fr));
337
+ }
338
+ }
339
+
340
+ @container harness-transcript (min-width: 1480px) {
341
+ .toolGrid.toolCount4 {
342
+ grid-template-columns: repeat(4, minmax(0, 1fr));
343
+ }
214
344
  }
215
345
 
216
346
  .statusRow {
@@ -260,34 +390,18 @@ let DeesHarnessMessageList = (() => {
260
390
  .jumpChip:hover {
261
391
  background: var(--dees-material-thick-bg);
262
392
  }
393
+
263
394
  `,
264
395
  ];
265
396
  /** messages and permissions merged chronologically (stable ids as keys) */
266
397
  get timelineItems() {
267
- // Running subagents pin near the end — live activity belongs where the
268
- // eye is — ordered by start time among themselves, and still ABOVE
269
- // pending permission/question cards (those demand action). On completion
270
- // a subagent returns to its chronological position in the flow.
271
- // Stale ones do not pin: a "running" call is orphaned when the session
272
- // itself is idle (nothing can still be running it), or ancient when 20+
273
- // messages have passed it by.
274
- const runningSubagentBase = Number.MAX_SAFE_INTEGER / 2;
275
- const sessionActive = this.status?.type === 'busy';
276
- const items = this.messages.map((message, index) => {
277
- const call = message.toolCall;
278
- const runningSubagent = Boolean(call)
279
- && (call.name === 'task' || call.name === 'subagent' || call.kind === 'subtask')
280
- && (call.status === 'pending' || call.status === 'running');
281
- const stale = !sessionActive || this.messages.length - 1 - index >= 20;
282
- return {
283
- kind: 'message',
284
- time: runningSubagent && !stale
285
- ? runningSubagentBase + (message.createdAt || 0)
286
- : message.createdAt || 0,
287
- key: message.id,
288
- message,
289
- };
290
- });
398
+ const items = this.messages.map((message) => ({
399
+ kind: 'message',
400
+ time: message.createdAt || 0,
401
+ key: `message:${message.id}`,
402
+ message,
403
+ toolLayout: message.toolCall ? this.toolRegistry.resolveLayout(message.toolCall) : null,
404
+ }));
291
405
  for (const request of this.permissions) {
292
406
  items.push({
293
407
  kind: 'permission',
@@ -296,7 +410,7 @@ let DeesHarnessMessageList = (() => {
296
410
  time: request.response
297
411
  ? (request.respondedAt ?? request.createdAt ?? 0)
298
412
  : Number.MAX_SAFE_INTEGER,
299
- key: `perm:${request.id}`,
413
+ key: `permission:${request.id}`,
300
414
  request,
301
415
  });
302
416
  }
@@ -312,38 +426,86 @@ let DeesHarnessMessageList = (() => {
312
426
  }
313
427
  return items.sort((left, right) => left.time - right.time);
314
428
  }
315
- render() {
429
+ buildTimelineRenderItems() {
316
430
  const items = this.timelineItems;
431
+ const retainedToolIds = new Set(items
432
+ .filter((item) => item.kind === 'message' && item.toolLayout !== null)
433
+ .map((item) => item.message.id));
434
+ for (const messageId of this.toolGroupIdByMessageId.keys()) {
435
+ if (!retainedToolIds.has(messageId))
436
+ this.toolGroupIdByMessageId.delete(messageId);
437
+ }
438
+ const result = [];
439
+ const usedGroupIds = new Set();
440
+ for (let index = 0; index < items.length;) {
441
+ const item = items[index];
442
+ if (item.kind !== 'message' || item.toolLayout === null) {
443
+ result.push(item);
444
+ index += 1;
445
+ continue;
446
+ }
447
+ const layout = item.toolLayout;
448
+ const run = [];
449
+ while (index < items.length) {
450
+ const candidate = items[index];
451
+ if (candidate.kind !== 'message'
452
+ || candidate.toolLayout !== layout)
453
+ break;
454
+ run.push(candidate);
455
+ index += 1;
456
+ }
457
+ this.appendToolRun(result, run, layout, usedGroupIds);
458
+ }
459
+ return result;
460
+ }
461
+ willUpdate(changedProperties) {
462
+ super.willUpdate(changedProperties);
463
+ this.timelineRenderItems = this.buildTimelineRenderItems();
464
+ }
465
+ appendToolRun(targetArg, runArg, layoutArg, usedGroupIdsArg) {
466
+ const groupId = runArg
467
+ .map((item) => this.toolGroupIdByMessageId.get(item.message.id))
468
+ .find((candidate) => candidate !== undefined && !usedGroupIdsArg.has(candidate))
469
+ ?? `tool-group-${this.nextToolGroupId++}`;
470
+ usedGroupIdsArg.add(groupId);
471
+ for (const item of runArg) {
472
+ this.toolGroupIdByMessageId.set(item.message.id, groupId);
473
+ }
474
+ targetArg.push({
475
+ kind: 'tool-group',
476
+ key: groupId,
477
+ layout: layoutArg,
478
+ messages: runArg,
479
+ });
480
+ }
481
+ render() {
482
+ const items = this.timelineRenderItems;
317
483
  return html `
318
484
  <div
319
- class="scroll"
485
+ class=${`scroll ${this.hideScrollbar ? 'hideScrollbar' : ''} ${this.scrollFadeTop ? 'fadeTop' : ''} ${this.scrollFadeBottom ? 'fadeBottom' : ''}`}
320
486
  @scroll=${this.handleScroll}
321
487
  @wheel=${this.handleUserScrollIntent}
322
488
  @touchmove=${this.handleUserScrollIntent}
489
+ @pointerdown=${this.handleUserScrollIntent}
490
+ @keydown=${this.handleUserScrollIntent}
323
491
  >
324
492
  <div class="scrollContent">
493
+ <slot name="leading"></slot>
325
494
  ${items.length
326
495
  ? html `
327
496
  <div class="stack">
328
- ${repeat(items, (item) => item.key, (item) => item.kind === 'message'
329
- ? html `
330
- <dees-harness-message
331
- data-message-id=${item.message.id}
332
- .message=${item.message}
333
- .showRole=${this.showRoles}
334
- .showTimestamp=${this.showTimestamps}
335
- .toolRegistry=${this.toolRegistry}
336
- .suppressEntry=${!this.entryAnimationsEnabled}
337
- ></dees-harness-message>
338
- `
339
- : item.kind === 'permission'
340
- ? html `
497
+ ${repeat(items, (item) => item.key, (item) => item.kind === 'tool-group'
498
+ ? this.renderToolGroup(item)
499
+ : item.kind === 'message'
500
+ ? this.renderMessage(item)
501
+ : item.kind === 'permission'
502
+ ? html `
341
503
  <dees-harness-permission-card
342
504
  .request=${item.request}
343
505
  .busy=${this.permissionsBusy}
344
506
  ></dees-harness-permission-card>
345
507
  `
346
- : html `
508
+ : html `
347
509
  <dees-harness-question-card
348
510
  .request=${item.question}
349
511
  .busy=${this.permissionsBusy}
@@ -372,6 +534,35 @@ let DeesHarnessMessageList = (() => {
372
534
  </button>
373
535
  `
374
536
  : ''}
537
+ `;
538
+ }
539
+ renderMessage(itemArg) {
540
+ return html `
541
+ <dees-harness-message
542
+ data-message-id=${itemArg.message.id}
543
+ data-tool-layout=${itemArg.toolLayout ?? 'message'}
544
+ .message=${itemArg.message}
545
+ .showRole=${this.showRoles}
546
+ .showTimestamp=${this.showTimestamps}
547
+ .toolRegistry=${this.toolRegistry}
548
+ .allowSubtaskStreams=${this.allowSubtaskStreams}
549
+ .suppressEntry=${!this.entryAnimationsEnabled}
550
+ ></dees-harness-message>
551
+ `;
552
+ }
553
+ renderToolGroup(groupArg) {
554
+ const count = groupArg.messages.length;
555
+ const countClass = count >= 4 ? 'toolCount4' : `toolCount${count}`;
556
+ return html `
557
+ <section
558
+ class="toolGroup"
559
+ data-tool-group-id=${groupArg.key}
560
+ data-tool-layout=${groupArg.layout}
561
+ >
562
+ <div class=${`toolGrid ${countClass}`}>
563
+ ${repeat(groupArg.messages, (item) => item.key, (item) => this.renderMessage(item))}
564
+ </div>
565
+ </section>
375
566
  `;
376
567
  }
377
568
  // ------------------------------------------------------------------ deltas
@@ -381,6 +572,24 @@ let DeesHarnessMessageList = (() => {
381
572
  * idempotent; only the target element re-renders.
382
573
  */
383
574
  applyDelta(delta) {
575
+ if (delta.parentMessageId) {
576
+ if (!this.allowSubtaskStreams)
577
+ return;
578
+ const parentMessage = this.messages.find((candidate) => candidate.id === delta.parentMessageId);
579
+ if (!parentMessage)
580
+ return;
581
+ const parentElement = this.messageElement(delta.parentMessageId);
582
+ const { parentMessageId: _parentMessageId, ...childDelta } = delta;
583
+ const localDelta = childDelta;
584
+ const appliedByElement = parentElement?.applySubtaskDelta(localDelta) ?? false;
585
+ if (!appliedByElement && parentMessage.toolCall?.subtask?.previewState === 'ready') {
586
+ if (harnessApplyMessageDelta(parentMessage.toolCall.subtask.messages, localDelta)) {
587
+ parentElement?.requestUpdate();
588
+ }
589
+ }
590
+ this.followAfterContentChange();
591
+ return;
592
+ }
384
593
  const message = this.messages.find((candidate) => candidate.id === delta.messageId);
385
594
  if (!message)
386
595
  return;
@@ -389,54 +598,37 @@ let DeesHarnessMessageList = (() => {
389
598
  case 'text':
390
599
  if (element)
391
600
  element.appendTextDelta(delta.delta);
392
- else {
393
- message.text += delta.delta;
394
- message.streaming = true;
395
- }
601
+ else
602
+ harnessApplyMessageDelta(this.messages, delta);
396
603
  break;
397
604
  case 'reasoning-start':
398
605
  if (element)
399
606
  element.appendReasoningDelta(delta.partId, '', delta.startedAt);
400
- else {
401
- message.reasoning ??= [];
402
- message.reasoning.push({ id: delta.partId, text: '', startedAt: delta.startedAt ?? Date.now() });
403
- }
607
+ else
608
+ harnessApplyMessageDelta(this.messages, delta);
404
609
  break;
405
610
  case 'reasoning':
406
611
  if (element)
407
612
  element.appendReasoningDelta(delta.partId, delta.delta);
408
- else {
409
- message.reasoning ??= [];
410
- const part = message.reasoning.find((candidate) => candidate.id === delta.partId);
411
- if (part)
412
- part.text += delta.delta;
413
- else
414
- message.reasoning.push({ id: delta.partId, text: delta.delta, startedAt: Date.now() });
415
- }
613
+ else
614
+ harnessApplyMessageDelta(this.messages, delta);
416
615
  break;
417
616
  case 'reasoning-end':
418
617
  if (element)
419
618
  element.endReasoning(delta.partId, delta.endedAt);
420
- else {
421
- const part = message.reasoning?.find((candidate) => candidate.id === delta.partId);
422
- if (part)
423
- part.endedAt = delta.endedAt ?? Date.now();
424
- }
619
+ else
620
+ harnessApplyMessageDelta(this.messages, delta);
425
621
  break;
426
622
  case 'tool-update':
427
623
  message.toolCall = { ...(message.toolCall ?? { id: delta.tool.id, name: '', status: 'pending' }), ...delta.tool };
428
624
  element?.requestUpdate();
625
+ this.requestUpdate();
429
626
  break;
430
627
  case 'message-end':
431
628
  if (element)
432
629
  element.endStream(delta.usage, delta.error);
433
- else {
434
- message.streaming = false;
435
- if (delta.usage)
436
- message.usage = delta.usage;
437
- if (delta.error)
438
- message.error = delta.error;
439
- }
630
+ else
631
+ harnessApplyMessageDelta(this.messages, delta);
440
632
  break;
441
633
  }
442
634
  this.followAfterContentChange();
@@ -455,9 +647,15 @@ let DeesHarnessMessageList = (() => {
455
647
  return true;
456
648
  return container.scrollHeight - container.scrollTop - container.clientHeight < pinThresholdPx;
457
649
  }
458
- contentResizeObserver = (__runInitializers(this, _entryAnimationsEnabled_extraInitializers), null);
650
+ contentResizeObserver = null;
651
+ observedScrollContent = null;
652
+ observedContentBlockSize = null;
653
+ followFrame = null;
654
+ followSecondFrame = null;
655
+ entryFrame = null;
656
+ entrySecondFrame = null;
459
657
  // Intent-based following: the list stays pinned until the user explicitly
460
- // moves away from the bottom (wheel/touch upward or a scrollbar drag), and
658
+ // moves away from the bottom (wheel/touch/keyboard or a scrollbar drag), and
461
659
  // re-pins the moment they return. Late layout growth — async markdown
462
660
  // parses, images, entry animations — re-pins through the content
463
661
  // ResizeObserver for as long as the user has not left the bottom, so
@@ -480,13 +678,33 @@ let DeesHarnessMessageList = (() => {
480
678
  this.showJumpChip = true;
481
679
  return;
482
680
  }
483
- this.repinToBottom();
484
- // catch the first post-render layout; later growth re-pins via the observer
485
- requestAnimationFrame(() => requestAnimationFrame(this.repinToBottom));
681
+ this.repinAfterContentGrowth();
682
+ // Catch post-render growth; later asynchronous growth uses the observer.
683
+ if (this.followFrame !== null || this.followSecondFrame !== null)
684
+ return;
685
+ this.followFrame = requestAnimationFrame(() => {
686
+ this.followFrame = null;
687
+ if (!this.isConnected)
688
+ return;
689
+ this.repinAfterContentGrowth();
690
+ this.followSecondFrame = requestAnimationFrame(() => {
691
+ this.followSecondFrame = null;
692
+ if (!this.isConnected)
693
+ return;
694
+ this.repinAfterContentGrowth();
695
+ });
696
+ });
486
697
  }
487
698
  handleUserScrollIntent = (event) => {
699
+ if (event.composedPath().some((candidate) => candidate instanceof DeesHarnessMessageList && candidate !== this))
700
+ return;
488
701
  if (event.type === 'wheel' && event.deltaY >= 0)
489
702
  return;
703
+ if (event.type === 'keydown'
704
+ && !['ArrowUp', 'PageUp', 'Home'].includes(event.key))
705
+ return;
706
+ if (event.type === 'pointerdown' && event.target !== this.scrollContainer)
707
+ return;
490
708
  this.userUnpinned = true;
491
709
  };
492
710
  scrollToBottom(force = false) {
@@ -501,12 +719,14 @@ let DeesHarnessMessageList = (() => {
501
719
  this.lastObservedScrollTop = container.scrollTop;
502
720
  this.showJumpChip = false;
503
721
  }
722
+ this.syncScrollEdgeFades();
504
723
  }
505
724
  handleScroll = () => {
506
725
  const container = this.scrollContainer;
507
726
  if (!container)
508
727
  return;
509
728
  const top = container.scrollTop;
729
+ this.syncScrollEdgeFades();
510
730
  if (this.isPinnedToBottom) {
511
731
  // reaching the bottom — by any means — resumes following
512
732
  this.userUnpinned = false;
@@ -514,10 +734,6 @@ let DeesHarnessMessageList = (() => {
514
734
  this.showJumpChip = false;
515
735
  }
516
736
  }
517
- else if (top < this.lastObservedScrollTop - 1) {
518
- // moved up without our doing (scrollbar drag, keyboard): stop following
519
- this.userUnpinned = true;
520
- }
521
737
  this.lastObservedScrollTop = top;
522
738
  };
523
739
  updated(changedProperties) {
@@ -525,24 +741,112 @@ let DeesHarnessMessageList = (() => {
525
741
  if (changedProperties.has('messages') || changedProperties.has('status') || changedProperties.has('permissions') || changedProperties.has('questions')) {
526
742
  this.followAfterContentChange();
527
743
  }
744
+ if (changedProperties.has('autoFollow')) {
745
+ if (this.autoFollow) {
746
+ this.connectContentResizeObserver();
747
+ this.scrollToBottom(true);
748
+ }
749
+ else
750
+ this.disconnectContentResizeObserver();
751
+ }
752
+ if (changedProperties.has('fadeScrollEdges')
753
+ || changedProperties.has('messages')
754
+ || changedProperties.has('permissions')
755
+ || changedProperties.has('questions'))
756
+ this.syncScrollEdgeFades();
528
757
  }
529
758
  firstUpdated(changedProperties) {
530
759
  super.firstUpdated(changedProperties);
531
- const content = this.shadowRoot?.querySelector('.scrollContent');
532
- if (content) {
533
- this.contentResizeObserver = new ResizeObserver(this.repinToBottom);
534
- this.contentResizeObserver.observe(content);
535
- }
760
+ if (!this.isConnected)
761
+ return;
762
+ this.connectContentResizeObserver();
763
+ this.repinToBottom();
764
+ this.syncScrollEdgeFades();
536
765
  // let the initial batch paint without entry animations, then enable them
537
- requestAnimationFrame(() => {
538
- requestAnimationFrame(() => {
766
+ this.entryFrame = requestAnimationFrame(() => {
767
+ this.entryFrame = null;
768
+ if (!this.isConnected)
769
+ return;
770
+ this.entrySecondFrame = requestAnimationFrame(() => {
771
+ this.entrySecondFrame = null;
772
+ if (!this.isConnected)
773
+ return;
539
774
  this.entryAnimationsEnabled = true;
540
775
  });
541
776
  });
542
777
  }
543
- async disconnectedCallback() {
778
+ async connectedCallback() {
779
+ const connected = super.connectedCallback();
780
+ if (this.hasUpdated)
781
+ this.connectContentResizeObserver();
782
+ await connected;
783
+ }
784
+ connectContentResizeObserver() {
785
+ if (!this.isConnected || !this.autoFollow)
786
+ return;
787
+ const content = this.shadowRoot?.querySelector('.scrollContent');
788
+ if (!content || (this.contentResizeObserver && content === this.observedScrollContent))
789
+ return;
790
+ this.contentResizeObserver?.disconnect();
791
+ this.observedContentBlockSize = content.getBoundingClientRect().height;
792
+ this.contentResizeObserver = new ResizeObserver((entries) => {
793
+ const entry = entries.find((candidate) => candidate.target === this.observedScrollContent);
794
+ if (!entry)
795
+ return;
796
+ const blockSize = entry.borderBoxSize[0]?.blockSize ?? entry.contentRect.height;
797
+ this.handleContentBlockSize(blockSize);
798
+ });
799
+ this.contentResizeObserver.observe(content);
800
+ this.observedScrollContent = content;
801
+ }
802
+ repinAfterContentGrowth() {
803
+ const content = this.observedScrollContent;
804
+ if (!content)
805
+ return;
806
+ this.handleContentBlockSize(content.getBoundingClientRect().height);
807
+ }
808
+ handleContentBlockSize(blockSizeArg) {
809
+ const previousBlockSize = this.observedContentBlockSize;
810
+ this.observedContentBlockSize = blockSizeArg;
811
+ // Disclosure collapse and window eviction are not new streamed content.
812
+ // Let the browser handle shrink instead of fighting it with repins.
813
+ if (previousBlockSize !== null && blockSizeArg > previousBlockSize + 0.5) {
814
+ this.repinToBottom();
815
+ }
816
+ this.syncScrollEdgeFades();
817
+ }
818
+ syncScrollEdgeFades() {
819
+ const container = this.scrollContainer;
820
+ const fadeTop = Boolean(this.fadeScrollEdges && container && container.scrollTop > 1);
821
+ const fadeBottom = Boolean(this.fadeScrollEdges
822
+ && container
823
+ && container.scrollHeight - container.scrollTop - container.clientHeight > 1);
824
+ if (this.scrollFadeTop !== fadeTop)
825
+ this.scrollFadeTop = fadeTop;
826
+ if (this.scrollFadeBottom !== fadeBottom)
827
+ this.scrollFadeBottom = fadeBottom;
828
+ }
829
+ disconnectContentResizeObserver() {
544
830
  this.contentResizeObserver?.disconnect();
545
831
  this.contentResizeObserver = null;
832
+ this.observedScrollContent = null;
833
+ this.observedContentBlockSize = null;
834
+ }
835
+ async disconnectedCallback() {
836
+ if (this.followFrame !== null)
837
+ cancelAnimationFrame(this.followFrame);
838
+ if (this.followSecondFrame !== null)
839
+ cancelAnimationFrame(this.followSecondFrame);
840
+ if (this.entryFrame !== null)
841
+ cancelAnimationFrame(this.entryFrame);
842
+ if (this.entrySecondFrame !== null)
843
+ cancelAnimationFrame(this.entrySecondFrame);
844
+ this.followFrame = null;
845
+ this.followSecondFrame = null;
846
+ this.entryFrame = null;
847
+ this.entrySecondFrame = null;
848
+ this.entryAnimationsEnabled = true;
849
+ this.disconnectContentResizeObserver();
546
850
  await super.disconnectedCallback();
547
851
  }
548
852
  static {
@@ -552,4 +856,4 @@ let DeesHarnessMessageList = (() => {
552
856
  return DeesHarnessMessageList = _classThis;
553
857
  })();
554
858
  export { DeesHarnessMessageList };
555
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVlcy1oYXJuZXNzLW1lc3NhZ2UtbGlzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLWhhcm5lc3MvZGVlcy1oYXJuZXNzLW1lc3NhZ2UtbGlzdC9kZWVzLWhhcm5lc3MtbWVzc2FnZS1saXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDL0QsT0FBTyxFQUNMLFdBQVcsRUFDWCxJQUFJLEVBQ0osR0FBRyxFQUNILGFBQWEsRUFFYixRQUFRLEVBQ1IsS0FBSyxFQUNMLFVBQVUsRUFDVixVQUFVLEdBQ1gsTUFBTSw2QkFBNkIsQ0FBQztBQUNyQyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUV0RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxpREFBaUQsQ0FBQztBQUNyRixPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUM3RCxPQUFPLCtDQUErQyxDQUFDO0FBQ3ZELE9BQU8saUVBQWlFLENBQUM7QUFDekUsT0FBTyw2REFBNkQsQ0FBQztBQUNyRSxPQUFPLDhDQUE4QyxDQUFDO0FBRXRELE1BQU0sRUFBRSxNQUFNLEVBQUUsR0FBRyxVQUFVLENBQUM7QUFROUIsTUFBTSxjQUFjLEdBQUcsRUFBRSxDQUFDO0FBTzFCOzs7Ozs7R0FNRztJQUVVLHNCQUFzQjs0QkFEbEMsYUFBYSxDQUFDLDJCQUEyQixDQUFDOzs7O3NCQUNDLFdBQVc7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7c0NBQW5CLFNBQVEsV0FBVzs7OztvQ0FJcEQsUUFBUSxDQUFDLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxDQUFDO2tDQUc5QixRQUFRLENBQUMsRUFBRSxTQUFTLEVBQUUs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
859
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVlcy1oYXJuZXNzLW1lc3NhZ2UtbGlzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLWhhcm5lc3MvZGVlcy1oYXJuZXNzLW1lc3NhZ2UtbGlzdC9kZWVzLWhhcm5lc3MtbWVzc2FnZS1saXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDL0QsT0FBTyxFQUNMLFdBQVcsRUFDWCxJQUFJLEVBQ0osR0FBRyxFQUNILGFBQWEsRUFFYixRQUFRLEVBQ1IsS0FBSyxFQUNMLFVBQVUsRUFDVixVQUFVLEdBQ1gsTUFBTSw2QkFBNkIsQ0FBQztBQUNyQyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQVN0RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxpREFBaUQsQ0FBQztBQUNyRixPQUFPLEVBQUUsdUJBQXVCLEVBQTJCLE1BQU0sb0JBQW9CLENBQUM7QUFDdEYsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDakUsT0FBTywrQ0FBK0MsQ0FBQztBQUN2RCxPQUFPLGlFQUFpRSxDQUFDO0FBQ3pFLE9BQU8sNkRBQTZELENBQUM7QUFDckUsT0FBTyw4Q0FBOEMsQ0FBQztBQUV0RCxNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsVUFBVSxDQUFDO0FBUTlCLE1BQU0sY0FBYyxHQUFHLEVBQUUsQ0FBQztBQXdCMUI7Ozs7OztHQU1HO0lBRVUsc0JBQXNCOzRCQURsQyxhQUFhLENBQUMsMkJBQTJCLENBQUM7Ozs7c0JBQ0MsV0FBVzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztzQ0FBbkIsU0FBUSxXQUFXOzs7O29DQUlwRCxRQUFRLENBQUMs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