@design.estate/dees-catalog 9.7.0 → 9.8.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 +194 -45
  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-appui/dees-appui/dees-appui.js +6 -1
  5. package/dist_ts_web/elements/00group-harness/dees-harness-composer/dees-harness-composer.js +14 -4
  6. package/dist_ts_web/elements/00group-harness/dees-harness-message-list/dees-harness-message-list.d.ts +4 -0
  7. package/dist_ts_web/elements/00group-harness/dees-harness-message-list/dees-harness-message-list.js +52 -1
  8. package/dist_ts_web/elements/00group-harness/dees-harness-tool-card/dees-harness-tool-card.d.ts +4 -1
  9. package/dist_ts_web/elements/00group-harness/dees-harness-tool-card/dees-harness-tool-card.js +93 -20
  10. package/dist_ts_web/elements/00group-harness/dees-harness-tool-card/renderers.js +7 -21
  11. package/dist_ts_web/elements/00group-harness/harness.helpers.d.ts +20 -0
  12. package/dist_ts_web/elements/00group-harness/harness.helpers.js +58 -1
  13. package/dist_ts_web/elements/00group-harness/interfaces.d.ts +6 -0
  14. package/dist_ts_web/elements/00group-harness/toolregistry.d.ts +8 -0
  15. package/dist_ts_web/elements/00group-harness/toolregistry.js +10 -2
  16. package/package.json +2 -2
  17. package/readme.md +2 -2
  18. package/ts_web/00_commitinfo_data.ts +1 -1
  19. package/ts_web/elements/00group-appui/dees-appui/dees-appui.ts +4 -0
  20. package/ts_web/elements/00group-harness/dees-harness-composer/dees-harness-composer.ts +12 -3
  21. package/ts_web/elements/00group-harness/dees-harness-message-list/dees-harness-message-list.ts +50 -0
  22. package/ts_web/elements/00group-harness/dees-harness-tool-card/dees-harness-tool-card.ts +95 -23
  23. package/ts_web/elements/00group-harness/dees-harness-tool-card/renderers.ts +7 -20
  24. package/ts_web/elements/00group-harness/harness.helpers.ts +63 -0
  25. package/ts_web/elements/00group-harness/interfaces.ts +6 -0
  26. package/ts_web/elements/00group-harness/toolregistry.ts +22 -1
@@ -165269,6 +165269,8 @@ var _DeesAppui = class _DeesAppui extends (_a75 = DeesElement, _appbarMenuItems_
165269
165269
  this.searchCallback = config2.onSearch;
165270
165270
  }
165271
165271
  const initialRoute = this.viewRegistry.findByRoute(window.location.hash.slice(1));
165272
+ const initialViewId = initialRoute?.view.id ?? config2.defaultView;
165273
+ if (initialViewId) this.setMainMenuSelection(initialViewId);
165272
165274
  if (initialRoute) {
165273
165275
  void this.queueNavigation(initialRoute.view.id, initialRoute.params, initialRoute.query, "replace");
165274
165276
  } else if (config2.defaultView) {
@@ -168585,6 +168587,45 @@ var harnessSummarizeValue = /* @__PURE__ */ __name((value2) => {
168585
168587
  var harnessSummaryLine = /* @__PURE__ */ __name((value2) => {
168586
168588
  return harnessSummarizeValue(value2).split("\n")[0] || "";
168587
168589
  }, "harnessSummaryLine");
168590
+ var ansiEscapePattern = /\x1b\[[0-9;?]*[A-Za-z]|\x1b\][^\x07]*(?:\x07|\x1b\\)|\x1b[=>]/g;
168591
+ var harnessStripAnsi = /* @__PURE__ */ __name((text8) => text8.replace(ansiEscapePattern, ""), "harnessStripAnsi");
168592
+ var harnessTerminalOutcome = /* @__PURE__ */ __name((callArg) => {
168593
+ const output = callArg.output;
168594
+ let stdout = "";
168595
+ let stderr = "";
168596
+ let nestedExitCode;
168597
+ if (harnessIsRecord(output)) {
168598
+ stdout = typeof output.stdout === "string" ? output.stdout : harnessStringifyValue(output.stdout ?? "");
168599
+ stderr = typeof output.stderr === "string" ? output.stderr : "";
168600
+ nestedExitCode = typeof output.exitCode === "number" ? output.exitCode : void 0;
168601
+ } else {
168602
+ stdout = harnessStringifyValue(output);
168603
+ }
168604
+ const exitCode3 = typeof callArg.exitCode === "number" ? callArg.exitCode : nestedExitCode;
168605
+ return { stdout, stderr, ...exitCode3 === void 0 ? {} : { exitCode: exitCode3 } };
168606
+ }, "harnessTerminalOutcome");
168607
+ var harnessLastMeaningfulLine = /* @__PURE__ */ __name((text8) => {
168608
+ const lines = harnessStripAnsi(text8).split("\n");
168609
+ for (let index3 = lines.length - 1; index3 >= 0; index3 -= 1) {
168610
+ const line = lines[index3].trim();
168611
+ if (line) return line;
168612
+ }
168613
+ return "";
168614
+ }, "harnessLastMeaningfulLine");
168615
+ var harnessTerminalResultSummary = /* @__PURE__ */ __name((callArg) => {
168616
+ const { stdout, stderr, exitCode: exitCode3 } = harnessTerminalOutcome(callArg);
168617
+ const parts = [];
168618
+ if (exitCode3 !== void 0) parts.push(exitCode3 === 0 ? "exit 0" : `exit ${exitCode3}`);
168619
+ const combined = `${stdout}${stdout && stderr ? "\n" : ""}${stderr}`;
168620
+ const lineCount = combined ? harnessStripAnsi(combined).split("\n").filter((line) => line.trim()).length : 0;
168621
+ if (lineCount > 0) parts.push(`${lineCount} ${lineCount === 1 ? "line" : "lines"}`);
168622
+ else if (exitCode3 !== void 0) parts.push("no output");
168623
+ const lastLine = harnessLastMeaningfulLine(stderr) || harnessLastMeaningfulLine(stdout);
168624
+ const prefix = parts.join(" \xB7 ");
168625
+ if (!lastLine) return prefix;
168626
+ const trimmed = lastLine.length > 160 ? `${lastLine.slice(0, 160)}\u2026` : lastLine;
168627
+ return prefix ? `${prefix} \xB7 ${trimmed}` : trimmed;
168628
+ }, "harnessTerminalResultSummary");
168588
168629
 
168589
168630
  // ts_web/elements/00group-harness/toolregistry.ts
168590
168631
  var parseMcpName = /* @__PURE__ */ __name((rawName) => {
@@ -168620,7 +168661,15 @@ var defaultDescriptors = [
168620
168661
  return command2 ? `${command2}${cwd2 ? ` \u2014 in ${cwd2}` : ""}` : harnessSummaryLine(call.input);
168621
168662
  }, "subtitle"),
168622
168663
  defaultExpanded: true,
168623
- layout: "full-row"
168664
+ layout: "full-row",
168665
+ /*
168666
+ * Only a command that can be PROVEN to have succeeded collapses. An absent exit code is not
168667
+ * evidence of success: a producer that reports a failed command as completed and encodes the
168668
+ * failure in its output would otherwise have that failure hidden behind a one-line summary.
168669
+ * Such a card stays open, and the producer reporting an exit code is the real fix.
168670
+ */
168671
+ collapseWhenFinished: /* @__PURE__ */ __name((call) => harnessTerminalOutcome(call).exitCode === 0, "collapseWhenFinished"),
168672
+ summary: harnessTerminalResultSummary
168624
168673
  },
168625
168674
  {
168626
168675
  kind: "file-read",
@@ -171326,30 +171375,17 @@ var applyPatchFirstPath = /* @__PURE__ */ __name((call) => {
171326
171375
  const match2 = patchText.match(/^\*\*\* (?:Add|Update|Delete) File: (.+)$/m);
171327
171376
  return match2 ? match2[1].trim() : "";
171328
171377
  }, "applyPatchFirstPath");
171329
- var ansiEscapePattern = /\x1b\[[0-9;?]*[A-Za-z]|\x1b\][^\x07]*(?:\x07|\x1b\\)|\x1b[=>]/g;
171330
- var stripAnsi = /* @__PURE__ */ __name((text8) => text8.replace(ansiEscapePattern, ""), "stripAnsi");
171331
171378
  var renderTerminal = /* @__PURE__ */ __name((call, helpers) => {
171332
171379
  const input = inputRecord(call);
171333
171380
  const command2 = String(input.command ?? "");
171334
- const output = call.output;
171335
- let stdout = "";
171336
- let stderr = "";
171337
- let nestedExitCode;
171338
- if (harnessIsRecord(output)) {
171339
- stdout = typeof output.stdout === "string" ? output.stdout : harnessStringifyValue(output.stdout ?? "");
171340
- stderr = typeof output.stderr === "string" ? output.stderr : "";
171341
- nestedExitCode = typeof output.exitCode === "number" ? output.exitCode : void 0;
171342
- } else {
171343
- stdout = harnessStringifyValue(output);
171344
- }
171345
- const exitCode3 = typeof call.exitCode === "number" ? call.exitCode : nestedExitCode;
171381
+ const { stdout, stderr, exitCode: exitCode3 } = harnessTerminalOutcome(call);
171346
171382
  const running = call.status === "pending" || call.status === "running";
171347
171383
  return b2`
171348
171384
  <div class="harness-terminal">
171349
171385
  ${command2 ? b2`<div class="harness-terminal-command"><span class="prompt">$</span> ${command2}</div>` : ""}
171350
- ${stdout ? b2`<pre class="harness-terminal-output">${stripAnsi(stdout)}</pre>` : ""}
171351
- ${stderr ? b2`<pre class="harness-terminal-output tone-error">${stripAnsi(stderr)}</pre>` : ""}
171352
- ${call.errorText ? b2`<pre class="harness-terminal-output tone-error">${stripAnsi(call.errorText)}</pre>` : ""}
171386
+ ${stdout ? b2`<pre class="harness-terminal-output">${harnessStripAnsi(stdout)}</pre>` : ""}
171387
+ ${stderr ? b2`<pre class="harness-terminal-output tone-error">${harnessStripAnsi(stderr)}</pre>` : ""}
171388
+ ${call.errorText ? b2`<pre class="harness-terminal-output tone-error">${harnessStripAnsi(call.errorText)}</pre>` : ""}
171353
171389
  ${running && !stdout && !stderr ? b2`<div class="harness-terminal-running"><span class="cursor"></span> running…</div>` : ""}
171354
171390
  ${exitCode3 !== void 0 ? b2`<div class="harness-terminal-exit ${exitCode3 === 0 ? "tone-success" : ""}">exit code ${exitCode3}</div>` : ""}
171355
171391
  </div>
@@ -171930,7 +171966,7 @@ var _DeesHarnessToolCard = class _DeesHarnessToolCard extends (_a89 = DeesElemen
171930
171966
  __publicField(this, "fullscreenPortal", null);
171931
171967
  __publicField(this, "disclosureFrame", null);
171932
171968
  __publicField(this, "returnScrollFrame", null);
171933
- __publicField(this, "subtaskResultElement", null);
171969
+ __publicField(this, "subtaskDetailElements", []);
171934
171970
  __publicField(this, "subtaskResultResizeObserver", null);
171935
171971
  __publicField(this, "terminalTailFollowing", true);
171936
171972
  __publicField(this, "terminalScrollHydrated", false);
@@ -172036,13 +172072,13 @@ var _DeesHarnessToolCard = class _DeesHarnessToolCard extends (_a89 = DeesElemen
172036
172072
  if (this.viewState) this.viewState.toolDiffView = this.diffViewOverride;
172037
172073
  }, "handleDiffViewChange"));
172038
172074
  __publicField(this, "syncSubtaskResultScroll", /* @__PURE__ */ __name(() => {
172039
- const result = this.subtaskResultElement;
172040
- if (!result) return;
172041
- result.classList.toggle("fadeTop", result.scrollTop > 1);
172042
- result.classList.toggle(
172043
- "fadeBottom",
172044
- result.scrollHeight - result.scrollTop - result.clientHeight > 1
172045
- );
172075
+ for (const panel of this.subtaskDetailElements) {
172076
+ panel.classList.toggle("fadeTop", panel.scrollTop > 1);
172077
+ panel.classList.toggle(
172078
+ "fadeBottom",
172079
+ panel.scrollHeight - panel.scrollTop - panel.clientHeight > 1
172080
+ );
172081
+ }
172046
172082
  }, "syncSubtaskResultScroll"));
172047
172083
  }
172048
172084
  get descriptor() {
@@ -172062,9 +172098,21 @@ var _DeesHarnessToolCard = class _DeesHarnessToolCard extends (_a89 = DeesElemen
172062
172098
  return this.allowSubtaskStreams && (this.call.subtask.status.type === "busy" || this.call.subtask.status.type === "error");
172063
172099
  }
172064
172100
  if (this.call.status === "error" || this.call.isError) return true;
172101
+ if (this.call.status === "completed" && this.resolvedCollapseWhenFinished) return false;
172065
172102
  if (typeof descriptor.defaultExpanded === "function") return descriptor.defaultExpanded(this.enrichedCall);
172066
172103
  return descriptor.defaultExpanded ?? false;
172067
172104
  }
172105
+ get resolvedCollapseWhenFinished() {
172106
+ const collapseWhenFinished = this.descriptor.collapseWhenFinished;
172107
+ if (typeof collapseWhenFinished === "function") return collapseWhenFinished(this.enrichedCall);
172108
+ return collapseWhenFinished ?? false;
172109
+ }
172110
+ /** Outcome line shown only while collapsed; the subtitle already carries the request. */
172111
+ get collapsedSummary() {
172112
+ if (this.isOpen || !this.descriptor.summary) return "";
172113
+ if (this.call.status !== "completed" && this.call.status !== "stopped") return "";
172114
+ return this.descriptor.summary(this.enrichedCall).trim();
172115
+ }
172068
172116
  get hasSubtaskPreview() {
172069
172117
  return this.allowSubtaskStreams && this.descriptor.kind === "subtask" && this.call.subtask !== void 0;
172070
172118
  }
@@ -172080,10 +172128,15 @@ var _DeesHarnessToolCard = class _DeesHarnessToolCard extends (_a89 = DeesElemen
172080
172128
  const open = this.isOpen;
172081
172129
  const renderBody = this.bodyMounted || open;
172082
172130
  const label = typeof descriptor.label === "function" ? descriptor.label(call) : descriptor.label;
172083
- const subtitle = descriptor.subtitle?.(call) ?? "";
172131
+ const derivedSubtitle = descriptor.subtitle?.(call) ?? "";
172132
+ const producerTitle = typeof call.title === "string" ? call.title.trim() : "";
172133
+ const subtitle = producerTitle || derivedSubtitle;
172134
+ const subtitleTooltip = producerTitle && derivedSubtitle && derivedSubtitle !== producerTitle ? `${producerTitle}
172135
+ ${derivedSubtitle}` : subtitle;
172084
172136
  const effectiveStatus = harnessEffectiveToolStatus(call);
172085
172137
  const statusTone = effectiveStatus === "completed" ? "success" : effectiveStatus === "stopped" ? "warning" : effectiveStatus;
172086
172138
  const duration = harnessFormatDuration(call.startedAt, call.finishedAt);
172139
+ const collapsedSummary = this.collapsedSummary;
172087
172140
  return b2`
172088
172141
  <div class="harness-card status-${effectiveStatus} ${descriptor.destructive ? "destructive" : ""} ${this.hasSubtaskPreview ? "subtaskPreviewCard" : ""} ${this.hasSubtaskPreview && open ? "subtaskPreviewOpen" : ""} ${this.returnFlash ? "returnFlash" : ""} ${this.outcomeScanTone ? `outcomeScan outcomeScan-${this.outcomeScanTone}` : ""}"
172089
172142
  @mouseenter=${this.cancelTerminalTailReturn}
@@ -172108,7 +172161,8 @@ var _DeesHarnessToolCard = class _DeesHarnessToolCard extends (_a89 = DeesElemen
172108
172161
  <span class="toolLabel">${label}</span>
172109
172162
  ${this.renderMcpBadges(call)}
172110
172163
  </span>
172111
- ${subtitle ? b2`<dees-harness-overflow-text class="subtitle" title=${subtitle}>${subtitle}</dees-harness-overflow-text>` : ""}
172164
+ ${subtitle ? b2`<dees-harness-overflow-text class="subtitle" title=${subtitleTooltip}>${subtitle}</dees-harness-overflow-text>` : ""}
172165
+ ${collapsedSummary ? b2`<dees-harness-overflow-text class="resultSummary" title=${collapsedSummary}>${collapsedSummary}</dees-harness-overflow-text>` : ""}
172112
172166
  </span>
172113
172167
  <span class="metaColumn">
172114
172168
  ${call.startedAt ? b2`<span class="duration">${harnessFormatClockTime(call.startedAt)}</span>` : ""}
@@ -172284,20 +172338,25 @@ var _DeesHarnessToolCard = class _DeesHarnessToolCard extends (_a89 = DeesElemen
172284
172338
  frameArg.scrollTop = scrollTopArg;
172285
172339
  }
172286
172340
  connectSubtaskResultScroll() {
172287
- const nextResult = this.shadowRoot?.querySelector(
172288
- ".harness-subtask-detail-result .harness-subtask-detail-text"
172289
- ) ?? null;
172290
- if (nextResult === this.subtaskResultElement) {
172341
+ const nextPanels = [...this.shadowRoot?.querySelectorAll(
172342
+ ".harness-subtask-detail-brief .harness-subtask-detail-text, .harness-subtask-detail-result .harness-subtask-detail-text"
172343
+ ) ?? []];
172344
+ const unchanged = nextPanels.length === this.subtaskDetailElements.length && nextPanels.every((panel, index3) => panel === this.subtaskDetailElements[index3]);
172345
+ if (unchanged) {
172291
172346
  this.syncSubtaskResultScroll();
172292
172347
  return;
172293
172348
  }
172294
- this.subtaskResultElement?.removeEventListener("scroll", this.syncSubtaskResultScroll);
172349
+ for (const panel of this.subtaskDetailElements) {
172350
+ panel.removeEventListener("scroll", this.syncSubtaskResultScroll);
172351
+ }
172295
172352
  this.subtaskResultResizeObserver?.disconnect();
172296
- this.subtaskResultElement = nextResult;
172297
- if (!nextResult) return;
172298
- nextResult.addEventListener("scroll", this.syncSubtaskResultScroll, { passive: true });
172353
+ this.subtaskDetailElements = nextPanels;
172354
+ if (!nextPanels.length) return;
172299
172355
  this.subtaskResultResizeObserver ??= new ResizeObserver(this.syncSubtaskResultScroll);
172300
- this.subtaskResultResizeObserver.observe(nextResult);
172356
+ for (const panel of nextPanels) {
172357
+ panel.addEventListener("scroll", this.syncSubtaskResultScroll, { passive: true });
172358
+ this.subtaskResultResizeObserver.observe(panel);
172359
+ }
172301
172360
  this.syncSubtaskResultScroll();
172302
172361
  }
172303
172362
  async connectedCallback() {
@@ -172341,8 +172400,10 @@ var _DeesHarnessToolCard = class _DeesHarnessToolCard extends (_a89 = DeesElemen
172341
172400
  this.bodyResizeObserver?.disconnect();
172342
172401
  this.bodyResizeObserver = null;
172343
172402
  this.observedBodyInner = null;
172344
- this.subtaskResultElement?.removeEventListener("scroll", this.syncSubtaskResultScroll);
172345
- this.subtaskResultElement = null;
172403
+ for (const panel of this.subtaskDetailElements) {
172404
+ panel.removeEventListener("scroll", this.syncSubtaskResultScroll);
172405
+ }
172406
+ this.subtaskDetailElements = [];
172346
172407
  this.subtaskResultResizeObserver?.disconnect();
172347
172408
  this.subtaskResultResizeObserver = null;
172348
172409
  await super.disconnectedCallback();
@@ -172564,7 +172625,11 @@ __publicField(_DeesHarnessToolCard, "styles", [
172564
172625
  .harness-card.subtaskPreviewOpen {
172565
172626
  display: flex;
172566
172627
  flex-direction: column;
172567
- height: var(--dees-harness-active-subtask-height, 320px);
172628
+ /*
172629
+ * A cap, not a fixed height: a short brief and result let the card size to their own
172630
+ * text, and only content taller than the cap hands the overflow to the inner scrollers.
172631
+ */
172632
+ max-height: var(--dees-harness-active-subtask-height, 320px);
172568
172633
  box-sizing: border-box;
172569
172634
  overflow: hidden;
172570
172635
  }
@@ -172592,7 +172657,27 @@ __publicField(_DeesHarnessToolCard, "styles", [
172592
172657
  overflow: hidden;
172593
172658
  }
172594
172659
 
172595
- .harness-card.subtaskPreviewOpen .body,
172660
+ /*
172661
+ * The body takes its height from flex layout rather than a percentage: a capped card has no
172662
+ * definite height for a percentage to resolve against, so a 100% height would collapse to
172663
+ * auto and the inner scrollers would never engage. As a flex item it shrinks to the cap when
172664
+ * the content overflows and sizes to its text when it does not.
172665
+ */
172666
+ .harness-card.subtaskPreviewOpen .bodyClipFrame {
172667
+ display: flex;
172668
+ flex-direction: column;
172669
+ }
172670
+
172671
+ .harness-card.subtaskPreviewOpen .body {
172672
+ flex: 1;
172673
+ min-height: 0;
172674
+ }
172675
+
172676
+ /* A streaming child fills the cap so its transcript has a stable window to scroll in. */
172677
+ .harness-card.subtaskPreviewOpen:has(.liveSubtaskBody) {
172678
+ height: var(--dees-harness-active-subtask-height, 320px);
172679
+ }
172680
+
172596
172681
  .harness-card.subtaskPreviewOpen .subtaskPreview {
172597
172682
  min-height: 0;
172598
172683
  height: 100%;
@@ -172682,6 +172767,15 @@ __publicField(_DeesHarnessToolCard, "styles", [
172682
172767
  font-size: 12px;
172683
172768
  }
172684
172769
 
172770
+ /* Stands in for the body while a finished card is collapsed. */
172771
+ .resultSummary {
172772
+ display: block;
172773
+ margin-top: 2px;
172774
+ color: var(--dees-color-text-secondary);
172775
+ font-family: var(--dees-font-family-mono, monospace);
172776
+ font-size: 11px;
172777
+ }
172778
+
172685
172779
  .metaColumn {
172686
172780
  display: flex;
172687
172781
  align-items: center;
@@ -175105,6 +175199,8 @@ var _DeesHarnessMessageList = class _DeesHarnessMessageList extends (_a94 = Dees
175105
175199
  <article
175106
175200
  class="virtualItem"
175107
175201
  data-virtual-key=${entry.item.key}
175202
+ data-tool-layout=${this.timelineItemLayout(entry.item)}
175203
+ data-tool-count=${this.timelineItemCount(entry.item)}
175108
175204
  aria-posinset=${entry.index + 1}
175109
175205
  aria-setsize=${this.timelineRenderItems.length}
175110
175206
  style=${`--harness-virtual-offset: ${this.virtualOffsets[entry.index] ?? 0}px;`}
@@ -175127,6 +175223,17 @@ var _DeesHarnessMessageList = class _DeesHarnessMessageList extends (_a94 = Dees
175127
175223
  }
175128
175224
  return indexes.sort((left, right) => left - right);
175129
175225
  }
175226
+ /** Mirrors the row's layout onto the virtual wrapper so width rules match the flowed stack. */
175227
+ timelineItemLayout(itemArg) {
175228
+ if (itemArg.kind === "tool-group") return itemArg.layout;
175229
+ if (itemArg.kind === "message") return itemArg.toolLayout ?? "message";
175230
+ return itemArg.kind;
175231
+ }
175232
+ /** Group size, mirrored onto the virtual wrapper so width rules match the flowed stack. */
175233
+ timelineItemCount(itemArg) {
175234
+ if (itemArg.kind !== "tool-group") return 1;
175235
+ return itemArg.messages.length >= 4 ? 4 : itemArg.messages.length;
175236
+ }
175130
175237
  renderTimelineItem(itemArg, logicalIndexArg) {
175131
175238
  if (itemArg.kind === "tool-group") return this.renderToolGroup(itemArg);
175132
175239
  if (itemArg.kind === "message") return this.renderMessage(itemArg, itemArg.key);
@@ -175193,6 +175300,7 @@ var _DeesHarnessMessageList = class _DeesHarnessMessageList extends (_a94 = Dees
175193
175300
  data-timeline-key=${groupArg.key}
175194
175301
  data-tool-group-id=${groupArg.key}
175195
175302
  data-tool-layout=${groupArg.layout}
175303
+ data-tool-count=${count2 >= 4 ? 4 : count2}
175196
175304
  >
175197
175305
  <div class=${`toolGrid ${countClass}`}>
175198
175306
  ${repeat4(
@@ -176089,8 +176197,42 @@ __publicField(_DeesHarnessMessageList, "styles", [
176089
176197
  transform: translate3d(0, var(--harness-virtual-offset), 0);
176090
176198
  }
176091
176199
 
176200
+ /*
176201
+ * Prose is held to a readable measure while wide payloads keep the whole pane. Applied to
176202
+ * the transcript rows themselves because a message host clips on both axes, so nothing
176203
+ * nested inside one can bleed back out.
176204
+ */
176205
+ .stack > *,
176206
+ .virtualItem {
176207
+ width: min(var(--dees-harness-content-width, 820px), 100%);
176208
+ margin-inline: auto;
176209
+ }
176210
+
176211
+ .stack > [data-tool-layout='full-row'],
176212
+ .stack > [data-tool-layout='subtask'],
176213
+ .virtualItem[data-tool-layout='full-row'],
176214
+ .virtualItem[data-tool-layout='subtask'] {
176215
+ width: 100%;
176216
+ }
176217
+
176218
+ /*
176219
+ * One or two subagents are read like any other content, so they stay on the measure. The
176220
+ * pane is only worth taking once three or more cards have to sit side by side.
176221
+ */
176222
+ .stack > [data-tool-layout='subtask'][data-tool-count='1'],
176223
+ .stack > [data-tool-layout='subtask'][data-tool-count='2'],
176224
+ .virtualItem[data-tool-layout='subtask'][data-tool-count='1'],
176225
+ .virtualItem[data-tool-layout='subtask'][data-tool-count='2'] {
176226
+ width: min(var(--dees-harness-content-width, 820px), 100%);
176227
+ }
176228
+
176092
176229
  .toolGroup {
176093
176230
  min-width: 0;
176231
+ /*
176232
+ * Column packing has to measure the row it happens in, not the scroller, now that a
176233
+ * compact row is narrower than the pane.
176234
+ */
176235
+ container: harness-transcript / inline-size;
176094
176236
  }
176095
176237
 
176096
176238
  .toolGrid {
@@ -176293,7 +176435,6 @@ var _DeesHarnessComposer = class _DeesHarnessComposer extends (_a95 = DeesElemen
176293
176435
  this.value = event.currentTarget.value;
176294
176436
  this.resetSuggestionInteraction();
176295
176437
  this.emitInput(this.value);
176296
- this.autogrow();
176297
176438
  }, "handleTextInput"));
176298
176439
  __publicField(this, "handleKeydown", /* @__PURE__ */ __name((event) => {
176299
176440
  if (event.isComposing || this.composing) return;
@@ -176396,7 +176537,6 @@ var _DeesHarnessComposer = class _DeesHarnessComposer extends (_a95 = DeesElemen
176396
176537
  this.value = "";
176397
176538
  this.resetSuggestionInteraction();
176398
176539
  this.emitInput("");
176399
- this.autogrow();
176400
176540
  }
176401
176541
  willUpdate(changedProperties) {
176402
176542
  super.willUpdate(changedProperties);
@@ -176408,6 +176548,7 @@ var _DeesHarnessComposer = class _DeesHarnessComposer extends (_a95 = DeesElemen
176408
176548
  this.attachmentGeneration++;
176409
176549
  if (!this.attachmentsEnabled || this.disabled) this.handleDragLeave();
176410
176550
  }
176551
+ if (changedProperties.has("value")) this.autogrow();
176411
176552
  this.syncTextareaSuggestionAria();
176412
176553
  }
176413
176554
  render() {
@@ -176909,7 +177050,12 @@ __publicField(_DeesHarnessComposer, "styles", [
176909
177050
  border: 0;
176910
177051
  border-top: 1px solid var(--dees-color-border-subtle);
176911
177052
  border-radius: 0;
176912
- padding: 10px 16px 12px;
177053
+ /*
177054
+ * The docked bar stays full-bleed — its background and top border belong to the whole
177055
+ * column — while its content is inset to the transcript's measure, so the prompt lines up
177056
+ * with the messages above it instead of floating as a narrower block.
177057
+ */
177058
+ padding: 10px max(16px, calc((100% - var(--dees-harness-content-width, 820px)) / 2)) 12px;
176913
177059
  }
176914
177060
 
176915
177061
  :host([docked]) .composer.dragOver {
@@ -223321,7 +223467,7 @@ init_group_runtime();
223321
223467
  // ts_web/00_commitinfo_data.ts
223322
223468
  var commitinfo = {
223323
223469
  name: "@design.estate/dees-catalog",
223324
- version: "9.7.0",
223470
+ version: "9.8.0",
223325
223471
  description: "A comprehensive library that provides dynamic web components for building sophisticated and modern web applications using JavaScript and TypeScript."
223326
223472
  };
223327
223473
 
@@ -223519,10 +223665,13 @@ export {
223519
223665
  harnessParseTodos,
223520
223666
  harnessPillStyles,
223521
223667
  harnessStringifyValue,
223668
+ harnessStripAnsi,
223522
223669
  harnessSummarizeValue,
223523
223670
  harnessSummaryLine,
223524
223671
  harnessSupportedImageTypes,
223525
223672
  harnessSupportedTextTypes,
223673
+ harnessTerminalOutcome,
223674
+ harnessTerminalResultSummary,
223526
223675
  harnessTruncate,
223527
223676
  isInViewport,
223528
223677
  makeStreamingSimulator,