@unotest/protocol 0.32.0 → 0.35.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.
package/dist/index.d.ts CHANGED
@@ -159,6 +159,30 @@ declare const ARTIFACTS_ROOT_ENV = "UNOTEST_ARTIFACTS_ROOT";
159
159
  * back to the source root. Blank is treated as unset — an exported but
160
160
  * empty variable must not relocate anything. */
161
161
  declare function artifactsRootFrom(env: Record<string, string | undefined>, projectRoot: string): string;
162
+ /** Where failure bundles live, as path SEGMENTS — the one spelling of
163
+ * `.unotest/failures` in the monorepo. Segments rather than a string
164
+ * because two kinds of caller need it: one joins it onto a native
165
+ * filesystem path (web, on Windows too), the other builds a posix path
166
+ * for a container or compares an artifact-relative one (box-runner,
167
+ * boxd, the viewer's asset allowlist). */
168
+ declare const FAILURES_DIR_SEGMENTS: readonly [".unotest", "failures"];
169
+ /** Posix `<root>/.unotest/failures`. For container and artifact-relative
170
+ * paths; a native filesystem path joins `FAILURES_DIR_SEGMENTS` instead. */
171
+ declare function failuresRootUnder(root: string): string;
172
+ /** Where THIS process writes and reads failure bundles.
173
+ *
174
+ * Hung off the artifact root by default, which is the project root on
175
+ * every local run. A box overrides it, and has to: the run executes in a
176
+ * container with exactly two mounts, and the default sits outside both —
177
+ * the bundle directory could not be created at all, so a failed run
178
+ * showed no screenshot, no trace and no page.html. The override puts the
179
+ * bundles inside the environment's artifact tree, which both the run and
180
+ * the viewer already have. */
181
+ declare const FAILURES_ROOT_ENV = "UNOTEST_FAILURES_ROOT";
182
+ /** Resolve the failures root from a process-env-like record, falling back
183
+ * to what the caller derives from the artifact root. Blank is treated as
184
+ * unset, like every other root here. */
185
+ declare function failuresRootFrom(env: Record<string, string | undefined>, defaultRoot: string): string;
162
186
  /** Read an environment name from a process-env-like record (`UNOTEST_ENV`),
163
187
  * normalising empty/blank to `undefined` (= base only). */
164
188
  declare function activeEnvName(env: Record<string, string | undefined>): string | undefined;
@@ -225,6 +249,13 @@ declare function requireRunDirFor(runsRoot: string, runId: string): string;
225
249
  /** Project-relative runs root for a target + environment:
226
250
  * `unotest/.runs<suffix>[.<env>]`. */
227
251
  declare function projectRunsRoot(suffix?: string, envName?: string): string;
252
+ /** Where an environment's failure bundles live, under an artifact root.
253
+ * Inside the runs tree rather than beside it, because that tree is the
254
+ * one directory both sides of a box already have: a run's container
255
+ * mounts it, and so does the viewer that serves the screenshots. Every
256
+ * spawner (`box-runner` for containers, `boxd` for host processes) hands
257
+ * this to `UNOTEST_FAILURES_ROOT` in its own coordinates. */
258
+ declare function failuresRootIn(artifactsRoot: string, envName?: string): string;
228
259
  /** Project-relative directory of one run, shard included. The single
229
260
  * place that knows how a run id becomes a path — every writer and reader
230
261
  * goes through here, so the layout cannot drift between them. */
@@ -931,6 +962,21 @@ type CiRunErrorCode =
931
962
  | "no-collections"
932
963
  /** Not a readable request. */
933
964
  | "malformed"
965
+ /** A cloud-minted token whose `exp` has passed, with nothing else wrong
966
+ * with it: this box's operator key signed it, for the right kind, for
967
+ * this box. Its own code because the answer differs from every other
968
+ * refusal — ask the cloud for another pair and retry, rather than "this
969
+ * credential is wrong". Only the holder of a genuinely signed token for
970
+ * THIS box ever sees it, so it tells a guesser nothing. */
971
+ | "expired"
972
+ /** This box has never read the operator's revocation list, so it cannot
973
+ * tell a live cloud-minted token from a withdrawn one and takes
974
+ * neither. A state of the BOX: send the SAME token again after
975
+ * `retryAfterSeconds`, never mint a new one. */
976
+ | "revocation-list-unavailable"
977
+ /** A cloud-minted token that names no project, on a box that serves
978
+ * several. The message lists them; the token has to name one. */
979
+ | "ambiguous-project"
934
980
  /** The bundle could not be installed on the box. Retryable. */
935
981
  | "storage";
936
982
  interface CiRunError {
@@ -1215,6 +1261,17 @@ declare const BUNDLE_UPLOAD_PATH = "/api/box/bundles";
1215
1261
  * credential — `BOX_READ_TOKEN_ENV` in `box-read.ts`. */
1216
1262
  declare const BOX_URL_ENV = "UNOTEST_BOX_URL";
1217
1263
  declare const BOX_TOKEN_ENV = "UNOTEST_BOX_TOKEN";
1264
+ /** What a hand-minted project token starts with. Cloud-signed tokens
1265
+ * carry no such prefix; the one thing the prefix is good for on the
1266
+ * client is recognising a push token pasted where a read token goes. */
1267
+ declare const BOX_PUSH_TOKEN_PREFIX = "unob_";
1268
+ /** What a CLOUD-signed box token starts with — push, read and picker
1269
+ * alike; the kind is inside the signed claims. Minted by `box create`
1270
+ * and `box access`, never by hand. */
1271
+ declare const BOX_SIGNED_TOKEN_PREFIX = "unos_";
1272
+ /** The whole shape of a cloud-signed token, checked before any network
1273
+ * call — box-kit's `encodeSignedToken` output. */
1274
+ declare const BOX_SIGNED_TOKEN: RegExp;
1218
1275
  /** Set by a box on every run it starts: which bundle the sources came
1219
1276
  * from. The runner stamps it into the run's manifest, so history keeps
1220
1277
  * the answer to "which code produced this" after the environment has
@@ -1341,6 +1398,21 @@ type BundleUploadErrorCode =
1341
1398
  | "min-version"
1342
1399
  /** The token's scope does not match where the bundle says it is from. */
1343
1400
  | "scope-mismatch"
1401
+ /** A cloud-minted token whose `exp` has passed, with nothing else wrong
1402
+ * with it: this box's operator key signed it, for the right kind, for
1403
+ * this box. Its own code because the answer differs from every other
1404
+ * refusal — ask the cloud for another pair and retry, rather than "this
1405
+ * credential is wrong". Only the holder of a genuinely signed token for
1406
+ * THIS box ever sees it, so it tells a guesser nothing. */
1407
+ | "expired"
1408
+ /** This box has never read the operator's revocation list, so it cannot
1409
+ * tell a live cloud-minted token from a withdrawn one and takes
1410
+ * neither. A state of the BOX: send the SAME token again after
1411
+ * `retryAfterSeconds`, never mint a new one. */
1412
+ | "revocation-list-unavailable"
1413
+ /** A cloud-minted token that names no project, on a box that serves
1414
+ * several. The message lists them; the token has to name one. */
1415
+ | "ambiguous-project"
1344
1416
  /** The box could not store it (disk, permissions). Retryable. */
1345
1417
  | "storage";
1346
1418
  interface BundleUploadError {
@@ -1522,6 +1594,21 @@ type BoxValuesErrorCode =
1522
1594
  | "reserved"
1523
1595
  /** Not a readable request. */
1524
1596
  | "malformed"
1597
+ /** A cloud-minted token whose `exp` has passed, with nothing else wrong
1598
+ * with it: this box's operator key signed it, for the right kind, for
1599
+ * this box. Its own code because the answer differs from every other
1600
+ * refusal — ask the cloud for another pair and retry, rather than "this
1601
+ * credential is wrong". Only the holder of a genuinely signed token for
1602
+ * THIS box ever sees it, so it tells a guesser nothing. */
1603
+ | "expired"
1604
+ /** This box has never read the operator's revocation list, so it cannot
1605
+ * tell a live cloud-minted token from a withdrawn one and takes
1606
+ * neither. A state of the BOX: send the SAME token again after
1607
+ * `retryAfterSeconds`, never mint a new one. */
1608
+ | "revocation-list-unavailable"
1609
+ /** A cloud-minted token that names no project, on a box that serves
1610
+ * several. The message lists them; the token has to name one. */
1611
+ | "ambiguous-project"
1525
1612
  /** The box could not write its state. Retryable. */
1526
1613
  | "storage";
1527
1614
  interface BoxValuesError {
@@ -1562,6 +1649,315 @@ interface BoxEnvValuesView {
1562
1649
  secrets: string[];
1563
1650
  }
1564
1651
 
1652
+ declare const RUN_MANIFEST_FILE = "manifest.json";
1653
+ interface RunManifest {
1654
+ /** Format-version of this manifest. Bump only on breaking schema
1655
+ * changes — additive optional fields don't require it. Starts at 1. */
1656
+ schemaVersion: 1;
1657
+ /** Identifies which RunRequest variant produced this run. */
1658
+ kind: RunKind;
1659
+ /** Original (un-sanitized) `ref` from the request — scenario `name`
1660
+ * for `kind:"scenario"`, collection `name` for `kind:"collection"`.
1661
+ * The `runId` directory uses a sanitized form; this carries the
1662
+ * human-readable original. */
1663
+ ref: string;
1664
+ /** Run-id of the parent collection-run when this is a child scenario
1665
+ * spawned inside a collection. Absent for top-level scenario-runs
1666
+ * and for collection-runs themselves. */
1667
+ parentRunId?: string;
1668
+ /** Adapter `name` that produced this run (`"@unotest/web"`,
1669
+ * `"@unotest/mobile"`). Lets the viewer pick rendering details for
1670
+ * runner-specific bundle contents without runner branches in core
1671
+ * logic. */
1672
+ adapter: string;
1673
+ /** Wallclock at runner start. Distinct from the first event's `t`
1674
+ * (which may have leading delay for adapter setup). */
1675
+ startedAt: number;
1676
+ /** Environment name the run resolved (`UNOTEST_ENV` / `--env`), absent
1677
+ * for base. Self-description only — placement already encodes it (the
1678
+ * run lives under `.runs<suffix>.<env>`), so nothing filters on this. */
1679
+ env?: string;
1680
+ /** Opt-in artifact-capture flags as resolved from the runner's env at
1681
+ * start (`UNOTEST_CONSOLE` / `UNOTEST_NETWORK`). Recorded here so the
1682
+ * viewer can tell "capture was disabled" apart from "capture was on but
1683
+ * the run aborted before writing console.json / network.json" — a
1684
+ * distinction the mere presence of those files can't make. Optional: runs
1685
+ * produced before this field existed simply omit it, and the viewer falls
1686
+ * back to a file-presence heuristic. */
1687
+ capture?: {
1688
+ console: boolean;
1689
+ network: boolean;
1690
+ };
1691
+ /** Which test bundle produced this run, when the sources came from one
1692
+ * (`UNOTEST_BUNDLE_ID`, set by a box). Absent for every local run,
1693
+ * where the sources are simply the working directory.
1694
+ *
1695
+ * Recorded so history stays readable after the fact: a box runs many
1696
+ * bundles into one environment, and "which code produced this red
1697
+ * run" is otherwise unanswerable once the environment moved on. */
1698
+ bundleId?: string;
1699
+ /** What set the run off. Absent on a manifest written before the field
1700
+ * existed, and on every run nobody described — both read as `cli`
1701
+ * (see {@link manifestTrigger}). */
1702
+ trigger?: RunTrigger;
1703
+ }
1704
+ /** Who or what started a run. `schedule` — a box's own timer; `ci` — a
1705
+ * provider's push or pull request through the box; `manual` — a person
1706
+ * (or their agent) pressing Run in the viewer; `cli` — a terminal, which
1707
+ * is also the answer for a run that said nothing. */
1708
+ type RunTriggerKind = "schedule" | "ci" | "manual" | "cli";
1709
+ interface RunTrigger {
1710
+ kind: RunTriggerKind;
1711
+ /** Who, or which change: a login, `push a1b2c3d (feature/x)`. Absent when
1712
+ * the trigger has nobody to name (a schedule). */
1713
+ by?: string;
1714
+ }
1715
+ /** `UNOTEST_RUN_TRIGGER` — a {@link RunTriggerKind}, set by whoever spawns
1716
+ * the runner: a box for its scheduled and CI runs, the viewer for a run
1717
+ * ordered from its UI. A terminal sets nothing. */
1718
+ declare const RUN_TRIGGER_ENV = "UNOTEST_RUN_TRIGGER";
1719
+ /** `UNOTEST_RUN_ACTOR` — the trigger's `by`, optional. */
1720
+ declare const RUN_ACTOR_ENV = "UNOTEST_RUN_ACTOR";
1721
+ /** The trigger the environment describes, or undefined when it describes
1722
+ * none — a value that is not a trigger kind is a caller's mistake and is
1723
+ * treated as silence rather than guessed at. */
1724
+ declare function runTriggerFromEnv(env: Readonly<Record<string, string | undefined>>): RunTrigger | undefined;
1725
+ /** The variables that hand a trigger to a runner — the inverse of
1726
+ * {@link runTriggerFromEnv}, so a box and the viewer spell them the same
1727
+ * way. */
1728
+ declare function runTriggerEnv(trigger: RunTrigger): Record<string, string>;
1729
+ /** A manifest's trigger, with the default spelled out: no field = `cli`. */
1730
+ declare function manifestTrigger(manifest: Pick<RunManifest, "trigger">): RunTrigger;
1731
+
1732
+ /** Session-door root:
1733
+ *
1734
+ * GET /api/box/notify every project
1735
+ * GET /api/box/notify/<project> one project, secrets as set:true
1736
+ * PUT /api/box/notify/<project>/channels/<id> create or update
1737
+ * PATCH /api/box/notify/<project>/channels/<id> {"enabled": …}
1738
+ * DELETE /api/box/notify/<project>/channels/<id>
1739
+ * POST /api/box/notify/<project>/channels/<id>/test
1740
+ * PUT/PATCH/DELETE /api/box/notify/<project>/rules/<id>
1741
+ * PUT/DELETE /api/box/notify/<project>/quiet-hours
1742
+ * GET /api/box/notify/<project>/series the ledger
1743
+ * POST /api/box/notify/<project>/series/<key>/reset
1744
+ * PUT/DELETE /api/box/notify/<project>/mutes/<id>
1745
+ * GET /api/box/notify/<project>/preview?rule=<id>&state=<state>
1746
+ */
1747
+ declare const BOX_NOTIFY_PATH = "/api/box/notify";
1748
+ declare function boxNotifyProjectPath(project: string): string;
1749
+ declare function boxNotifyChannelPath(project: string, channelId: string): string;
1750
+ declare function boxNotifyTestPath(project: string, channelId: string): string;
1751
+ declare function boxNotifyRulePath(project: string, ruleId: string): string;
1752
+ declare function boxNotifyQuietHoursPath(project: string): string;
1753
+ declare function boxNotifySeriesPath(project: string): string;
1754
+ /** The key (`project/env/kind:name`) travels as ONE segment. */
1755
+ declare function boxNotifySeriesResetPath(project: string, seriesKey: string): string;
1756
+ declare function boxNotifyMutePath(project: string, muteId: string): string;
1757
+ declare function boxNotifyPreviewPath(project: string, ruleId: string, state: BoxNotifyState): string;
1758
+ type BoxNotifyChannelKind = "slack" | "telegram" | "webhook";
1759
+ declare const BOX_NOTIFY_CHANNEL_KINDS: readonly BoxNotifyChannelKind[];
1760
+ type BoxNotifyTriggerKind = RunTriggerKind;
1761
+ declare const BOX_NOTIFY_TRIGGER_KINDS: readonly BoxNotifyTriggerKind[];
1762
+ /** What a rule subscribes to. `passed` is said only about runs that are
1763
+ * not scheduled ticks; a schedule says `recovered`. */
1764
+ type BoxNotifyEvent = "failed" | "recovered" | "not-run" | "passed";
1765
+ declare const BOX_NOTIFY_EVENTS: readonly BoxNotifyEvent[];
1766
+ /** What a message can be about — the events plus the reminder. */
1767
+ type BoxNotifyState = BoxNotifyEvent | "still-failing";
1768
+ declare const BOX_NOTIFY_STATES: readonly BoxNotifyState[];
1769
+ /** A credential as a page sees it: whether there is one. */
1770
+ interface BoxNotifySecret {
1771
+ set: boolean;
1772
+ }
1773
+ interface BoxNotifyLastDelivery {
1774
+ at: number;
1775
+ outcome: "sent" | "failed";
1776
+ error?: string;
1777
+ }
1778
+ interface BoxNotifyChannelCommon {
1779
+ id: string;
1780
+ name: string;
1781
+ enabled: boolean;
1782
+ lastDelivery?: BoxNotifyLastDelivery;
1783
+ }
1784
+ type BoxNotifyChannelView = BoxNotifyChannelCommon & ({
1785
+ kind: "slack";
1786
+ webhookUrl: BoxNotifySecret;
1787
+ } | {
1788
+ kind: "telegram";
1789
+ botToken: BoxNotifySecret;
1790
+ chatId: string;
1791
+ threadId?: string;
1792
+ }
1793
+ /** Header VALUES are credentials (the receiver's `Authorization`,
1794
+ * most of the time): the view keeps the names and says `{ set }`. */
1795
+ | {
1796
+ kind: "webhook";
1797
+ url: string;
1798
+ secret: BoxNotifySecret;
1799
+ headers?: Record<string, BoxNotifySecret>;
1800
+ });
1801
+ interface BoxNotifyRule {
1802
+ id: string;
1803
+ name?: string;
1804
+ enabled: boolean;
1805
+ /** Absent = every environment of the project. */
1806
+ environments?: string[];
1807
+ triggers: BoxNotifyTriggerKind[];
1808
+ events: BoxNotifyEvent[];
1809
+ /** Channel ids. */
1810
+ channels: string[];
1811
+ afterFailures: number;
1812
+ /** Milliseconds. */
1813
+ repeatEvery?: number;
1814
+ }
1815
+ type BoxNotifyMuteScope = {
1816
+ series: string;
1817
+ } | {
1818
+ project: true;
1819
+ };
1820
+ interface BoxNotifyMute {
1821
+ id: string;
1822
+ scope: BoxNotifyMuteScope;
1823
+ /** Unix milliseconds; absent = until unmuted. */
1824
+ until?: number;
1825
+ by: string;
1826
+ reason?: string;
1827
+ at: number;
1828
+ }
1829
+ interface BoxNotifyQuietHours {
1830
+ from: string;
1831
+ to: string;
1832
+ /** IANA zone. */
1833
+ tz: string;
1834
+ }
1835
+ interface BoxNotifyProjectView {
1836
+ project: string;
1837
+ channels: BoxNotifyChannelView[];
1838
+ rules: BoxNotifyRule[];
1839
+ mutes: BoxNotifyMute[];
1840
+ quietHours?: BoxNotifyQuietHours;
1841
+ }
1842
+ interface BoxNotifyView {
1843
+ projects: BoxNotifyProjectView[];
1844
+ }
1845
+ /** One series of the ledger, as the page's table shows it. */
1846
+ interface BoxNotifySeriesEntry {
1847
+ /** `<project>/<environment>/<kind>:<name>`. */
1848
+ key: string;
1849
+ environment: string;
1850
+ target: {
1851
+ kind: "collection" | "scenario";
1852
+ name: string;
1853
+ };
1854
+ state: "ok" | "failed";
1855
+ /** The daemon's word for why (`tests-failed`, `not-arrived`, …). */
1856
+ reason: string;
1857
+ since: number;
1858
+ failures: number;
1859
+ lastNotifiedAt?: number;
1860
+ /** The mute covering it now, if any. */
1861
+ mute?: BoxNotifyMute;
1862
+ }
1863
+ interface BoxNotifySeriesView {
1864
+ project: string;
1865
+ series: BoxNotifySeriesEntry[];
1866
+ }
1867
+ /** The text a rule would send for one state — the daemon renders it from
1868
+ * a made-up run so the page can show it next to the rule. */
1869
+ interface BoxNotifyPreview {
1870
+ state: BoxNotifyState;
1871
+ title: string;
1872
+ lines: string[];
1873
+ url?: string;
1874
+ }
1875
+ /** `POST …/test` — what happened to the test event. */
1876
+ type BoxNotifyTestResult =
1877
+ /** `note` — a caveat on a delivery that went through: the channel is
1878
+ * switched off, so real events will not follow yet. */
1879
+ {
1880
+ status: "sent";
1881
+ channel: string;
1882
+ note?: string;
1883
+ } | {
1884
+ status: "failed";
1885
+ channel: string;
1886
+ message: string;
1887
+ };
1888
+ /** What a write answers with: which record, and what became of it. */
1889
+ interface BoxNotifyChanged {
1890
+ status: "created" | "updated" | "removed";
1891
+ id: string;
1892
+ }
1893
+ /** `PUT …/channels/<id>`. On an update a secret left out is KEPT — the
1894
+ * page never has the value to send back; on a create it is required. */
1895
+ type BoxNotifyChannelWrite = {
1896
+ name: string;
1897
+ enabled?: boolean;
1898
+ } & ({
1899
+ kind: "slack";
1900
+ webhookUrl?: string;
1901
+ } | {
1902
+ kind: "telegram";
1903
+ botToken?: string;
1904
+ chatId: string;
1905
+ threadId?: string;
1906
+ } | {
1907
+ kind: "webhook";
1908
+ url: string;
1909
+ secret?: string;
1910
+ headers?: Record<string, string>;
1911
+ });
1912
+ interface BoxNotifyEnabledPatch {
1913
+ enabled: boolean;
1914
+ }
1915
+ /** `PUT …/rules/<id>`. `enabled` absent keeps the rule's switch as it is
1916
+ * (a new rule is on). */
1917
+ interface BoxNotifyRuleWrite {
1918
+ name?: string;
1919
+ enabled?: boolean;
1920
+ environments?: string[];
1921
+ triggers?: BoxNotifyTriggerKind[];
1922
+ events?: BoxNotifyEvent[];
1923
+ channels: string[];
1924
+ afterFailures?: number;
1925
+ repeatEvery?: number;
1926
+ }
1927
+ interface BoxNotifyMuteWrite {
1928
+ scope: BoxNotifyMuteScope;
1929
+ until?: number;
1930
+ reason?: string;
1931
+ }
1932
+ type BoxNotifyQuietHoursWrite = BoxNotifyQuietHours;
1933
+ /** Why a notify request was refused. A code, not a message — the CLI and
1934
+ * the page turn each into their own advice. */
1935
+ type BoxNotifyErrorCode =
1936
+ /** No actor on the session door. */
1937
+ "unauthorized" | "unknown-project" | "unknown-channel" | "unknown-rule" | "unknown-mute" | "unknown-series"
1938
+ /** The body is not what the route takes, or the daemon's schema refused
1939
+ * it (a rule naming no channel, a duplicate name, a bad zone). */
1940
+ | "malformed" | "storage";
1941
+ interface BoxNotifyError {
1942
+ error: {
1943
+ code: BoxNotifyErrorCode;
1944
+ message: string;
1945
+ };
1946
+ }
1947
+ declare function parseBoxNotifyView(value: unknown): BoxNotifyView | null;
1948
+ declare function parseBoxNotifyProjectView(value: unknown): BoxNotifyProjectView | null;
1949
+ declare function parseBoxNotifySeriesView(value: unknown): BoxNotifySeriesView | null;
1950
+ declare function parseBoxNotifyPreview(value: unknown): BoxNotifyPreview | null;
1951
+ declare function parseBoxNotifyTestResult(value: unknown): BoxNotifyTestResult | null;
1952
+ declare function parseBoxNotifyChanged(value: unknown): BoxNotifyChanged | null;
1953
+ /** The daemon's refusal, or null when the body is not one of ours. */
1954
+ declare function parseBoxNotifyError(value: unknown): BoxNotifyError | null;
1955
+ declare function isBoxNotifyState(value: unknown): value is BoxNotifyState;
1956
+ /** The trigger a preview is rendered with, from a rule's first trigger —
1957
+ * kept here so the daemon and the page name the same sample actor. */
1958
+ declare function boxNotifyPreviewTrigger(kind: BoxNotifyTriggerKind): RunTrigger;
1959
+ declare function parseBoxNotifyMuteScope(value: unknown): BoxNotifyMuteScope | null;
1960
+
1565
1961
  /** The personal read token, for people and agents that would rather not
1566
1962
  * repeat it on every command line. Deliberately NOT `UNOTEST_BOX_TOKEN`
1567
1963
  * (see {@link BOX_TOKEN_ENV}): one is the project's push credential, the
@@ -1645,14 +2041,40 @@ type BoxReadErrorCode =
1645
2041
  * and the right response is to wait — which is why it is not folded
1646
2042
  * into "could not reach the box", whose advice is to check the URL. */
1647
2043
  | "unavailable"
2044
+ /** A cloud-minted token whose `exp` has passed, with nothing else wrong
2045
+ * with it: this box's operator key signed it, for the right kind, for
2046
+ * this box. Its own code because the answer differs from every other
2047
+ * refusal — ask the cloud for another pair and retry, rather than "this
2048
+ * credential is wrong". Only the holder of a genuinely signed token for
2049
+ * THIS box ever sees it, so it tells a guesser nothing. */
2050
+ | "expired"
2051
+ /** The box cannot judge a cloud-minted token yet: it has never read the
2052
+ * operator's revocation list, and a token that cannot be checked against
2053
+ * it is refused rather than trusted. A state of the BOX, not of the
2054
+ * token — which is why it is not folded into `unauthorized`: the answer
2055
+ * is to send the same token again shortly ({@link
2056
+ * BoxReadErrorBody.error.retryAfterSeconds}, and a `Retry-After`
2057
+ * header), never to mint a new one. */
2058
+ | "revocation-list-unavailable"
1648
2059
  /** Not a readable request. */
1649
2060
  | "malformed";
2061
+ /** How long a box asks a caller to wait before presenting the same token
2062
+ * again after {@link BoxReadErrorCode} `revocation-list-unavailable`. One
2063
+ * number for both doors of a box — the guard's read door and the daemon's
2064
+ * push door — because a client that meets one meets the other on the same
2065
+ * box in the same state. Roughly a tick of the updater, which is what has
2066
+ * to happen for the answer to change. */
2067
+ declare const BOX_REVOCATIONS_RETRY_AFTER_SECONDS = 60;
1650
2068
  /** The body of a refusal. Named `…Body` because the CLIENT's exception
1651
2069
  * class is `BoxReadError` — this is the JSON it was built from. */
1652
2070
  interface BoxReadErrorBody {
1653
2071
  error: {
1654
2072
  code: BoxReadErrorCode;
1655
2073
  message: string;
2074
+ /** How long to wait before sending the SAME request again. Only on the
2075
+ * refusals that are worth retrying unchanged — today
2076
+ * `revocation-list-unavailable`; the header carries the same number. */
2077
+ retryAfterSeconds?: number;
1656
2078
  };
1657
2079
  }
1658
2080
  /** Parse a refusal. Null when the body is not one of ours — an HTML
@@ -1665,6 +2087,55 @@ declare function parseBoxReadError(value: unknown): BoxReadErrorBody | null;
1665
2087
  * not recognise is not a box answering. */
1666
2088
  declare function parseBoxReadEnvironments(value: unknown): BoxReadEnvironment[] | null;
1667
2089
 
2090
+ declare const BOX_RUNS_SEGMENT = "runs";
2091
+ /** Set by the guard, forwarded by the viewer verbatim, verified by the
2092
+ * daemon: WHO clicked, in a form the thing in between cannot write.
2093
+ * Named here because three packages have to spell it identically and
2094
+ * this is the one they all already depend on — the signing and the
2095
+ * verification live on the box side (`@unotest/box-kit`), which is
2096
+ * where the secret is. */
2097
+ declare const ACTOR_TICKET_HEADER = "x-unotest-actor-ticket";
2098
+ /** Set by the guard on its own requests to the daemon. The daemon reads
2099
+ * the actor label only next to a valid one. */
2100
+ declare const GUARD_SECRET_HEADER = "x-unotest-guard-secret";
2101
+ /** `/api/box/envs/<project>/<env>/runs`. */
2102
+ declare function boxRunsPath(project: string, environment: string): string;
2103
+ /** `/api/box/envs/<project>/<env>/runs/<runId>`. */
2104
+ declare function boxRunPath(project: string, environment: string, runId: string): string;
2105
+ /** What the viewer asks for. Deliberately not the viewer's own
2106
+ * `RunRequest`: that one carries local concerns (worker counts, debug
2107
+ * flags) the box decides for itself, and a box route that accepted them
2108
+ * would be a second way to configure a run. */
2109
+ interface BoxRunRequest {
2110
+ kind: "collection" | "scenario";
2111
+ /** Collection name, or a scenario ref (`folder/test`). */
2112
+ ref: string;
2113
+ }
2114
+ /** The daemon accepted the ticket. The run has NOT started — on a busy
2115
+ * box it may wait behind a suite for a while, which is the whole point
2116
+ * of there being one queue.
2117
+ *
2118
+ * No ticket name: the queue's file names are the box's own business,
2119
+ * and stopping a run goes back through `DELETE …/runs/<runId>` rather
2120
+ * than through the queue directly. The run id is the only handle a
2121
+ * caller needs, and the only one it is given. */
2122
+ interface BoxRunAccepted {
2123
+ runId: string;
2124
+ acceptedAt: number;
2125
+ }
2126
+ type BoxRunState = "queued" | "running" | "finished";
2127
+ interface BoxRunStatus {
2128
+ runId: string;
2129
+ state: BoxRunState;
2130
+ /** Present once the run ended. `null` when it died on a signal. */
2131
+ exitCode?: number | null;
2132
+ startedAt?: number;
2133
+ finishedAt?: number;
2134
+ }
2135
+ declare function parseBoxRunRequest(value: unknown): BoxRunRequest | null;
2136
+ declare function parseBoxRunAccepted(value: unknown): BoxRunAccepted | null;
2137
+ declare function parseBoxRunStatus(value: unknown): BoxRunStatus | null;
2138
+
1668
2139
  declare const WORKSPACE_SCHEMA_VERSION = 1;
1669
2140
  /** Written by the host beside the artifacts it manages:
1670
2141
  * `<artifactsRoot>/unotest/.workspace.json`. In the artifact tree and
@@ -1927,55 +2398,6 @@ interface CollectionMeta {
1927
2398
  prepare: string | null;
1928
2399
  }
1929
2400
 
1930
- declare const RUN_MANIFEST_FILE = "manifest.json";
1931
- interface RunManifest {
1932
- /** Format-version of this manifest. Bump only on breaking schema
1933
- * changes — additive optional fields don't require it. Starts at 1. */
1934
- schemaVersion: 1;
1935
- /** Identifies which RunRequest variant produced this run. */
1936
- kind: RunKind;
1937
- /** Original (un-sanitized) `ref` from the request — scenario `name`
1938
- * for `kind:"scenario"`, collection `name` for `kind:"collection"`.
1939
- * The `runId` directory uses a sanitized form; this carries the
1940
- * human-readable original. */
1941
- ref: string;
1942
- /** Run-id of the parent collection-run when this is a child scenario
1943
- * spawned inside a collection. Absent for top-level scenario-runs
1944
- * and for collection-runs themselves. */
1945
- parentRunId?: string;
1946
- /** Adapter `name` that produced this run (`"@unotest/web"`,
1947
- * `"@unotest/mobile"`). Lets the viewer pick rendering details for
1948
- * runner-specific bundle contents without runner branches in core
1949
- * logic. */
1950
- adapter: string;
1951
- /** Wallclock at runner start. Distinct from the first event's `t`
1952
- * (which may have leading delay for adapter setup). */
1953
- startedAt: number;
1954
- /** Environment name the run resolved (`UNOTEST_ENV` / `--env`), absent
1955
- * for base. Self-description only — placement already encodes it (the
1956
- * run lives under `.runs<suffix>.<env>`), so nothing filters on this. */
1957
- env?: string;
1958
- /** Opt-in artifact-capture flags as resolved from the runner's env at
1959
- * start (`UNOTEST_CONSOLE` / `UNOTEST_NETWORK`). Recorded here so the
1960
- * viewer can tell "capture was disabled" apart from "capture was on but
1961
- * the run aborted before writing console.json / network.json" — a
1962
- * distinction the mere presence of those files can't make. Optional: runs
1963
- * produced before this field existed simply omit it, and the viewer falls
1964
- * back to a file-presence heuristic. */
1965
- capture?: {
1966
- console: boolean;
1967
- network: boolean;
1968
- };
1969
- /** Which test bundle produced this run, when the sources came from one
1970
- * (`UNOTEST_BUNDLE_ID`, set by a box). Absent for every local run,
1971
- * where the sources are simply the working directory.
1972
- *
1973
- * Recorded so history stays readable after the fact: a box runs many
1974
- * bundles into one environment, and "which code produced this red
1975
- * run" is otherwise unanswerable once the environment moved on. */
1976
- bundleId?: string;
1977
- }
1978
-
1979
2401
  /** Snapshot file holding entry + every helper source that was loaded. */
1980
2402
  declare const RUN_SOURCES_FILE = "sources.json";
1981
2403
  interface RunSources {
@@ -2346,6 +2768,17 @@ declare function removeEnvVar(content: string, key: string): {
2346
2768
  content: string;
2347
2769
  removed: boolean;
2348
2770
  };
2771
+ /**
2772
+ * Replace the value of an existing `KEY=…` line in place — same line,
2773
+ * same neighbours, same comments. Returns `replaced: false` and the
2774
+ * content untouched when no assignment for `key` exists; the caller then
2775
+ * inserts (see `insertEnvVar`). Together they are an upsert that never
2776
+ * moves a variable a person placed deliberately.
2777
+ */
2778
+ declare function replaceEnvVar(content: string, key: string, value: string): {
2779
+ content: string;
2780
+ replaced: boolean;
2781
+ };
2349
2782
 
2350
2783
  /** Which group the user is adding into. App/runner → `.env`, secret →
2351
2784
  * `.secrets`. Mirrors VariableCategory as an INPUT (the user's choice). */
@@ -2894,4 +3327,4 @@ declare const JUDGE_ENV: {
2894
3327
  readonly skipPreflight: "UNOTEST_JUDGE_SKIP_PREFLIGHT";
2895
3328
  };
2896
3329
 
2897
- export { ARTIFACTS_ROOT_ENV, type AddVariablePlan, type AddVariablePlanInput, type AppPathPickerSpec, type AppServerEvent, type AuthoringRunRequest, BLOBS_DIR, BOX_ENV_VALUES_SEGMENT, BOX_READ_ENVIRONMENTS_PATH, BOX_READ_ENVIRONMENT_HEADER, BOX_READ_TOKEN_ENV, BOX_READ_TOKEN_PREFIX, BOX_REVEAL_SEGMENT, BOX_SECRET_NAMES_ENV, BOX_TOKEN_ENV, BOX_URL_ENV, BOX_VALUES_PATH, BOX_VARIABLE_NAMES_ENV, BROWSER_CHANNEL_ENV, BROWSER_ENV, BUNDLED_BROWSER_CHANNEL, BUNDLE_ID_ENV, BUNDLE_MANIFEST_FILE, BUNDLE_SCHEMA_VERSION, BUNDLE_UPLOAD_PATH, type BoxEnvValuesReplaceRequest, type BoxEnvValuesView, type BoxReadEnvironment, type BoxReadErrorBody, type BoxReadErrorCode, type BoxSecretRevealResponse, type BoxSecretsRevealResponse, type BoxValueChanged, type BoxValueKind, type BoxValueSetRequest, type BoxValuesError, type BoxValuesErrorCode, type BoxValuesReplaceRequest, type BoxValuesReplaced, type BoxValuesResponse, type BreakpointEntry, type BreakpointsFile, type BundleGitInfo, type BundleManifest, type BundleUploadError, type BundleUploadErrorCode, type BundleUploadOk, type BundleUploadResponse, type BundleUploadStatus, type BundleVariableGap, CI_RUN_PATH, COLLECTIONS_SUBDIR, COLLECTION_NAME_FORBIDDEN_RE, COMMANDS_FILE, type CheckSeverity, type CiProviderId, type CiQueuedRun, type CiRunAccepted, type CiRunError, type CiRunErrorCode, type CiRunRequest, type CiRunResponse, type CollectionMeta, type CollectionRunArtifact, type CollectionRunFinishedEvent, type CollectionRunRequest, type CollectionRunStartedEvent, type CollectionRunTab, type CollectionScenarioFinishedEvent, type CollectionScenarioStartedEvent, type CollectionScheduleEntry, type CollectionTab, DAY_INDEX_FILE, DAY_SHORT, type DbgCommand, type DbgCommandAbort, type DbgCommandClearBp, type DbgCommandContinue, type DbgCommandKind, type DbgCommandPause, type DbgCommandPickerStart, type DbgCommandPickerStop, type DbgCommandProbe, type DbgCommandRecord, type DbgCommandSetBp, type DbgCommandSnapshot, type DbgCommandStep, type DbgCommandWheel, type DebugCapabilities, type DoctorCheck, type DoctorContext, type DslDiagnostic, type DslValidateContext, type DslVocabArg, type DslVocabCategory, type DslVocabEntry, E2E_SUBDIR, ENV_FILE, EXPECT_FAIL_ANNOTATION, type EnqueueRunInput, type EnvChangedMessage, type EnvFile, type EnvUpdate, type EnvVar, type ErrorMessage, FREQ_FIELDS, type FailureBundleWrittenEvent, type FsBreakpointsChangedMessage, type FsCollectionRunStepMessage, type FsCollectionsChangedMessage, type FsHelpersChangedMessage, type FsRunFinishedMessage, type FsRunStartedMessage, type FsRunStepMessage, type FsScenariosChangedMessage, HEARTBEAT_FILE, HELPERS_SUBDIR, type HelperMeta, type HelperTab, type HostRequirement, type IDslLanguageService, type ILaunchedProcess, type IProcessLauncher, type IRunQueue, type IRunnerAdapter, InvalidBlobHashError, JUDGE_ENV, JUDGE_ROUTES, type JudgeErrorResponse, type JudgeHealthResponse, type JudgeRequest, type JudgeVerdict, type JudgeVerdictEvent, LOCK_FILE, LOG_FILE, type LaunchSpec, type LocatorPickedEvent, type LockFile, type LogEvent, type LogLineMessage, type LoopIterationEvent, type Matcher, type NoteEvent, type OverviewTab, PICKER_SNAPSHOT_FILE, type ParsedTicketName, type PausedEvent, type PickerMode, type ProbeMatch, type ProbePinned, type ProbeResult, type ProbeResultEvent, QUEUE_DISABLED_ENV, QUEUE_GLOBAL_DIR_ENV, QUEUE_GLOBAL_SLOTS_ENV, QUEUE_LEASE_ENV, QUEUE_MUTEX_FILE, QUEUE_PRIORITIES, QUEUE_RUNNING_DIR, QUEUE_SCHEMA_VERSION, QUEUE_SLOTS_DIR, QUEUE_SUBDIR, QUEUE_TICKETS_DIR, type QueueChangedMessage, type QueueEntry, type QueuePoolState, type QueuePriority, type QueueProducer, type QueueProducerKind, type QueueSnapshot, type QueueTicket, type QueueTicketCi, type QueueTicketKind, type QueueTicketSource, RUNNER_CONFIG_KEYS, RUNNER_SETTING_PREFIX, RUNS_SUBDIR, RUNTIME_FILE, RUN_INDEX_SCHEMA_VERSION, RUN_MANIFEST_FILE, RUN_SOURCES_FILE, type RecordedActionKind, type RegexLiteral, type ResumedEvent, type RunArtifact, type RunFinishedEvent, type RunId, type RunIndexEntry, type RunIndexHeader, type RunKind, type RunManifest, type RunMeta, type RunOutcome, type RunQueueLease, type RunQueueTicketHandle, type RunRequest, type RunSources, type RunStartedEvent, type RunStatus, RunnerAdapterNotFoundError, RunnerNotConfiguredError, type RuntimeState, type RuntimeStateFile, SCENARIOS_INDEX_DIR, SCENARIOS_LATEST_FILE, SCENARIO_RECENT_WINDOW, SCHEDULES_FILE, SCHEDULES_FINGERPRINT_ENV, SECRETS_FILE, SEGMENT_NAME_FORBIDDEN_RE, SNAPSHOTS_SUBDIR, STDERR_FILE, STDOUT_FILE, STEPS_FILE, type ScenarioAnnotations, type ScenarioLatestEntry, type ScenarioMeta, type ScenarioRunRequest, type ScenarioRunTab, type ScenarioScheduleEntry, type ScenarioTab, type ScenariosLatest, type ScenariosPayload, type ScheduleEntry, type ScheduleFreq, type ScheduleSpec, type ScreenshotEvent, type SnapshotTab, type SoftFailureRecord, type StepBlockFinishedEvent, type StepBlockStartedEvent, type StepFailEvent, type StepOkEvent, type StepPosition, type StepStartedEvent, TARGET_ENV_VAR, TERMINAL_RUNTIME_STATES, TERMINAL_WS_EVENT, type TabKind, type TabKindName, type TerminalClientMessage, type TerminalCloseMessage, type TerminalDataMessage, type TerminalErrorMessage, type TerminalExitMessage, type TerminalKind, type TerminalOutputMessage, type TerminalResizeMessage, type TerminalServerMessage, type TerminalSpawnMessage, type ToolCallEvent, type ToolResultEvent, UNOTEST_DIR, UnplaceableRunIdError, UnsupportedRunKindError, type VariableCategory, type VariableKind, type VariablePlanError, WEEK_CHIP_ORDER, WORKSPACE_FILE, WORKSPACE_SCHEMA_VERSION, type WheelChangedEvent, type WorkspaceBundle, type WorkspaceFile, type WsMessage, type WsMessageKind, activeEnvName, artifactsRootFrom, blobPathFor, blobRelPathFor, blobRelSegmentsFor, blobsRootFor, boxEnvSecretRevealPath, boxEnvSecretsRevealPath, boxEnvValuePath, boxEnvValuesPath, boxValueKindOfSegment, boxValuePath, boxValuesPath, canonicalScheduleSet, categorizeVariable, compareQueueTicketNames, cronFromSpec, debugDirFor, debuggerFileFor, declaredEnvKeys, decodeNameList, deleteShadowWarning, describeBundle, describeCron, describeSpec, describeTicketCi, encodeNameList, envFileFor, envKeys, envLayerFilesFor, envNamesFromDirListing, foldScenarioRun, formatNextTick, insertEnvVar, isAnnotationLine, isEnvVarName, isExternalVarName, isFailingStatus, isQueueDirName, isRecord, isRegexLiteral, isRunnerConfigKey, isRunnerSetting, isRunsDirName, isTerminalRuntimeState, makeQueueTicketName, makeRunId, mergeSchedules, nextTickFromSpec, parseAppServerEvent, parseBoxEnvValuesReplaceRequest, parseBoxReadEnvironments, parseBoxReadError, parseBoxSecretRevealResponse, parseBoxSecretsRevealResponse, parseBoxValueSetRequest, parseBoxValuesReplaceRequest, parseBoxValuesResponse, parseBundleManifest, parseBundleUploadResponse, parseCiProvider, parseCiRunRequest, parseCiRunResponse, parseEnvContent, parseQueueTicket, parseQueueTicketName, parseScenarioAnnotations, parseScheduleEntry, parseSchedulesDoc, parseSchedulesJson, parseWorkspaceFile, planAddVariable, projectQueueRoot, projectRunDirFor, projectRunsRoot, queueDirFor, queuePriorityFromRank, queuePriorityRank, regexLiteral, removeEnvVar, requireRunDirFor, reservedBoxValueNames, runDirFor, runIdStartedAt, runsDirFor, sanitizeRunIdSegment, scenarioIndexFileName, scenarioRefFromFileName, scheduleTarget, secretsFileFor, secretsLayerFilesFor, serializeEnvValue, shardDaysDescending, shardDirFor, shardPathForRunId, shardPathForTimestamp, specFromCron, testDirFor, validateCollectionName, validateSegmentName };
3330
+ export { ACTOR_TICKET_HEADER, ARTIFACTS_ROOT_ENV, type AddVariablePlan, type AddVariablePlanInput, type AppPathPickerSpec, type AppServerEvent, type AuthoringRunRequest, BLOBS_DIR, BOX_ENV_VALUES_SEGMENT, BOX_NOTIFY_CHANNEL_KINDS, BOX_NOTIFY_EVENTS, BOX_NOTIFY_PATH, BOX_NOTIFY_STATES, BOX_NOTIFY_TRIGGER_KINDS, BOX_PUSH_TOKEN_PREFIX, BOX_READ_ENVIRONMENTS_PATH, BOX_READ_ENVIRONMENT_HEADER, BOX_READ_TOKEN_ENV, BOX_READ_TOKEN_PREFIX, BOX_REVEAL_SEGMENT, BOX_REVOCATIONS_RETRY_AFTER_SECONDS, BOX_RUNS_SEGMENT, BOX_SECRET_NAMES_ENV, BOX_SIGNED_TOKEN, BOX_SIGNED_TOKEN_PREFIX, BOX_TOKEN_ENV, BOX_URL_ENV, BOX_VALUES_PATH, BOX_VARIABLE_NAMES_ENV, BROWSER_CHANNEL_ENV, BROWSER_ENV, BUNDLED_BROWSER_CHANNEL, BUNDLE_ID_ENV, BUNDLE_MANIFEST_FILE, BUNDLE_SCHEMA_VERSION, BUNDLE_UPLOAD_PATH, type BoxEnvValuesReplaceRequest, type BoxEnvValuesView, type BoxNotifyChanged, type BoxNotifyChannelKind, type BoxNotifyChannelView, type BoxNotifyChannelWrite, type BoxNotifyEnabledPatch, type BoxNotifyError, type BoxNotifyErrorCode, type BoxNotifyEvent, type BoxNotifyLastDelivery, type BoxNotifyMute, type BoxNotifyMuteScope, type BoxNotifyMuteWrite, type BoxNotifyPreview, type BoxNotifyProjectView, type BoxNotifyQuietHours, type BoxNotifyQuietHoursWrite, type BoxNotifyRule, type BoxNotifyRuleWrite, type BoxNotifySecret, type BoxNotifySeriesEntry, type BoxNotifySeriesView, type BoxNotifyState, type BoxNotifyTestResult, type BoxNotifyTriggerKind, type BoxNotifyView, type BoxReadEnvironment, type BoxReadErrorBody, type BoxReadErrorCode, type BoxRunAccepted, type BoxRunRequest, type BoxRunState, type BoxRunStatus, type BoxSecretRevealResponse, type BoxSecretsRevealResponse, type BoxValueChanged, type BoxValueKind, type BoxValueSetRequest, type BoxValuesError, type BoxValuesErrorCode, type BoxValuesReplaceRequest, type BoxValuesReplaced, type BoxValuesResponse, type BreakpointEntry, type BreakpointsFile, type BundleGitInfo, type BundleManifest, type BundleUploadError, type BundleUploadErrorCode, type BundleUploadOk, type BundleUploadResponse, type BundleUploadStatus, type BundleVariableGap, CI_RUN_PATH, COLLECTIONS_SUBDIR, COLLECTION_NAME_FORBIDDEN_RE, COMMANDS_FILE, type CheckSeverity, type CiProviderId, type CiQueuedRun, type CiRunAccepted, type CiRunError, type CiRunErrorCode, type CiRunRequest, type CiRunResponse, type CollectionMeta, type CollectionRunArtifact, type CollectionRunFinishedEvent, type CollectionRunRequest, type CollectionRunStartedEvent, type CollectionRunTab, type CollectionScenarioFinishedEvent, type CollectionScenarioStartedEvent, type CollectionScheduleEntry, type CollectionTab, DAY_INDEX_FILE, DAY_SHORT, type DbgCommand, type DbgCommandAbort, type DbgCommandClearBp, type DbgCommandContinue, type DbgCommandKind, type DbgCommandPause, type DbgCommandPickerStart, type DbgCommandPickerStop, type DbgCommandProbe, type DbgCommandRecord, type DbgCommandSetBp, type DbgCommandSnapshot, type DbgCommandStep, type DbgCommandWheel, type DebugCapabilities, type DoctorCheck, type DoctorContext, type DslDiagnostic, type DslValidateContext, type DslVocabArg, type DslVocabCategory, type DslVocabEntry, E2E_SUBDIR, ENV_FILE, EXPECT_FAIL_ANNOTATION, type EnqueueRunInput, type EnvChangedMessage, type EnvFile, type EnvUpdate, type EnvVar, type ErrorMessage, FAILURES_DIR_SEGMENTS, FAILURES_ROOT_ENV, FREQ_FIELDS, type FailureBundleWrittenEvent, type FsBreakpointsChangedMessage, type FsCollectionRunStepMessage, type FsCollectionsChangedMessage, type FsHelpersChangedMessage, type FsRunFinishedMessage, type FsRunStartedMessage, type FsRunStepMessage, type FsScenariosChangedMessage, GUARD_SECRET_HEADER, HEARTBEAT_FILE, HELPERS_SUBDIR, type HelperMeta, type HelperTab, type HostRequirement, type IDslLanguageService, type ILaunchedProcess, type IProcessLauncher, type IRunQueue, type IRunnerAdapter, InvalidBlobHashError, JUDGE_ENV, JUDGE_ROUTES, type JudgeErrorResponse, type JudgeHealthResponse, type JudgeRequest, type JudgeVerdict, type JudgeVerdictEvent, LOCK_FILE, LOG_FILE, type LaunchSpec, type LocatorPickedEvent, type LockFile, type LogEvent, type LogLineMessage, type LoopIterationEvent, type Matcher, type NoteEvent, type OverviewTab, PICKER_SNAPSHOT_FILE, type ParsedTicketName, type PausedEvent, type PickerMode, type ProbeMatch, type ProbePinned, type ProbeResult, type ProbeResultEvent, QUEUE_DISABLED_ENV, QUEUE_GLOBAL_DIR_ENV, QUEUE_GLOBAL_SLOTS_ENV, QUEUE_LEASE_ENV, QUEUE_MUTEX_FILE, QUEUE_PRIORITIES, QUEUE_RUNNING_DIR, QUEUE_SCHEMA_VERSION, QUEUE_SLOTS_DIR, QUEUE_SUBDIR, QUEUE_TICKETS_DIR, type QueueChangedMessage, type QueueEntry, type QueuePoolState, type QueuePriority, type QueueProducer, type QueueProducerKind, type QueueSnapshot, type QueueTicket, type QueueTicketCi, type QueueTicketKind, type QueueTicketSource, RUNNER_CONFIG_KEYS, RUNNER_SETTING_PREFIX, RUNS_SUBDIR, RUNTIME_FILE, RUN_ACTOR_ENV, RUN_INDEX_SCHEMA_VERSION, RUN_MANIFEST_FILE, RUN_SOURCES_FILE, RUN_TRIGGER_ENV, type RecordedActionKind, type RegexLiteral, type ResumedEvent, type RunArtifact, type RunFinishedEvent, type RunId, type RunIndexEntry, type RunIndexHeader, type RunKind, type RunManifest, type RunMeta, type RunOutcome, type RunQueueLease, type RunQueueTicketHandle, type RunRequest, type RunSources, type RunStartedEvent, type RunStatus, type RunTrigger, type RunTriggerKind, RunnerAdapterNotFoundError, RunnerNotConfiguredError, type RuntimeState, type RuntimeStateFile, SCENARIOS_INDEX_DIR, SCENARIOS_LATEST_FILE, SCENARIO_RECENT_WINDOW, SCHEDULES_FILE, SCHEDULES_FINGERPRINT_ENV, SECRETS_FILE, SEGMENT_NAME_FORBIDDEN_RE, SNAPSHOTS_SUBDIR, STDERR_FILE, STDOUT_FILE, STEPS_FILE, type ScenarioAnnotations, type ScenarioLatestEntry, type ScenarioMeta, type ScenarioRunRequest, type ScenarioRunTab, type ScenarioScheduleEntry, type ScenarioTab, type ScenariosLatest, type ScenariosPayload, type ScheduleEntry, type ScheduleFreq, type ScheduleSpec, type ScreenshotEvent, type SnapshotTab, type SoftFailureRecord, type StepBlockFinishedEvent, type StepBlockStartedEvent, type StepFailEvent, type StepOkEvent, type StepPosition, type StepStartedEvent, TARGET_ENV_VAR, TERMINAL_RUNTIME_STATES, TERMINAL_WS_EVENT, type TabKind, type TabKindName, type TerminalClientMessage, type TerminalCloseMessage, type TerminalDataMessage, type TerminalErrorMessage, type TerminalExitMessage, type TerminalKind, type TerminalOutputMessage, type TerminalResizeMessage, type TerminalServerMessage, type TerminalSpawnMessage, type ToolCallEvent, type ToolResultEvent, UNOTEST_DIR, UnplaceableRunIdError, UnsupportedRunKindError, type VariableCategory, type VariableKind, type VariablePlanError, WEEK_CHIP_ORDER, WORKSPACE_FILE, WORKSPACE_SCHEMA_VERSION, type WheelChangedEvent, type WorkspaceBundle, type WorkspaceFile, type WsMessage, type WsMessageKind, activeEnvName, artifactsRootFrom, blobPathFor, blobRelPathFor, blobRelSegmentsFor, blobsRootFor, boxEnvSecretRevealPath, boxEnvSecretsRevealPath, boxEnvValuePath, boxEnvValuesPath, boxNotifyChannelPath, boxNotifyMutePath, boxNotifyPreviewPath, boxNotifyPreviewTrigger, boxNotifyProjectPath, boxNotifyQuietHoursPath, boxNotifyRulePath, boxNotifySeriesPath, boxNotifySeriesResetPath, boxNotifyTestPath, boxRunPath, boxRunsPath, boxValueKindOfSegment, boxValuePath, boxValuesPath, canonicalScheduleSet, categorizeVariable, compareQueueTicketNames, cronFromSpec, debugDirFor, debuggerFileFor, declaredEnvKeys, decodeNameList, deleteShadowWarning, describeBundle, describeCron, describeSpec, describeTicketCi, encodeNameList, envFileFor, envKeys, envLayerFilesFor, envNamesFromDirListing, failuresRootFrom, failuresRootIn, failuresRootUnder, foldScenarioRun, formatNextTick, insertEnvVar, isAnnotationLine, isBoxNotifyState, isEnvVarName, isExternalVarName, isFailingStatus, isQueueDirName, isRecord, isRegexLiteral, isRunnerConfigKey, isRunnerSetting, isRunsDirName, isTerminalRuntimeState, makeQueueTicketName, makeRunId, manifestTrigger, mergeSchedules, nextTickFromSpec, parseAppServerEvent, parseBoxEnvValuesReplaceRequest, parseBoxNotifyChanged, parseBoxNotifyError, parseBoxNotifyMuteScope, parseBoxNotifyPreview, parseBoxNotifyProjectView, parseBoxNotifySeriesView, parseBoxNotifyTestResult, parseBoxNotifyView, parseBoxReadEnvironments, parseBoxReadError, parseBoxRunAccepted, parseBoxRunRequest, parseBoxRunStatus, parseBoxSecretRevealResponse, parseBoxSecretsRevealResponse, parseBoxValueSetRequest, parseBoxValuesReplaceRequest, parseBoxValuesResponse, parseBundleManifest, parseBundleUploadResponse, parseCiProvider, parseCiRunRequest, parseCiRunResponse, parseEnvContent, parseQueueTicket, parseQueueTicketName, parseScenarioAnnotations, parseScheduleEntry, parseSchedulesDoc, parseSchedulesJson, parseWorkspaceFile, planAddVariable, projectQueueRoot, projectRunDirFor, projectRunsRoot, queueDirFor, queuePriorityFromRank, queuePriorityRank, regexLiteral, removeEnvVar, replaceEnvVar, requireRunDirFor, reservedBoxValueNames, runDirFor, runIdStartedAt, runTriggerEnv, runTriggerFromEnv, runsDirFor, sanitizeRunIdSegment, scenarioIndexFileName, scenarioRefFromFileName, scheduleTarget, secretsFileFor, secretsLayerFilesFor, serializeEnvValue, shardDaysDescending, shardDirFor, shardPathForRunId, shardPathForTimestamp, specFromCron, testDirFor, validateCollectionName, validateSegmentName };