@fusion.dev/helix-headless 0.204.0 → 0.205.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.
@@ -24965,7 +24965,7 @@
24965
24965
  },
24966
24966
  {
24967
24967
  "kind": "class",
24968
- "description": "A chat message carries its state: sending, arrived, streaming, or failed. A\nfailed message has a retry control in the message, which fires `helix-send`.\n\n`streaming` is the state the others are arranged around. A streaming message\nchanges height on every frame, so it is marked `aria-busy` while it arrives\nand announced once when it settles. A screen reader cannot follow a stream\nread out character by character.\n\nA screen reader names the turn by its author and its time, such as \"You, 2\nminutes ago\". The author is `author-label`, or \"You\" for `me`, or the\n`author` itself where it is a name; give a turn by `them` an `author-label`\nto name it. The chat it sits in holds the sentence and the word for `me`, so\na page in another language sets them once there. The time moves on by\nitself, so \"now\" becomes \"1 minute ago\" while the page is open.",
24968
+ "description": "A chat message carries its state: sending, arrived, streaming, or failed. A\nfailed message has a retry control in the message, which fires `helix-send`.\n\n`streaming` is the state the others are arranged around. A streaming message\nchanges height on every frame, so it is marked `aria-busy` while it arrives\nand announced once when it settles. A screen reader cannot follow a stream\nread out character by character.\n\nA screen reader names the turn by its author and its time, such as \"You, 2\nminutes ago\". The author is `author-label`, or \"You\" for `me`, or the\n`author` itself where it is a name; give a turn by `them` an `author-label`\nto name it. The chat it sits in holds the sentence and the word for `me`, so\na page in another language sets them once there. The time moves on by\nitself, so \"now\" becomes \"1 minute ago\" while the page is open.\n\n**An agent's work goes in `work`, and its answer in the content.** The work,\nits thinking, the commands it ran and what they printed, is a record read\nthe way a log is, so a `Log` with `separation=\"plain\"` and `quiet` sits there\nabove the answer. The chat says the turn once it settles, from the content\nalone, so the work is never read aloud as part of the answer.",
24969
24969
  "name": "HelixHeadlessChatMessage",
24970
24970
  "cssParts": [
24971
24971
  {
@@ -25015,6 +25015,10 @@
25015
25015
  {
25016
25016
  "description": "The turn's time.",
25017
25017
  "name": "time"
25018
+ },
25019
+ {
25020
+ "description": "The box around the `work` slot, above the content.",
25021
+ "name": "work"
25018
25022
  }
25019
25023
  ],
25020
25024
  "slots": [
@@ -25037,6 +25041,10 @@
25037
25041
  {
25038
25042
  "description": "The turn's sources, such as citations, documents, or a retrieved page.",
25039
25043
  "name": "sources"
25044
+ },
25045
+ {
25046
+ "description": "What an agent did to arrive at the turn, such as a `Log` of its steps, above the content. A screen reader hears the turn without it.",
25047
+ "name": "work"
25040
25048
  }
25041
25049
  ],
25042
25050
  "members": [
@@ -25978,6 +25986,10 @@
25978
25986
  "description": "The time of a turn from `turns`.",
25979
25987
  "name": "message-time"
25980
25988
  },
25989
+ {
25990
+ "description": "The box around a turn's `work`, for a turn from `turns`, which has none.",
25991
+ "name": "message-work"
25992
+ },
25981
25993
  {
25982
25994
  "description": "The control shown while the user is scrolled away from the bottom.",
25983
25995
  "name": "resume"
@@ -102720,6 +102732,10 @@
102720
102732
  "description": "The row of a line at `error`.",
102721
102733
  "name": "line-error"
102722
102734
  },
102735
+ {
102736
+ "description": "The row of a line that belongs to a step, which the styled tier insets under the step's heading where there is no number.",
102737
+ "name": "line-grouped"
102738
+ },
102723
102739
  {
102724
102740
  "description": "The row of a line `mark-lines` names on the log.",
102725
102741
  "name": "line-marked"
@@ -103375,7 +103391,7 @@
103375
103391
  "declarations": [
103376
103392
  {
103377
103393
  "kind": "class",
103378
- "description": "A log holds lines in the order they were written and keeps the reader at\nthe newest one, until they scroll up to read. It stays where they left it\nwhile lines keep arriving, and a button returns them to the end\n(`resume-label`, \"Jump to latest\").\n\n**Lines arrive two ways.** For a log you serve whole, write `Log.Line`\nelements as children, inside `Log.Group` elements for the steps. For a log\nthat is still being written, hand it text: `write(chunk)` takes text as it\narrives, in pieces that need not end at a line break, and `source` takes a\n`ReadableStream` or an async iterable and reads it to the end. `lines` takes\nthe lines as data. Text drawn from data is drawn one window at a time, so a\nlog of a hundred thousand lines holds a screenful of elements, and the log\nneeds a block size of its own. Do not use both ways at once.\n\n**Written text is read the way a terminal shows it.** A carriage return\nstarts the line over, so a progress bar stays one line, and the line still\nbeing written is shown as it stands. ANSI colors and weights are drawn, in\nthe sixteen colors the styled tier takes from your theme, and every other\nescape code is dropped.\n\n**Read a CI log's own markers with `format`.** `github-actions` reads the\nworkflow commands a step writes, `::group::` and `::error::` among them,\nand the times at the start of a downloaded log. `vercel` reads a Vercel\nbuild log's phases and its warnings. Each step opens as it starts, folds\nonce it passes, stays open where it failed, and is timed from its lines.\nFor any other log, give `parse` a function that reads each finished line:\nit returns a level, a group, or `open` and `close` to start and end a step.\n\n**Steps fold.** Lines that name a group in `groups` stand under its heading,\nwhich shows its status and how long it took and opens and closes the lines.\nA group a reader opens or closes fires `helix-expand` with every open group.\n\n**Search with `query`.** The log shows only the lines that hold it, marks\neach match, opens the groups that hold one, and says how many lines match.\n\n`line-numbers` numbers the lines from the first ever written, so a number\nstill names its line once `limit` has let older lines go, and `line-href`\nmakes each number a link, such as `#L{n}`. `scrollToLine(n)` takes a reader\nto one. `timestamps` shows each line's `at`, on the clock or as the time\ninto the run. `mark-lines` marks lines, such as `12, 40-44`.\n\n**`selectable` lets a reader select lines**, as a code host does: pressing a\nnumber selects its line, and pressing another with Shift selects every line\nbetween them. `selected-lines` holds the selection, such as `12-20`, and\n`helix-select` asks before it changes. With a `line-href` that is a\nfragment, the address follows the selection, `#L12` or `#L12-L20`, and a\npage opened at one selects it and scrolls to it.\n\n**The numbers are one tab stop.** Where they are links or buttons, Tab\nreaches the one a reader last used, or the first selected, and the arrow\nkeys move between them, with Home and End for the first and the last. With\nShift on a `selectable` log, the selection follows.\n\n**What a screen reader hears.** The log is a `log` and stays quiet as lines\narrive, since reading a build aloud line by line helps nobody. A separate\nstatus region says each line at `error` once it arrives, each step once it\nfinishes or fails, and the end of the run once `done` is set or `source`\nends. Set `done` yourself when output you `write` is complete.\n\nThe log scrolls on this tier. It carries `data-scroller`, so following the\nnewest line and drawing a window work with no stylesheet. Give the log a\nblock size, such as `helix-headless-log::part(log) { block-size: 20rem }`.\n\n```js\nimport '@fusion.dev/helix/log'\n```",
103394
+ "description": "A log holds lines in the order they were written and keeps the reader at\nthe newest one, until they scroll up to read. It stays where they left it\nwhile lines keep arriving, and a button returns them to the end\n(`resume-label`, \"Jump to latest\").\n\n**Lines arrive two ways.** For a log you serve whole, write `Log.Line`\nelements as children, inside `Log.Group` elements for the steps. For a log\nthat is still being written, hand it text: `write(chunk)` takes text as it\narrives, in pieces that need not end at a line break, and `source` takes a\n`ReadableStream` or an async iterable and reads it to the end. `lines` takes\nthe lines as data. Text drawn from data is drawn one window at a time, so a\nlog of a hundred thousand lines holds a screenful of elements, and the log\nneeds a block size of its own. Do not use both ways at once.\n\n**Written text is read the way a terminal shows it.** A carriage return\nstarts the line over, so a progress bar stays one line, and the line still\nbeing written is shown as it stands. ANSI colors and weights are drawn, in\nthe sixteen colors the styled tier takes from your theme, and every other\nescape code is dropped.\n\n**Read a CI log's own markers with `format`.** `github-actions` reads the\nworkflow commands a step writes, `::group::` and `::error::` among them,\nand the times at the start of a downloaded log. `vercel` reads a Vercel\nbuild log's phases and its warnings. Each step opens as it starts, folds\nonce it passes, stays open where it failed, and is timed from its lines.\nFor any other log, give `parse` a function that reads each finished line:\nit returns a level, a group, or `open` and `close` to start and end a step.\n\n**Steps fold.** Lines that name a group in `groups` stand under its heading,\nwhich shows its status and how long it took and opens and closes the lines.\nA group a reader opens or closes fires `helix-expand` with every open group.\n\n**Search with `query`.** The log shows only the lines that hold it, marks\neach match, opens the groups that hold one, and says how many lines match.\n\n`line-numbers` numbers the lines from the first ever written, so a number\nstill names its line once `limit` has let older lines go, and `line-href`\nmakes each number a link, such as `#L{n}`. `scrollToLine(n)` takes a reader\nto one. `timestamps` shows each line's `at`, on the clock or as the time\ninto the run. `mark-lines` marks lines, such as `12, 40-44`.\n\n**`selectable` lets a reader select lines**, as a code host does: pressing a\nnumber selects its line, and pressing another with Shift selects every line\nbetween them. `selected-lines` holds the selection, such as `12-20`, and\n`helix-select` asks before it changes. With a `line-href` that is a\nfragment, the address follows the selection, `#L12` or `#L12-L20`, and a\npage opened at one selects it and scrolls to it.\n\n**The numbers are one tab stop.** Where they are links or buttons, Tab\nreaches the one a reader last used, or the first selected, and the arrow\nkeys move between them, with Home and End for the first and the last. With\nShift on a `selectable` log, the selection follows.\n\n**What a screen reader hears.** The log is a `log` and stays quiet as lines\narrive, since reading a build aloud line by line helps nobody. A separate\nstatus region says each line at `error` once it arrives, each step once it\nfinishes or fails, and the end of the run once `done` is set or `source`\nends. Set `done` yourself when output you `write` is complete. Set `quiet`\nwhere something around the log speaks for it, as a chat turn does for an\nagent's work.\n\nThe log scrolls on this tier. It carries `data-scroller`, so following the\nnewest line and drawing a window work with no stylesheet. Give the log a\nblock size, such as `helix-headless-log::part(log) { block-size: 20rem }`.\n\n```js\nimport '@fusion.dev/helix/log'\n```",
103379
103395
  "name": "HelixHeadlessLog",
103380
103396
  "cssProperties": [
103381
103397
  {
@@ -103528,6 +103544,10 @@
103528
103544
  "description": "The row of a line drawn from data at `error`.",
103529
103545
  "name": "line-error"
103530
103546
  },
103547
+ {
103548
+ "description": "The row of a line drawn from data that belongs to a step.",
103549
+ "name": "line-grouped"
103550
+ },
103531
103551
  {
103532
103552
  "description": "The row of a line drawn from data that `mark-lines` names.",
103533
103553
  "name": "line-marked"
@@ -103898,6 +103918,16 @@
103898
103918
  "description": "Text a line has to hold to be shown, ignoring case. Empty shows every line.",
103899
103919
  "attribute": "query"
103900
103920
  },
103921
+ {
103922
+ "kind": "field",
103923
+ "name": "quiet",
103924
+ "type": {
103925
+ "text": "boolean"
103926
+ },
103927
+ "default": "false",
103928
+ "description": "Whether the log says nothing to a screen reader as lines arrive, steps\nfinish, or the run ends. For a log inside something that speaks for it,\nsuch as an agent's work in a chat turn, which the turn announces once it\nsettles.",
103929
+ "attribute": "quiet"
103930
+ },
103901
103931
  {
103902
103932
  "kind": "field",
103903
103933
  "name": "resumeLabel",
@@ -105547,6 +105577,15 @@
105547
105577
  "description": "Text a line has to hold to be shown, ignoring case. Empty shows every line.",
105548
105578
  "fieldName": "query"
105549
105579
  },
105580
+ {
105581
+ "name": "quiet",
105582
+ "type": {
105583
+ "text": "boolean"
105584
+ },
105585
+ "default": "false",
105586
+ "description": "Whether the log says nothing to a screen reader as lines arrive, steps\nfinish, or the run ends. For a log inside something that speaks for it,\nsuch as an agent's work in a chat turn, which the turn announces once it\nsettles.",
105587
+ "fieldName": "quiet"
105588
+ },
105550
105589
  {
105551
105590
  "name": "resume-label",
105552
105591
  "type": {
@@ -219846,6 +219885,6 @@
219846
219885
  ],
219847
219886
  "helix": {
219848
219887
  "package": "@fusion.dev/helix-headless",
219849
- "version": "0.204.0"
219888
+ "version": "0.205.0"
219850
219889
  }
219851
219890
  }
@@ -26,6 +26,12 @@ export declare const FAILED_LABEL = "Not sent";
26
26
  * a page in another language sets them once there. The time moves on by
27
27
  * itself, so "now" becomes "1 minute ago" while the page is open.
28
28
  *
29
+ * **An agent's work goes in `work`, and its answer in the content.** The work,
30
+ * its thinking, the commands it ran and what they printed, is a record read
31
+ * the way a log is, so a `Log` with `separation="plain"` and `quiet` sits there
32
+ * above the answer. The chat says the turn once it settles, from the content
33
+ * alone, so the work is never read aloud as part of the answer.
34
+ *
29
35
  * @since 0.1.0
30
36
  * @status stable
31
37
  * @category feedback
@@ -38,6 +44,7 @@ export declare const FAILED_LABEL = "Not sent";
38
44
  * @slot indicator - The indicator shown before the first token arrives.
39
45
  * Defaults to the typing indicator.
40
46
  * @slot sources - The turn's sources, such as citations, documents, or a retrieved page.
47
+ * @slot work - What an agent did to arrive at the turn, such as a `Log` of its steps, above the content. A screen reader hears the turn without it.
41
48
  *
42
49
  * @event {HelixSendEvent} helix-send - Fired when the user retries a failed message. Cancelable: if it is not canceled, the turn is sent again. Canceling it leaves the failure and the retry button as they were.
43
50
  *
@@ -53,6 +60,7 @@ export declare const FAILED_LABEL = "Not sent";
53
60
  * @csspart sources - The turn's sources, under it and outside the bubble.
54
61
  * @csspart state - The text that names the turn's state, when there is one to show.
55
62
  * @csspart time - The turn's time.
63
+ * @csspart work - The box around the `work` slot, above the content.
56
64
  */
57
65
  export declare class HelixHeadlessChatMessage extends HelixElement {
58
66
  /**
@@ -108,7 +108,7 @@ let HelixHeadlessChatMessage = class HelixHeadlessChatMessage extends HelixEleme
108
108
  }
109
109
  markEmpty() {
110
110
  markRegion(this.renderRoot, 'content', [''], { hide: false });
111
- for (const name of ['sources', 'actions']) {
111
+ for (const name of ['work', 'sources', 'actions']) {
112
112
  markRegion(this.renderRoot, name, [name]);
113
113
  }
114
114
  }
@@ -120,6 +120,7 @@ let HelixHeadlessChatMessage = class HelixHeadlessChatMessage extends HelixEleme
120
120
  return html `<div part="message">
121
121
  <span part="avatar"><slot name="avatar"></slot></span>
122
122
  <div part="body">
123
+ <div part="work"><slot name="work" @slotchange=${this.handleFill}></slot></div>
123
124
  <div part="content">
124
125
  <slot @slotchange=${this.handleFill}></slot>
125
126
  ${this.renderIndicator()}
@@ -156,6 +156,7 @@ declare const HelixHeadlessChat_base: (new (...args: any[]) => import("@fusion.d
156
156
  * @csspart message-sources - The sources of a turn from `turns`.
157
157
  * @csspart message-state - The state text of a turn from `turns`, when there is one to show.
158
158
  * @csspart message-time - The time of a turn from `turns`.
159
+ * @csspart message-work - The box around a turn's `work`, for a turn from `turns`, which has none.
159
160
  * @csspart resume - The control shown while the user is scrolled away from the bottom.
160
161
  * @csspart resume-button - The button the `resume` region shows when nothing is slotted into it.
161
162
  * @csspart resume-mark - The arrow on the default `resume-button`.
@@ -666,7 +666,7 @@ let HelixHeadlessChat = class HelixHeadlessChat extends MixinCollection(HelixEle
666
666
  exportparts="actions: message-actions, avatar: message-avatar, body: message-body,
667
667
  content: message-content, indicator: message-indicator, mark: message-mark, message,
668
668
  meta: message-meta, retry: message-retry, sources: message-sources,
669
- state: message-state, time: message-time${secondNames(SECOND_NAMES.author, turn.author)}${secondNames(SECOND_NAMES.state, turn.state)}"
669
+ state: message-state, time: message-time, work: message-work${secondNames(SECOND_NAMES.author, turn.author)}${secondNames(SECOND_NAMES.state, turn.state)}"
670
670
  author=${turn.author ?? nothing}
671
671
  author-label=${turn.authorLabel ?? nothing}
672
672
  at=${turn.at ?? nothing}
@@ -25,6 +25,7 @@ export type LogTimes = 'absolute' | 'relative';
25
25
  * @csspart line - The row the number, the time, and the text sit in.
26
26
  * @csspart line-debug - The row of a line at `debug`.
27
27
  * @csspart line-error - The row of a line at `error`.
28
+ * @csspart line-grouped - The row of a line that belongs to a step, which the styled tier insets under the step's heading where there is no number.
28
29
  * @csspart line-marked - The row of a line `mark-lines` names on the log.
29
30
  * @csspart line-selected - The row of a line in the log's selection.
30
31
  * @csspart line-warn - The row of a line at `warn`.
@@ -55,6 +56,8 @@ export declare class HelixHeadlessLogLine extends HelixElement {
55
56
  lineLabel: string;
56
57
  /** @internal Set by the log: whether the query hides the line. */
57
58
  logFiltered: boolean;
59
+ /** @internal Set by the log: whether the line belongs to a step. */
60
+ logGrouped: boolean;
58
61
  /** @internal Set by the log: the link a number goes to, with `{n}` for the number. */
59
62
  logHref: string;
60
63
  /** @internal Set by the log: whether `mark-lines` names the line. */
@@ -18,6 +18,7 @@ let HelixHeadlessLogLine = class HelixHeadlessLogLine extends HelixElement {
18
18
  this.at = '';
19
19
  this.lineLabel = 'Line {number}';
20
20
  this.logFiltered = false;
21
+ this.logGrouped = false;
21
22
  this.logHref = '';
22
23
  this.logMarked = false;
23
24
  this.logNumber = 0;
@@ -111,7 +112,7 @@ let HelixHeadlessLogLine = class HelixHeadlessLogLine extends HelixElement {
111
112
  }
112
113
  const level = this.level;
113
114
  return html `<div
114
- part="line${level ? { debug: ' line-debug', error: ' line-error', info: '', warn: ' line-warn' }[level] : ''}${this.logMarked ? ' line-marked' : ''}${this.logSelected ? ' line-selected' : ''}"
115
+ part="line${level ? { debug: ' line-debug', error: ' line-error', info: '', warn: ' line-warn' }[level] : ''}${this.logMarked ? ' line-marked' : ''}${this.logSelected ? ' line-selected' : ''}${this.logGrouped ? ' line-grouped' : ''}"
115
116
  >${this.renderNumber()}${this.renderTime()}<span part="text">${this.renderText()}</span></div>`;
116
117
  }
117
118
  };
@@ -128,6 +129,9 @@ __decorate([
128
129
  __decorate([
129
130
  property({ attribute: false })
130
131
  ], HelixHeadlessLogLine.prototype, "logFiltered", void 0);
132
+ __decorate([
133
+ property({ attribute: false })
134
+ ], HelixHeadlessLogLine.prototype, "logGrouped", void 0);
131
135
  __decorate([
132
136
  property({ attribute: false })
133
137
  ], HelixHeadlessLogLine.prototype, "logHref", void 0);
@@ -73,7 +73,9 @@ declare const HelixHeadlessLog_base: (new (...args: any[]) => import("@fusion.de
73
73
  * arrive, since reading a build aloud line by line helps nobody. A separate
74
74
  * status region says each line at `error` once it arrives, each step once it
75
75
  * finishes or fails, and the end of the run once `done` is set or `source`
76
- * ends. Set `done` yourself when output you `write` is complete.
76
+ * ends. Set `done` yourself when output you `write` is complete. Set `quiet`
77
+ * where something around the log speaks for it, as a chat turn does for an
78
+ * agent's work.
77
79
  *
78
80
  * The log scrolls on this tier. It carries `data-scroller`, so following the
79
81
  * newest line and drawing a window work with no stylesheet. Give the log a
@@ -117,6 +119,7 @@ declare const HelixHeadlessLog_base: (new (...args: any[]) => import("@fusion.de
117
119
  * @csspart line - The row of a line drawn from data.
118
120
  * @csspart line-debug - The row of a line drawn from data at `debug`.
119
121
  * @csspart line-error - The row of a line drawn from data at `error`.
122
+ * @csspart line-grouped - The row of a line drawn from data that belongs to a step.
120
123
  * @csspart line-marked - The row of a line drawn from data that `mark-lines` names.
121
124
  * @csspart line-match - Text in a line drawn from data that matches `query`.
122
125
  * @csspart line-number - The number of a line drawn from data.
@@ -271,6 +274,13 @@ export declare class HelixHeadlessLog extends HelixHeadlessLog_base {
271
274
  set pinned(next: boolean);
272
275
  /** Text a line has to hold to be shown, ignoring case. Empty shows every line. */
273
276
  query: string;
277
+ /**
278
+ * Whether the log says nothing to a screen reader as lines arrive, steps
279
+ * finish, or the run ends. For a log inside something that speaks for it,
280
+ * such as an agent's work in a chat turn, which the turn announces once it
281
+ * settles.
282
+ */
283
+ quiet: boolean;
274
284
  /** The words on the button that returns to the newest line, where `resume` is empty. */
275
285
  resumeLabel: string;
276
286
  /**
@@ -40,6 +40,7 @@ let HelixHeadlessLog = class HelixHeadlessLog extends MixinCollection(HelixEleme
40
40
  this.markLines = '';
41
41
  this.matchesLabel = '{count, plural, =0 {No lines match} one {# line matches} other {# lines match}}';
42
42
  this.query = '';
43
+ this.quiet = false;
43
44
  this.resumeLabel = 'Jump to latest';
44
45
  this.selectable = false;
45
46
  this.selectedLines = '';
@@ -530,6 +531,7 @@ let HelixHeadlessLog = class HelixHeadlessLog extends MixinCollection(HelixEleme
530
531
  line.logSelectable = this.selectable;
531
532
  line.logSelected = this.selected(at + 1);
532
533
  line.logStop = at + 1 === stop;
534
+ line.logGrouped = this.childGroups.some((group) => group.contains(line));
533
535
  });
534
536
  if (!filtered && needle !== '') {
535
537
  for (const group of this.childGroups) {
@@ -583,7 +585,7 @@ let HelixHeadlessLog = class HelixHeadlessLog extends MixinCollection(HelixEleme
583
585
  const now = this.listen();
584
586
  const before = this.heard;
585
587
  this.heard = now;
586
- if (this.opening || !before) {
588
+ if (this.opening || !before || this.quiet) {
587
589
  return;
588
590
  }
589
591
  const said = [];
@@ -796,7 +798,7 @@ let HelixHeadlessLog = class HelixHeadlessLog extends MixinCollection(HelixEleme
796
798
  const line = this.tag('log-line');
797
799
  const { at, level } = row.line;
798
800
  return html `<${line}
799
- exportparts="line, line-debug, line-error, line-marked, line-selected, line-warn, match: line-match,
801
+ exportparts="line, line-debug, line-error, line-grouped, line-marked, line-selected, line-warn, match: line-match,
800
802
  number: line-number, run: line-run, run-bold: line-run-bold, run-dim: line-run-dim,
801
803
  run-italic: line-run-italic, run-strike: line-run-strike, run-underline: line-run-underline,
802
804
  text: line-text, time: line-time"
@@ -811,6 +813,7 @@ let HelixHeadlessLog = class HelixHeadlessLog extends MixinCollection(HelixEleme
811
813
  .logSelectable=${this.selectable}
812
814
  .logSelected=${this.selected(row.number)}
813
815
  .logStop=${row.number === stop}
816
+ .logGrouped=${row.line.group !== undefined}
814
817
  .logStart=${start}
815
818
  .logTimes=${this.timestamps ?? ''}
816
819
  .runs=${this.buffer.runsOf(row.line)}
@@ -952,6 +955,9 @@ __decorate([
952
955
  __decorate([
953
956
  property()
954
957
  ], HelixHeadlessLog.prototype, "query", void 0);
958
+ __decorate([
959
+ property({ type: Boolean })
960
+ ], HelixHeadlessLog.prototype, "quiet", void 0);
955
961
  __decorate([
956
962
  words,
957
963
  property({ attribute: 'resume-label' })