@issuegraph/viewer 0.2.0 → 0.5.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 (52) hide show
  1. package/README.md +39 -2
  2. package/dist/document.d.ts +286 -3
  3. package/dist/document.d.ts.map +1 -1
  4. package/dist/document.js +247 -1
  5. package/dist/document.js.map +1 -1
  6. package/dist/element.d.ts +11 -0
  7. package/dist/element.d.ts.map +1 -1
  8. package/dist/element.js.map +1 -1
  9. package/dist/index.d.ts +6 -6
  10. package/dist/index.d.ts.map +1 -1
  11. package/dist/index.js +30 -4
  12. package/dist/index.js.map +1 -1
  13. package/dist/layout.d.ts +51 -50
  14. package/dist/layout.d.ts.map +1 -1
  15. package/dist/layout.js +364 -168
  16. package/dist/layout.js.map +1 -1
  17. package/dist/mount.d.ts +13 -0
  18. package/dist/mount.d.ts.map +1 -1
  19. package/dist/mount.js +94 -3
  20. package/dist/mount.js.map +1 -1
  21. package/dist/navigation.d.ts +14 -0
  22. package/dist/navigation.d.ts.map +1 -1
  23. package/dist/navigation.js +20 -0
  24. package/dist/navigation.js.map +1 -1
  25. package/dist/parts.d.ts +338 -1
  26. package/dist/parts.d.ts.map +1 -1
  27. package/dist/parts.js +899 -30
  28. package/dist/parts.js.map +1 -1
  29. package/dist/projections/graph.d.ts +10 -0
  30. package/dist/projections/graph.d.ts.map +1 -1
  31. package/dist/projections/graph.js +413 -311
  32. package/dist/projections/graph.js.map +1 -1
  33. package/dist/projections/linear.d.ts +90 -0
  34. package/dist/projections/linear.d.ts.map +1 -1
  35. package/dist/projections/linear.js +220 -28
  36. package/dist/projections/linear.js.map +1 -1
  37. package/dist/projections/tree.d.ts.map +1 -1
  38. package/dist/projections/tree.js +29 -3
  39. package/dist/projections/tree.js.map +1 -1
  40. package/dist/styles.d.ts +10 -1
  41. package/dist/styles.d.ts.map +1 -1
  42. package/dist/styles.js +825 -68
  43. package/dist/styles.js.map +1 -1
  44. package/dist/theme.d.ts +41 -10
  45. package/dist/theme.d.ts.map +1 -1
  46. package/dist/theme.js +265 -11
  47. package/dist/theme.js.map +1 -1
  48. package/dist/vocabulary.d.ts +39 -0
  49. package/dist/vocabulary.d.ts.map +1 -1
  50. package/dist/vocabulary.js +27 -0
  51. package/dist/vocabulary.js.map +1 -1
  52. package/package.json +2 -2
package/README.md CHANGED
@@ -5,7 +5,7 @@ Render an [Issuegraph](https://github.com/autnmy/issuegraph) document as a **wor
5
5
  The innermost UI layer, and the whole of its contract:
6
6
 
7
7
  ```
8
- in { issues, edges, order, cycles } + a projection choice
8
+ in { issues, edges, order, cycles, host? } + a projection choice
9
9
  out onSelect, onHover
10
10
  never fetching, mutation, auth, persistence, or a host's vocabulary
11
11
  ```
@@ -61,6 +61,32 @@ const document = {
61
61
 
62
62
  **A deep link is checked, not just escaped.** `url` is the one field that becomes an executable surface in the DOM, so only `http:`, `https:`, `mailto:` and relative values are linked — a `javascript:` or `data:` value is dropped with a diagnostic. Escaping the attribute would not have stopped it.
63
63
 
64
+ ## The host-facts port
65
+
66
+ Roughly half of what the design draws is not derivable from the graph. The format excludes run state on purpose (SPEC §2, §6.8), so who is working what, how many may run at once, and how fresh the mirror is are facts only the **host** holds. `ViewerDocument.host` is the typed way in, and every field of it is optional: **a host that supplies nothing renders exactly the pure-graph view** — pinned by a test that compares the markup byte for byte.
67
+
68
+ | what the design shows | where it enters | what the viewer does |
69
+ |---|---|---|
70
+ | `6 ranked · 4 ready now · cap 2 · 4 held` | `host.counts` and `host.concurrencyCap` | prints the host's numbers in a summary line; renders nothing when both are absent |
71
+ | `now · <title> · Review · 12m` | `host.running[]` — `{ key, phase, elapsed }` | one NOW row per job above the order (linear) and above the stage (graph), from the issue's own title and identity |
72
+ | `as of 14:32 · 2m ago` · `stale` · refresh | `host.freshness` — `{ asOf, age?, stale?, refresh? }` | the stamp verbatim, `data-stale`, and a `button[data-ig-command="refresh"]` only when a label is supplied |
73
+ | `claimed` · `parked` in the footer | `TrackerHold.label` on a slot's hold | a chip before the hold's sentence, and the words in the footer title |
74
+ | `matched ordered query 1 · label:P0` | `ViewerIssue.provenance` (`matched-query`) | already shipped |
75
+ | `◐ preview-only` | `ViewerIssue.previewOnly` — `{ note }` | a badge and the host's note, one line under provenance |
76
+ | `◆ signals disagree` | `ViewerIssue.disagreement` — `{ used, ignored: { carrier, value } }` | a badge and `ranked by … · … declares ~~value~~`, only the losing value struck |
77
+ | `owner/repo#N ↗` | `ViewerIssue.url` | already shipped |
78
+ | write pending / failed / conflict | `@issuegraph/editor`'s `EdgeOverlay` | the editor's, drawn as overlays; the viewer needs no edit awareness |
79
+
80
+ **The counts are the host's numbers, and the viewer counts nothing.** The document this layer holds may be a window (the editor's rail slices the slots) or a slice (a host showing the next twenty-five), and a count over its slots would state the reader's scroll position as a fact about the order. The host has the whole order; it counts. For the same reason nothing here is a viewer constant — no cap, no clock, no repository name — and every string the host supplies is printed as the host wrote it.
81
+
82
+ **The two hold families are distinct types.** `ViewerHold` is `GraphHold | TrackerHold`, discriminated on `family`. A graph hold — an open `blocked-by`, a serialize peer being worked — renders inline at its would-be rank; a tracker hold — claimed, parked — renders in the footer. Only the tracker arm carries `label`, so a document cannot label a graph hold: the family is the whole of what it is. A `{ family: 'tracker', reason }` written before the label existed still type-checks.
83
+
84
+ **The NOW row is a pointer identity, never a focus one.** The running issue may also hold a slot, and exactly one element per key carries `data-ig-key`. So the row announces itself through `data-ig-group`, like the `together-with` enclosure does: a click selects the issue and `onSelect` fires with its key, a hover reports it, and the keyboard order is untouched. A running job whose key the document does not carry is dropped with a diagnostic, and a running issue is never counted as isolated.
85
+
86
+ **The refresh control is published, not wired.** Refreshing a mirror is fetching, which this layer never does. The button carries `data-ig-command="refresh"` — the same attribute `@issuegraph/editor` reads for its own controls, whose reducer answers a command it does not know by changing nothing — so a host that already listens for the editor's commands hears this one through the same listener. The demo does exactly that.
87
+
88
+ `normalizeDocument` validates the port the way it validates everything else: a cap or a count that is not a non-negative integer is dropped (the counts whole), a running key the document does not carry or names twice is dropped, and a freshness with an empty `asOf` is dropped whole — each with one diagnostic.
89
+
64
90
  ## The three projections
65
91
 
66
92
  | projection | question it answers |
@@ -99,7 +125,16 @@ So `onSelect` reports **either** an issue key or an edge identity. Distinguish t
99
125
 
100
126
  ## Theming
101
127
 
102
- **Every colour, type and spacing value is a CSS custom property.** The shipped palette is the *default theme*, not the styling — a host retheming it forks nothing.
128
+ **Every colour, type, spacing and surface-treatment value is a CSS custom property.** The shipped palette is the *default theme*, not the styling — a host retheming it forks nothing.
129
+
130
+ The tokens come in **four groups**, and the group decides how the value reaches CSS: `colors` and `type` are emitted verbatim, `metrics` are numbers that gain a `px` unit, and `effects` are emitted verbatim because none of them is a length — a tint is a proportion and an elevation is a whole `box-shadow`. **No tint carries a colour**: it is applied against a colour token that already exists, so retheming a relationship retints its badge. The two elevations are the exception and are deliberately literal — a shadow is dark on a light ground too, so a light theme owns them.
131
+
132
+ ```css
133
+ .ig-badge {
134
+ background: color-mix(in srgb, var(--ig-edge-blocked-by) var(--ig-tint-fill), transparent);
135
+ border-color: color-mix(in srgb, var(--ig-edge-blocked-by) var(--ig-tint-border), transparent);
136
+ }
137
+ ```
103
138
 
104
139
  ```ts
105
140
  import { defaultTheme, extendTheme, renderViewer, viewerStylesheet } from '@issuegraph/viewer';
@@ -133,6 +168,8 @@ That exact theme is the one `acceptance.test.ts` uses, so the example cannot dri
133
168
 
134
169
  **Geometry is theme data too.** `metrics` are numbers, in CSS pixels, and they are what the layout maths reads — so retheming the row height moves the drawing and the stylesheet together rather than only one of them.
135
170
 
171
+ **Adding a token never moves an existing one.** `--ig-row-height` is the *fixed* height of a rail row and keeps that meaning; `--ig-row-min-height` and `--ig-row-padding-block` are the separate vocabulary a content-sized row needs. The same rule holds for the spacing scale and the radius steps, which were added around the values that shipped rather than replacing them.
172
+
136
173
  **The proof that theming is real**: rendering the same document under two themes produces **byte-identical markup** and different styles. If any colour reached the markup, that equality would fail.
137
174
 
138
175
  **CSS ships as a string, not a `.css` file.** An entry that imports CSS cannot be loaded by a bare Node runtime, and a string means no consumer needs a bundler. Install `viewerStylesheet` once and `themeCss(theme)` per theme.
@@ -65,9 +65,8 @@ export type HoldFamily =
65
65
  * into a footer group.
66
66
  */
67
67
  | 'tracker';
68
- /** One reason a slot is held, and which family it belongs to. */
69
- export interface ViewerHold {
70
- readonly family: HoldFamily;
68
+ /** What every hold carries, whichever family imposed it. */
69
+ interface HoldBase {
71
70
  /** Human-readable, host-authored. The viewer renders it verbatim. */
72
71
  readonly reason: string;
73
72
  /**
@@ -88,6 +87,58 @@ export interface ViewerHold {
88
87
  */
89
88
  readonly subject?: string | undefined;
90
89
  }
90
+ /** A hold the graph itself imposes. Drawn inline at the rank the work would have taken. */
91
+ export interface GraphHold extends HoldBase {
92
+ readonly family: 'graph';
93
+ }
94
+ /**
95
+ * A hold the runner or the tracker imposes. Drawn in the footer, with no rank.
96
+ *
97
+ * THE ONE ARM THAT CARRIES A LABEL, and the reason the hold is a union rather
98
+ * than one interface with a family string: the design's footer names each
99
+ * runner hold by ONE WORD — `claimed`, `parked` — beside the sentence, and a
100
+ * graph hold has no such word (its family is the whole of what it is). Putting
101
+ * `label` on both arms would let a document label a graph hold, which nothing
102
+ * draws; narrowing it here makes that a type error rather than a silent drop.
103
+ * OPTIONAL, because a host that supplied `{ family: 'tracker', reason }` before
104
+ * this field existed still does, and still type-checks.
105
+ */
106
+ export interface TrackerHold extends HoldBase {
107
+ readonly family: 'tracker';
108
+ /** The runner's own word for the hold — `claimed`, `parked`. Rendered as a chip before `reason`. */
109
+ readonly label?: string | undefined;
110
+ }
111
+ /**
112
+ * One reason a slot is held, and which family it belongs to. A discriminated
113
+ * union on `family`, so the two families are told apart by the type system
114
+ * and not by a string a call site happens to compare.
115
+ */
116
+ export type ViewerHold = GraphHold | TrackerHold;
117
+ /**
118
+ * A pick-order query the host's engine could not evaluate locally, so the row
119
+ * was ranked some other way. The host says how; the viewer prints the note
120
+ * under a `◐ preview-only` badge and interprets nothing.
121
+ */
122
+ export interface PreviewOnly {
123
+ readonly note: string;
124
+ }
125
+ /**
126
+ * Two ordering signals that disagree about this issue — a mapped label and a
127
+ * frontmatter `priority`, say. WHICH ONE WINS IS THE HOST'S DECISION (the
128
+ * design is explicit that precedence is an owner call, not a default), so the
129
+ * host names the signal it ranked by and the one it set aside; the viewer
130
+ * prints both and strikes only the losing value, so the loser stays legible.
131
+ */
132
+ export interface Disagreement {
133
+ /** The signal the rank came from, as the host spells it: `label:P1 (your mapping)`. */
134
+ readonly used: string;
135
+ readonly ignored: {
136
+ /** Who declared the losing value: `frontmatter`. */
137
+ readonly carrier: string;
138
+ /** The losing value itself, struck through: `priority: 3`. */
139
+ readonly value: string;
140
+ };
141
+ }
91
142
  /** One issue the document knows about. */
92
143
  export interface ViewerIssue {
93
144
  /** The model's node key: `"12"`, or `"owner/repo#12"` when qualified. */
@@ -106,6 +157,20 @@ export interface ViewerIssue {
106
157
  readonly priority: number;
107
158
  /** Absent when the host has no provenance to state. */
108
159
  readonly provenance?: RankProvenance | undefined;
160
+ /** Set when the host's engine ranked this row by a fallback. Absent means the query evaluated. */
161
+ readonly previewOnly?: PreviewOnly | undefined;
162
+ /** Set when two host signals disagreed about this row. Absent means they agreed, or there was one. */
163
+ readonly disagreement?: Disagreement | undefined;
164
+ /**
165
+ * The block's `evidence` field, when the host read one.
166
+ *
167
+ * ABSENT READS `asserted`, which §16d states in those words — so the type is
168
+ * optional rather than defaulted, and the row draws a chip only for
169
+ * `verified`. A panel that printed "asserted" on every row would spend a chip
170
+ * slot saying nothing, and defaulting the value here would make an absent
171
+ * field indistinguishable from a stated one.
172
+ */
173
+ readonly evidence?: 'asserted' | 'verified' | undefined;
109
174
  }
110
175
  /** One relationship, exactly as the format declares it. */
111
176
  export interface ViewerEdge {
@@ -166,6 +231,204 @@ export interface ViewerOrder {
166
231
  * edges. A cycle is still a stuck group, and a member of one is still stuck.
167
232
  */
168
233
  export type ViewerCycle = readonly string[];
234
+ /**
235
+ * The host's tally over the WHOLE order — every number a non-negative integer.
236
+ *
237
+ * SUPPLIED, NEVER COUNTED HERE, and the reason is the same one that keeps the
238
+ * order itself an input: the document this layer holds may be a window (the
239
+ * editor's rail slices the slots) or a slice (a host showing the next
240
+ * twenty-five). A count over those slots would state the reader's scroll
241
+ * position as a fact about the order. The host has the whole order; it counts.
242
+ */
243
+ export interface OrderCounts {
244
+ /** Slots that hold a rank. */
245
+ readonly ranked: number;
246
+ /** Slots that may start now — the number the design compares to the cap. */
247
+ readonly readyNow: number;
248
+ /** Slots held, by either family. */
249
+ readonly held: number;
250
+ }
251
+ /** The job the host's runner is working right now. Every string is the host's. */
252
+ export interface RunningJob {
253
+ /** The document's key for the issue being worked. Must be an issue this document carries. */
254
+ readonly key: string;
255
+ /** The runner's phase word: `Review`. */
256
+ readonly phase: string;
257
+ /** How long it has run, as the host formats it: `12m`. */
258
+ readonly elapsed: string;
259
+ }
260
+ /**
261
+ * How fresh the host's mirror is. The viewer has no clock, so every value here
262
+ * is the host's text, formatted by the host.
263
+ */
264
+ export interface Freshness {
265
+ /** The stamp: `14:32`. Empty drops the whole freshness fact with a diagnostic. */
266
+ readonly asOf: string;
267
+ /** Relative age, when the host states it: `2m ago`. */
268
+ readonly age?: string | undefined;
269
+ /** Past the host's threshold. Renders the word `stale` and `data-stale="true"`. */
270
+ readonly stale?: boolean | undefined;
271
+ /**
272
+ * The label of a refresh control. WHEN PRESENT, AND ONLY THEN, the viewer
273
+ * renders a button carrying `data-ig-command="refresh"` and wires nothing to
274
+ * it — refreshing is the host's, so the host listens for the command.
275
+ */
276
+ readonly refresh?: string | undefined;
277
+ }
278
+ /**
279
+ * A control the host will perform, offered beside a condition.
280
+ *
281
+ * The same rule the refresh button already follows: the viewer draws it only
282
+ * because a host supplied a word for it, publishes the command, and wires
283
+ * nothing. `href` turns it into a link instead — some hosts route rather than
284
+ * act — and is validated against the same scheme allowlist a deep link is,
285
+ * because it becomes the same executable surface when it reaches the DOM.
286
+ */
287
+ export interface ConditionAction {
288
+ readonly label: string;
289
+ readonly href?: string | undefined;
290
+ }
291
+ /**
292
+ * What the host says is true of the panel as a whole, in the three shapes the
293
+ * design names beyond a populated order.
294
+ *
295
+ * A HOST FACT, LIKE EVERY OTHER FIELD HERE. Whether an import is in flight,
296
+ * whether the index could be read, and why nothing is eligible are answers only
297
+ * the host holds — the viewer holds a document, and a document cannot say why
298
+ * it is short. Deriving `empty` from an order with no slots would be the same
299
+ * mistake `OrderCounts` exists to avoid: a fact about the reader's slice stated
300
+ * as a fact about the world.
301
+ *
302
+ * EVERY STRING IS THE HOST'S WORDS, none of them the package's. The sentences
303
+ * this state needs are claims about a host's own runner — that it stays armed,
304
+ * that it continues on its last known order — and a rendering package has no
305
+ * standing to make them.
306
+ *
307
+ * ONE KIND AT A TIME, AND THAT IS A NARROWING RATHER THAN A CLAIM ABOUT THE
308
+ * WORLD. A repository can be importing AND have nothing eligible; a host in
309
+ * that position states `importing`, and because a stated condition replaces the
310
+ * projection's own empty sentence, the reader is told one thing rather than
311
+ * two. A union is used over a list because this type is published: widening a
312
+ * union later is additive, and narrowing a list is not.
313
+ */
314
+ export type ViewerCondition =
315
+ /** The first import is still running. The order below is real and incomplete. */
316
+ {
317
+ readonly kind: 'importing';
318
+ readonly headline: string;
319
+ /** That ranks will change as the rest arrive. */
320
+ readonly caution: string;
321
+ /** Honest progress, as the host counts it: `412 of ~1,200 issues`. */
322
+ readonly progress: string;
323
+ readonly glyph?: string | undefined;
324
+ }
325
+ /** Nothing is eligible. The host says why, and that its pipeline stays armed. */
326
+ | {
327
+ readonly kind: 'empty';
328
+ readonly headline: string;
329
+ readonly reason: string;
330
+ readonly assurance: string;
331
+ readonly action?: ConditionAction | undefined;
332
+ readonly glyph?: string | undefined;
333
+ }
334
+ /** The index could not be read. The order shown is the last one that could. */
335
+ | {
336
+ readonly kind: 'error';
337
+ readonly headline: string;
338
+ readonly assurance: string;
339
+ /**
340
+ * The label of a retry control. WHEN PRESENT, AND ONLY THEN, the viewer
341
+ * publishes `retry:index` and wires nothing — re-reading an index is
342
+ * fetching, which this layer never does.
343
+ *
344
+ * NAMESPACED, AND NOT THE BARE WORD. `data-ig-command` is one namespace
345
+ * shared with `@issuegraph/editor` and with whatever the host publishes
346
+ * beside it, and a bare `retry` already means "retry that write" to the
347
+ * editor's own reducer. Two meanings on one name is a control that looks
348
+ * wired and does the wrong thing, or nothing.
349
+ */
350
+ readonly retry?: string | undefined;
351
+ readonly glyph?: string | undefined;
352
+ };
353
+ /**
354
+ * How much of the host's backlog declares Issuegraph relationships at all.
355
+ *
356
+ * THE DAY-ONE FACT, and it is the host's for the same reason `OrderCounts` is:
357
+ * the document here may be a window or a slice, so a count taken over it would
358
+ * state the reader's scroll position as a fact about the repository. The host
359
+ * has the whole backlog; the host counts.
360
+ *
361
+ * TWO INDEPENDENT FIELDS, and which of them to supply is the host's call. The
362
+ * design draws a header count where adoption is partial and a footer line where
363
+ * it is absent; a viewer that picked between them from `declaring === 0` would
364
+ * be deriving a state from a number, which is the thing this port exists to
365
+ * stop. So both are optional and neither implies the other.
366
+ */
367
+ export interface Adoption {
368
+ /** `12 of 48 declare relationships`. Both non-negative integers. */
369
+ readonly counts?: {
370
+ readonly declaring: number;
371
+ readonly total: number;
372
+ } | undefined;
373
+ /** One quiet line for the panel footer. The host's sentence, link and dismiss word. */
374
+ readonly note?: {
375
+ readonly text: string;
376
+ /**
377
+ * A SHORT LINK BESIDE THE SENTENCE, never the sentence itself.
378
+ *
379
+ * The design asks this line to read quiet — it is the day-one panel's
380
+ * only commentary, on a state that has to feel complete rather than
381
+ * lacking. Hanging the href on `text` made the whole sentence one
382
+ * underlined anchor, which is the loudest element on the panel and the
383
+ * opposite of what was asked for. So the label is its own field.
384
+ */
385
+ readonly link?: {
386
+ readonly text: string;
387
+ readonly href: string;
388
+ } | undefined;
389
+ /** The label of a dismiss control. Absent draws none; the viewer never hides its own line. */
390
+ readonly dismiss?: string | undefined;
391
+ } | undefined;
392
+ }
393
+ /**
394
+ * THE HOST-FACTS PORT: the half of the design the graph cannot derive.
395
+ *
396
+ * The format excludes run state on purpose (SPEC §2, §6.8), so who is working
397
+ * what, how many may run at once, and how fresh the mirror is are facts only
398
+ * the host holds. Every field is optional, and a host that supplies none of
399
+ * them renders exactly the pure-graph view — pinned by test. Nothing here is a
400
+ * viewer constant: no cap, no clock, no repository name.
401
+ */
402
+ export interface HostFacts {
403
+ /**
404
+ * What backlog this is — the qualified repository, beside the surface name.
405
+ *
406
+ * ADDED FOR §17, and on this port rather than a second one for the reason
407
+ * every other fact here is on it: a workspace that took its identity from
408
+ * one place and its freshness from another could name one repository while
409
+ * stamping another's read. The viewer draws no link for it — that would mean
410
+ * knowing a tracker's URL shape, which is the knowledge this layer exists
411
+ * not to have.
412
+ */
413
+ readonly identity?: string | undefined;
414
+ /**
415
+ * The label of §17a's `First pass →` entry.
416
+ *
417
+ * PRESENT MEANS THE HOST OFFERS ONE, absent means it does not — the same
418
+ * shape as `Freshness.refresh`, and for the same reason: the control is
419
+ * drawn with `data-ig-command` and wired to nothing, because whether a
420
+ * backlog has a first pass to run is the host's answer and running it is the
421
+ * host's job.
422
+ */
423
+ readonly firstPass?: string | undefined;
424
+ /** How many ready slots may run at once. A non-negative integer. */
425
+ readonly concurrencyCap?: number | undefined;
426
+ readonly counts?: OrderCounts | undefined;
427
+ readonly running?: readonly RunningJob[] | undefined;
428
+ readonly freshness?: Freshness | undefined;
429
+ readonly condition?: ViewerCondition | undefined;
430
+ readonly adoption?: Adoption | undefined;
431
+ }
169
432
  /** Everything the viewer draws. */
170
433
  export interface ViewerDocument {
171
434
  readonly issues: readonly ViewerIssue[];
@@ -184,6 +447,23 @@ export interface ViewerDocument {
184
447
  * says none, and omission is a type error.
185
448
  */
186
449
  readonly cycles: readonly ViewerCycle[];
450
+ /**
451
+ * What the host knows and the graph does not. OPTIONAL, unlike `order` and
452
+ * `cycles`, because absence here is a complete answer: a host with no runner
453
+ * has no run state to state, and the pure-graph view is what it means.
454
+ */
455
+ readonly host?: HostFacts | undefined;
456
+ }
457
+ /** The host facts after normalisation: `running` always a list, the rest present only when the host stated them. */
458
+ export interface NormalizedHostFacts {
459
+ readonly identity?: string | undefined;
460
+ readonly firstPass?: string | undefined;
461
+ readonly concurrencyCap?: number | undefined;
462
+ readonly counts?: OrderCounts | undefined;
463
+ readonly running: readonly RunningJob[];
464
+ readonly freshness?: Freshness | undefined;
465
+ readonly condition?: ViewerCondition | undefined;
466
+ readonly adoption?: Adoption | undefined;
187
467
  }
188
468
  /**
189
469
  * A normalised document plus an index over it. The index exists so no
@@ -218,6 +498,8 @@ export interface NormalizedDocument {
218
498
  * provenance when in fact its provenance was not supplied.
219
499
  */
220
500
  readonly outOfSetOrigins: ReadonlyMap<string, string>;
501
+ /** The host facts, validated. Always present; every field but `running` is present only when stated. */
502
+ readonly host: NormalizedHostFacts;
221
503
  }
222
504
  export interface NormalizeResult {
223
505
  readonly document: NormalizedDocument;
@@ -236,4 +518,5 @@ export interface NormalizeResult {
236
518
  * render and pass the result down.
237
519
  */
238
520
  export declare function normalizeDocument(input: ViewerDocument): NormalizeResult;
521
+ export {};
239
522
  //# sourceMappingURL=document.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"document.d.ts","sourceRoot":"","sources":["../src/document.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"document.d.ts","sourceRoot":"","sources":["../src/document.ts"],"names":[],"mappings":"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"}