evals-lab 0.14.0 → 0.15.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/CHANGELOG.md +44 -0
- package/lab/VERSION +1 -1
- package/lab/demo/manifest.json +2 -2
- package/lab/demo/pipelines/demo-1.json +14 -11
- package/lab/demo/pipelines/demo-2.json +14 -11
- package/lab/demo/pipelines/documents.json +3 -4
- package/lab/demo/pipelines/sentiment.json +1 -1
- package/lab/demo/pipelines/weather-alerts.json +1 -1
- package/lab/demo/pipelines/wordings.json +1 -1
- package/lab/evals-core.mjs +243 -164
- package/lab/kinds/list.mjs +327 -223
- package/lab/server.py +130 -28
- package/lab/web/dist/assets/gallery-Cy8oycht.js +5 -0
- package/lab/web/dist/assets/gallery-eVJoaK-6.css +1 -0
- package/lab/web/dist/assets/main-B-LGmhPu.css +1 -0
- package/lab/web/dist/assets/main-wqNvXpWp.js +15 -0
- package/lab/web/dist/assets/tokens-CWVzmtid.css +1 -0
- package/lab/web/dist/assets/tokens-mCS6IZGh.js +64 -0
- package/lab/web/dist/gallery.html +4 -4
- package/lab/web/dist/index.html +4 -4
- package/package.json +1 -1
- package/lab/web/dist/assets/gallery-B_-TH0F-.css +0 -1
- package/lab/web/dist/assets/gallery-qrf0ZGXK.js +0 -5
- package/lab/web/dist/assets/main-D6xARg2A.js +0 -16
- package/lab/web/dist/assets/main-xVU6J7Gi.css +0 -1
- package/lab/web/dist/assets/tokens-C8dqXDHN.js +0 -62
- package/lab/web/dist/assets/tokens-tQ7zTPkd.css +0 -1
package/lab/server.py
CHANGED
|
@@ -2611,7 +2611,7 @@ class Sources:
|
|
|
2611
2611
|
provider, json.dumps(request) if request else None, status, error, file))
|
|
2612
2612
|
|
|
2613
2613
|
def snapshot(self, sid):
|
|
2614
|
-
"""
|
|
2614
|
+
"""Get response (#587): produce the Source's Call through the provider,
|
|
2615
2615
|
the `take` hook refusing a token and redacting, and keep it as a
|
|
2616
2616
|
version of the response its name says (#596). A response already held
|
|
2617
2617
|
gains the version and keeps its row, whatever was done to it -- an edit
|
|
@@ -2661,14 +2661,19 @@ class Sources:
|
|
|
2661
2661
|
return {"name": stored, "outcome": "added", "provider": provider, "request": request,
|
|
2662
2662
|
"status": status, "bytes": len(kept)}, None
|
|
2663
2663
|
if path.read_bytes() == kept:
|
|
2664
|
+
# Status is the newest fetch's, though Updated stays when the
|
|
2665
|
+
# current response came.
|
|
2666
|
+
with self.store.lock, closing(sqlite3.connect(self.store.path)) as db, db:
|
|
2667
|
+
db.execute("UPDATE source_calls SET status = ?, error = NULL WHERE source = ? AND name = ?",
|
|
2668
|
+
(status, sid, name))
|
|
2664
2669
|
return {"name": name, "outcome": "unchanged", "status": status}, None
|
|
2665
2670
|
added, err = self._respond(sid, name, kept, "fetched", status)
|
|
2666
2671
|
if err:
|
|
2667
2672
|
return None, err
|
|
2668
2673
|
with self.store.lock, closing(sqlite3.connect(self.store.path)) as db, db:
|
|
2669
|
-
db.execute("UPDATE source_calls SET request = ?, provider = ?, error = NULL, file = ? "
|
|
2674
|
+
db.execute("UPDATE source_calls SET request = ?, provider = ?, status = ?, error = NULL, file = ? "
|
|
2670
2675
|
"WHERE source = ? AND name = ?",
|
|
2671
|
-
(json.dumps(request) if request else None, provider, name, sid, name))
|
|
2676
|
+
(json.dumps(request) if request else None, provider, status, name, sid, name))
|
|
2672
2677
|
return {"name": name, "outcome": "fetched", "provider": provider, "request": request,
|
|
2673
2678
|
"status": status, "bytes": len(kept), **added}, None
|
|
2674
2679
|
|
|
@@ -3700,23 +3705,89 @@ def upgrade_body(body):
|
|
|
3700
3705
|
|
|
3701
3706
|
|
|
3702
3707
|
# The filter-set body's version: evals-core.ts's FILTER_SET_VERSION. Version 3
|
|
3703
|
-
# (#432)
|
|
3704
|
-
#
|
|
3705
|
-
#
|
|
3706
|
-
#
|
|
3707
|
-
#
|
|
3708
|
-
|
|
3709
|
-
|
|
3708
|
+
# (#432) dropped the `stage` version 2 (#405) gave it. Version 4 (#615) has
|
|
3709
|
+
# seven verbs that run wherever they sit, around a Response Format a set may
|
|
3710
|
+
# straddle (its `format`). A filter set is a Library row the lab stores and
|
|
3711
|
+
# versions like an eval group (#336, FilterSets below); this and its twin are
|
|
3712
|
+
# the body it keeps, held to evals-core.ts by proxy-check.py.
|
|
3713
|
+
FILTER_SET_BODY_VERSION = 4
|
|
3714
|
+
# A version-3 filter's types that read the reply's text; the rest read items.
|
|
3715
|
+
V3_TEXT_TYPES = ("rewrite-text", "reject-text")
|
|
3716
|
+
|
|
3717
|
+
|
|
3718
|
+
def filter_v4(f):
|
|
3719
|
+
"""A version-3 filter as the version-4 verb that reads a reply exactly as
|
|
3720
|
+
it did: kinds/list.ts's filterV4, in Python. A filter of no version-3
|
|
3721
|
+
type comes back as it was. Pure."""
|
|
3722
|
+
if not isinstance(f, dict):
|
|
3723
|
+
return f
|
|
3724
|
+
op = f.get("op") if isinstance(f.get("op"), dict) else {}
|
|
3725
|
+
|
|
3726
|
+
def pick(**keys):
|
|
3727
|
+
# A setting the old op lacked stays absent, as JavaScript's undefined
|
|
3728
|
+
# does in JSON; one it held as null stays null.
|
|
3729
|
+
return {k: op[v] for k, v in keys.items() if v in op}
|
|
3730
|
+
|
|
3731
|
+
def as_(kind, new_op=None):
|
|
3732
|
+
out = {k: v for k, v in f.items() if k != "op"}
|
|
3733
|
+
out["type"] = kind
|
|
3734
|
+
if new_op is not None:
|
|
3735
|
+
out["op"] = new_op
|
|
3736
|
+
if f.get("type") in V3_TEXT_TYPES and isinstance(f.get("tests"), list):
|
|
3737
|
+
out["tests"] = [{**t, "separator": "none"} if isinstance(t, dict) else t for t in f["tests"]]
|
|
3738
|
+
return out
|
|
3739
|
+
|
|
3740
|
+
replacement = op.get("replacement")
|
|
3741
|
+
replacement = "" if replacement is None else replacement
|
|
3742
|
+
t = f.get("type")
|
|
3743
|
+
if t == "rewrite-text":
|
|
3744
|
+
k = op.get("kind")
|
|
3745
|
+
if k in ("thinking", "preamble", "fences"):
|
|
3746
|
+
return as_("remove", {"kind": k})
|
|
3747
|
+
if k == "trim":
|
|
3748
|
+
return as_("trim", {"bullets": False})
|
|
3749
|
+
if k == "literal":
|
|
3750
|
+
return as_("replace", {"kind": "text", **pick(find="find"), "replacement": replacement})
|
|
3751
|
+
if k == "replace":
|
|
3752
|
+
return as_("replace", {"kind": "pattern", **pick(pattern="pattern"), "replacement": replacement})
|
|
3753
|
+
if k == "case":
|
|
3754
|
+
return as_("change-case", pick(mode="mode"))
|
|
3755
|
+
if k == "first":
|
|
3756
|
+
return as_("keep-first", pick(n="n", unit="unit"))
|
|
3757
|
+
if k == "extract":
|
|
3758
|
+
return as_("extract", pick(pattern="pattern"))
|
|
3759
|
+
return f
|
|
3760
|
+
if t in ("reject-text", "reject-reply"):
|
|
3761
|
+
return as_("reject")
|
|
3762
|
+
if t == "drop-item":
|
|
3763
|
+
return as_("remove", {"kind": "items"})
|
|
3764
|
+
if t == "rewrite-item":
|
|
3765
|
+
return as_("change-case", pick(mode="mode")) if op.get("kind") == "case" else as_("trim", {"bullets": True})
|
|
3766
|
+
if t == "keep-first":
|
|
3767
|
+
return as_("keep-first", {**pick(n="n"), "unit": "items"})
|
|
3768
|
+
return f
|
|
3710
3769
|
|
|
3711
3770
|
|
|
3712
3771
|
def upgrade_filter_set_body(body):
|
|
3713
|
-
"""An earlier filter-set body as today's (version
|
|
3714
|
-
upgradeFilterSetBody, in Python. A version-1
|
|
3715
|
-
|
|
3716
|
-
|
|
3717
|
-
|
|
3718
|
-
|
|
3719
|
-
|
|
3772
|
+
"""An earlier filter-set body as today's (version 4): evals-core.ts's
|
|
3773
|
+
upgradeFilterSetBody, in Python. A version-1 to -3 body loses any `stage`,
|
|
3774
|
+
each filter becomes its verb (filter_v4), and one that held both text and
|
|
3775
|
+
item filters puts the text ones first, then its `format` marker, then the
|
|
3776
|
+
item ones. A version-4 body, and anything that is not a body, come back as
|
|
3777
|
+
they are. Pure."""
|
|
3778
|
+
if not isinstance(body, dict) or body.get("version") not in (1, 2, 3):
|
|
3779
|
+
return body
|
|
3780
|
+
rest = {k: v for k, v in body.items() if k != "stage"}
|
|
3781
|
+
filters = rest.get("filters")
|
|
3782
|
+
if not isinstance(filters, list):
|
|
3783
|
+
return {**rest, "version": FILTER_SET_BODY_VERSION}
|
|
3784
|
+
is_text = [isinstance(f, dict) and f.get("type") in V3_TEXT_TYPES for f in filters]
|
|
3785
|
+
text = [f for f, x in zip(filters, is_text) if x]
|
|
3786
|
+
items = [f for f, x in zip(filters, is_text) if not x]
|
|
3787
|
+
out = {**rest, "version": FILTER_SET_BODY_VERSION, "filters": [filter_v4(f) for f in text + items]}
|
|
3788
|
+
if text and items:
|
|
3789
|
+
out["format"] = len(text)
|
|
3790
|
+
return out
|
|
3720
3791
|
|
|
3721
3792
|
|
|
3722
3793
|
def body_prompt(body):
|
|
@@ -3862,6 +3933,8 @@ def free_name(base: str, taken: set, op: str) -> str:
|
|
|
3862
3933
|
# are the body's; the per-filter shape is the core's to judge, as a case's
|
|
3863
3934
|
# metrics are (dataset_problem). The suffixing is the generic one.
|
|
3864
3935
|
FILTER_SET_FIELDS = ("version", "filters")
|
|
3936
|
+
# A body may also say where a job's Response Format reads among its filters.
|
|
3937
|
+
FILTER_SET_OPTIONAL = ("format",)
|
|
3865
3938
|
FILTER_SET_NAME_MAX = 80
|
|
3866
3939
|
unique_filter_set_name = unique_dataset_name
|
|
3867
3940
|
|
|
@@ -3872,7 +3945,7 @@ def filter_set_problem(body) -> str:
|
|
|
3872
3945
|
if not isinstance(body, dict):
|
|
3873
3946
|
return "a filter set's body is a JSON object"
|
|
3874
3947
|
for k in body:
|
|
3875
|
-
if k not in FILTER_SET_FIELDS:
|
|
3948
|
+
if k not in FILTER_SET_FIELDS + FILTER_SET_OPTIONAL:
|
|
3876
3949
|
return f"a filter set's body has \"{k}\", which is not a filter-set field"
|
|
3877
3950
|
for k in FILTER_SET_FIELDS:
|
|
3878
3951
|
if k not in body:
|
|
@@ -3881,6 +3954,9 @@ def filter_set_problem(body) -> str:
|
|
|
3881
3954
|
return f"a filter set's body is version {FILTER_SET_BODY_VERSION}"
|
|
3882
3955
|
if not isinstance(body["filters"], list) or not all(isinstance(f, dict) for f in body["filters"]):
|
|
3883
3956
|
return "filters has to be a list of filters"
|
|
3957
|
+
at = body.get("format")
|
|
3958
|
+
if at is not None and (type(at) is not int or not 0 <= at <= len(body["filters"])):
|
|
3959
|
+
return "Response Format has to sit among its filters"
|
|
3884
3960
|
return ""
|
|
3885
3961
|
|
|
3886
3962
|
|
|
@@ -4144,9 +4220,13 @@ class Prompts:
|
|
|
4144
4220
|
prompt -- the version reading its words, or a new version if they
|
|
4145
4221
|
were edited after the pick; any other cell links to the prompt
|
|
4146
4222
|
already reading its words, or starts a new, unnamed one. A use is
|
|
4147
|
-
recorded once: a second call for the same run changes nothing.
|
|
4223
|
+
recorded once: a second call for the same run changes nothing.
|
|
4224
|
+
Returns each recorded cell's prompt, {target, job, prompt: {id,
|
|
4225
|
+
name}}: the page links a cell to it, so the next edit of typed words
|
|
4226
|
+
is that prompt's next version rather than another unnamed one."""
|
|
4148
4227
|
# The caller's connection: a Row still reads by index, as it does.
|
|
4149
4228
|
db.row_factory = sqlite3.Row
|
|
4229
|
+
recorded = []
|
|
4150
4230
|
for i, sc, k, cell in cells_of(run):
|
|
4151
4231
|
sid, sname = scenario_ref(sc, i)
|
|
4152
4232
|
# Echo's words are no wording under test: the item is its reply,
|
|
@@ -4169,6 +4249,9 @@ class Prompts:
|
|
|
4169
4249
|
db.execute("INSERT OR IGNORE INTO prompt_uses (prompt_id, version, run_id, scenario_id, "
|
|
4170
4250
|
"scenario_name, job, at) VALUES (?, ?, ?, ?, ?, ?, ?)",
|
|
4171
4251
|
(pid, version, rid, sid, sname, k, at))
|
|
4252
|
+
name = db.execute("SELECT name FROM prompts WHERE id = ?", (pid,)).fetchone()[0]
|
|
4253
|
+
recorded.append({"target": sid, "job": k, "prompt": {"id": pid, "name": name}})
|
|
4254
|
+
return recorded
|
|
4172
4255
|
|
|
4173
4256
|
def backfill(self, runs):
|
|
4174
4257
|
"""The runs from before the library, read into it once. [runs] is
|
|
@@ -6964,7 +7047,8 @@ class Queue:
|
|
|
6964
7047
|
|
|
6965
7048
|
# ---- submit ---------------------------------------------------------
|
|
6966
7049
|
|
|
6967
|
-
def submit(self, run: dict, dataset=None, rerun_of=None, groups=None, filter_sets=None, produced=None
|
|
7050
|
+
def submit(self, run: dict, dataset=None, rerun_of=None, groups=None, filter_sets=None, produced=None,
|
|
7051
|
+
recorded=None):
|
|
6968
7052
|
"""
|
|
6969
7053
|
A new queued run. `run` is the run document (docs/pipeline-model.md
|
|
6970
7054
|
§5): the pipeline, the profiles it resolved to without their keys, its
|
|
@@ -6977,7 +7061,8 @@ class Queue:
|
|
|
6977
7061
|
run a re-run was queued from. Returns the row. Its items are that list,
|
|
6978
7062
|
or the one inline text, each through every scenario -- so the total is
|
|
6979
7063
|
the list's length, repeats and all, the same count the runner and the
|
|
6980
|
-
page make.
|
|
7064
|
+
page make. A `recorded` list is given each cell's prompt, as
|
|
7065
|
+
Prompts.record returns them.
|
|
6981
7066
|
"""
|
|
6982
7067
|
rid = secrets.token_hex(6)
|
|
6983
7068
|
now = time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime())
|
|
@@ -6987,7 +7072,7 @@ class Queue:
|
|
|
6987
7072
|
"snapshot, results, progress, totals, dataset, rerun_of, groups, filter_sets, produced, workspace) "
|
|
6988
7073
|
"VALUES (?, ?, 0, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)",
|
|
6989
7074
|
(rid, "queued", now, json.dumps(run), "[]",
|
|
6990
|
-
json.dumps({"current": None, "n": 0, "total": total}),
|
|
7075
|
+
json.dumps({"current": None, "at": None, "n": 0, "total": total}),
|
|
6991
7076
|
json.dumps({"ran": 0, "passed": 0, "found": 0, "of": 0}),
|
|
6992
7077
|
None if dataset is None else json.dumps(dataset), rerun_of,
|
|
6993
7078
|
None if groups is None else json.dumps(groups),
|
|
@@ -6997,7 +7082,9 @@ class Queue:
|
|
|
6997
7082
|
# Its prompts' uses, in the same transaction: a run is in the
|
|
6998
7083
|
# library the moment it is queued, or not queued at all.
|
|
6999
7084
|
if self.prompts is not None:
|
|
7000
|
-
self.prompts.record(db, rid, run, now)
|
|
7085
|
+
links = self.prompts.record(db, rid, run, now)
|
|
7086
|
+
if recorded is not None:
|
|
7087
|
+
recorded.extend(links)
|
|
7001
7088
|
# Read back under the lock the worker dequeues under, so the
|
|
7002
7089
|
# answer is the run as it was queued: an idle worker can take it
|
|
7003
7090
|
# the moment the lock is let go.
|
|
@@ -7582,13 +7669,15 @@ class Queue:
|
|
|
7582
7669
|
continue
|
|
7583
7670
|
if obj.get("event") == "start":
|
|
7584
7671
|
# The item the worker has just picked up, named before
|
|
7585
|
-
# it is asked: what "current" means to a reader.
|
|
7672
|
+
# it is asked: what "current" means to a reader. Its
|
|
7673
|
+
# place too, since an item can repeat: the row in flight.
|
|
7586
7674
|
with self.lock, closing(sqlite3.connect(self.store.path)) as db, db:
|
|
7587
7675
|
cur = db.execute("SELECT progress FROM queue WHERE id = ?", (rid,)).fetchone()
|
|
7588
7676
|
if cur is None:
|
|
7589
7677
|
return
|
|
7590
7678
|
progress = json.loads(cur[0])
|
|
7591
7679
|
progress["current"] = obj.get("name")
|
|
7680
|
+
progress["at"] = obj["item"] if isinstance(obj["item"], int) else None
|
|
7592
7681
|
db.execute("UPDATE queue SET progress = ? WHERE id = ?",
|
|
7593
7682
|
(json.dumps(progress), rid))
|
|
7594
7683
|
continue
|
|
@@ -7672,6 +7761,13 @@ class Queue:
|
|
|
7672
7761
|
with self.lock, closing(sqlite3.connect(self.store.path)) as db, db:
|
|
7673
7762
|
db.execute("UPDATE queue SET status = ?, finished_at = ?, error = ?, "
|
|
7674
7763
|
"totals = ? WHERE id = ?", (status, now, error, json.dumps(totals), rid))
|
|
7764
|
+
# A terminal run has no row in flight.
|
|
7765
|
+
cur = db.execute("SELECT progress FROM queue WHERE id = ?", (rid,)).fetchone()
|
|
7766
|
+
if cur is not None:
|
|
7767
|
+
progress = json.loads(cur[0])
|
|
7768
|
+
if progress.get("at") is not None:
|
|
7769
|
+
progress["at"] = None
|
|
7770
|
+
db.execute("UPDATE queue SET progress = ? WHERE id = ?", (json.dumps(progress), rid))
|
|
7675
7771
|
|
|
7676
7772
|
def _read_report(self, rid):
|
|
7677
7773
|
"""The worker's final report, which never shares the progress stream:
|
|
@@ -7894,10 +7990,12 @@ def worker_destinations(run: dict):
|
|
|
7894
7990
|
# is the one its body is read by (#477).
|
|
7895
7991
|
# 18: a dynamic Source's content graded as saved pins one response, `pin:
|
|
7896
7992
|
# {name, n}`, which a fetch, an edit or a Restore never moves (#596).
|
|
7897
|
-
|
|
7993
|
+
# 19: a job's filters are one list around its Response Format, and filters are
|
|
7994
|
+
# seven verbs (#615).
|
|
7995
|
+
PIPELINE_VERSION = 19
|
|
7898
7996
|
# What a stored run may be: the current version, and the ones evals-core.ts's
|
|
7899
7997
|
# upgradePipeline reads. A new submission is upgraded to the current one.
|
|
7900
|
-
READABLE_VERSIONS = (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18)
|
|
7998
|
+
READABLE_VERSIONS = (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19)
|
|
7901
7999
|
TARGET_CAP = 4
|
|
7902
8000
|
# Target steps whose words the Prompt library does not record as a use: they
|
|
7903
8001
|
# ask no model (evals-core.ts's STEP_TYPES.echo).
|
|
@@ -9503,8 +9601,12 @@ class Handler(BaseHTTPRequestHandler):
|
|
|
9503
9601
|
# The worker reads a body per group now (#233), so a run may link
|
|
9504
9602
|
# several; each body is kept with the row under `<id>@<n>`. A live
|
|
9505
9603
|
# dynamic run carries its produced item bytes too.
|
|
9506
|
-
|
|
9507
|
-
|
|
9604
|
+
# Each target step's prompt, as recorded: a step typed with no `from`
|
|
9605
|
+
# takes it, so its next edit versions that prompt (docs/pipeline-model.md §14).
|
|
9606
|
+
recorded = []
|
|
9607
|
+
row = QUEUE.submit(run, groups=groups, filter_sets=filter_sets or None, produced=produced,
|
|
9608
|
+
recorded=recorded)
|
|
9609
|
+
return self._json(201, {"run": row, "prompts": recorded})
|
|
9508
9610
|
|
|
9509
9611
|
@staticmethod
|
|
9510
9612
|
def _produce_endpoints(sid, entry, cfg, files):
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import{An as e,Bn as t,Cn as n,Ct as r,Dt as i,En as a,Et as o,Fn as s,Gn as c,Hn as l,In as ee,It as u,Jt as d,Kt as f,Mn as te,Nt as ne,On as p,Ot as m,Pn as re,Pt as h,Qt as ie,Sn as g,Sr as ae,Tt as oe,Vn as se,Wn as ce,Yt as le,_n as ue,_t as de,an as fe,bn as _,bt as pe,cn as v,ct as me,dn as he,gn as y,gt as ge,ht as _e,in as ve,it as ye,kn as be,kt as b,l as xe,ln as x,mn as Se,n as Ce,nn as we,pn as S,qt as C,rn as w,s as T,tn as E,un as Te,wt as Ee,xr as De,xt as D,yn as Oe,yt as O,zn as ke}from"./tokens-mCS6IZGh.js";var k=ae(),Ae=De(),A=[{id:`text`,label:`Plain text`,settings:[]},{id:`list`,label:`List`,settings:[{key:`parse`,label:`Parse as`,type:`select`,choices:[{value:`csv`,label:`CSV`},{value:`lines`,label:`One a line`},{value:`json`,label:`JSON array`}]}]}],j=[{id:`case`,label:`Case`,accepts:[`list`],options:[{key:`mode`,label:`Mode`,type:`select`,choices:[{value:`LOWER`,label:`lower`},{value:`SENTENCE`,label:`Sentence`},{value:`TITLE`,label:`Title`},{value:`UPPER`,label:`UPPER`},{value:`NONE`,label:`As replied`}]}],defaults:()=>({type:`case`,mode:`LOWER`})},{id:`join`,label:`Join`,accepts:[`list`],options:[{key:`with`,label:`Separator`,type:`text`}],defaults:()=>({type:`join`,with:`, `})}],je=[{name:`language`,type:`value`,value:`English UK`},{name:`geo-location`,type:`value`,value:`Hamilton, Waikato, New Zealand`},{name:`geo`,type:`block`,enabled:!1}],Me=[{path:`group/open`,title:`Group, open`},{path:`group/closed`,title:`Group, closed with a note`},{path:`group/no-menu`,title:`Group without actions`},{path:`group/sub`,title:`Sub-group, level 3`},{path:`group/depth`,title:`Group, three levels deep`},{path:`group/renaming`,title:`Group, renaming`},{path:`menu/disabled`,title:`Menu with a disabled item`},{path:`row/button`,title:`Row actions, one action a button`},{path:`row/menu`,title:`Row actions, two or more in the menu`},{path:`actionbar/states`,title:`Action bar, docked under a header, in its four states`},{path:`tabs/main`,title:`Tab strip, the lab's tabs`},{path:`tabs/section`,title:`Tab strip, a section strip under the lab's`},{path:`header/pipeline`,title:`Context header, a Pipeline`},{path:`header/dataset`,title:`Context header, a Dataset`},{path:`header/source`,title:`Context header, a Source`},{path:`header/switcher`,title:`Switcher, recent and more`},{path:`header/switcher-detail`,title:`Switcher, with a detail`},{path:`picker/fields`,title:`Picker, a profile and a Source`},{path:`multi/closed`,title:`Multi-select, two of three ticked`},{path:`multi/open`,title:`Multi-select, its list open`},{path:`chiplist/words`,title:`Chip-list, words with the input to add more`},{path:`chiplist/empty`,title:`Chip-list, empty with its placeholder`},{path:`workspace/menu`,title:`Workspace trigger and its three-part menu`},{path:`copymove/choose`,title:`Copy or move, a destination chosen`},{path:`copymove/collision`,title:`Copy or move, the name is already taken`},{path:`copymove/confirm`,title:`Copy or move, a Move that breaks a dependency`},{path:`copymove/confirm-pipeline`,title:`Copy or move, a pipeline Move that leaves its data behind`},{path:`share/menu`,title:`Share menu, All / some / New workspaces`},{path:`header/long`,title:`Context header, a long name`},{path:`menu/busy`,title:`Menu with a busy item`},{path:`loading/group`,title:`Loading, inside a group`},{path:`loading/error`,title:`Loading failed, with Retry`},{path:`loading/busy-button`,title:`Busy buttons`},{path:`repeater/empty`,title:`Repeater, empty`},{path:`repeater/min`,title:`Repeater at min 1`},{path:`repeater/between`,title:`Repeater, two of four`},{path:`repeater/max`,title:`Repeater at max`},{path:`repeater/locked`,title:`Repeater, a locked row`},{path:`props/controls`,title:`Property table, every control`},{path:`props/required`,title:`Property table, required only`},{path:`props/long`,title:`Property table, long values`},{path:`props/cards`,title:`Property table, a kind chosen by card`},{path:`props/widths`,title:`Property table, a width per value`},{path:`props/affix`,title:`Property table, a fixed suffix and a field's error`},{path:`props/secret`,title:`Property table, a key held and not held`},{path:`props/code`,title:`Property table, an endpoint and a payload`},{path:`table/sortable`,title:`Table, sortable headers and a row menu`},{path:`table/paged`,title:`Table, paged ten at a time`},{path:`table/select`,title:`DataTable with selection`},{path:`table/select-on`,title:`Table, two rows selected`},{path:`table/filter`,title:`Table with a filter bar`},{path:`table/filter-on`,title:`Table, filtered, with a scope`},{path:`edit/form`,title:`Edit modal, a profile`},{path:`edit/plain`,title:`Edit modal, one section and no menu`},{path:`edit/long`,title:`Edit modal, a form that scrolls`},{path:`edit/status`,title:`Edit modal, a status that is a refusal`},{path:`edit/picker`,title:`Dialog with nothing to save, a picker: Cancel`},{path:`edit/viewer`,title:`Dialog with nothing to save, a viewer: Close`},{path:`view/tokens`,title:`Token mappings`},{path:`view/output`,title:`Output with Case`},{path:`view/output-text`,title:`Output, plain text`},{path:`view/output-two`,title:`Output with two modifiers`},{path:`view/output-twice`,title:`Output with the same modifier twice`},{path:`view/output-flow`,title:`Responses with Read as`},{path:`view/field-chip`,title:`Field chips in a target's words, with a changed word`},{path:`view/field-edit`,title:`The Edited target's editable prompt, with Insert field and a highlighted diff`},{path:`view/insert-field`,title:`The Edited target's Insert field menu, open`},{path:`wizard/pill`,title:`Wizard pill, two of four steps done`},{path:`wizard/pill-open`,title:`Wizard pill, its checklist open on the current step`},{path:`switch/off`,title:`Switch, off`},{path:`switch/on`,title:`Switch, on`},{path:`switch/disabled`,title:`Switch, disabled`},{path:`badge/tones`,title:`Badge, in each tone`},{path:`button/link`,title:`Link button, in a sentence and in a table cell`},{path:`button/destructive`,title:`Destructive button, ghost and filled`},{path:`pills/one`,title:`Pills, one of a few (how a list is shown)`},{path:`pills/some`,title:`Pills, any of a few (which parts of a list show)`},{path:`radiocards/types`,title:`Radio cards, a name and what it does`},{path:`radiocards/detail`,title:`Radio cards, a control in a card`},{path:`radiocards/compact`,title:`Radio cards, compact, with pictures`},{path:`versions/restore`,title:`Restore versions, the dialog`},{path:`versions/table`,title:`Versions table, columns of its own and words to open`},{path:`table/expand`,title:`Table, a row open onto its detail`},{path:`table/pinned`,title:`Table, a pinned row drawn through the columns`},{path:`sync/bar`,title:`Sync bar, a conflict and an offline save`},{path:`why/button`,title:`Why button, disabled with a reason`}],M=ue(),N=()=>{},P=(...e)=>e.map(e=>({label:e,icon:e===`Remove`?y.remove:e===`Clone`?y.clone:y.rename,onSelect:N,destructive:e===`Remove`}));function F({start:e,min:t,max:n,locked:r}){let[i,a]=(0,k.useState)(e);return(0,M.jsx)(pe,{noun:`scenario`,items:i,...t===void 0?{}:{min:t},...n===void 0?{}:{max:n},...r?{locked:r}:{},onAdd:()=>a([...i,`Target ${String.fromCharCode(65+i.length)}`]),onRemove:e=>a(i.filter((t,n)=>n!==e)),onClone:e=>a([...i.slice(0,e+1),`${i[e]} copy`,...i.slice(e+1)]),onRename:N,empty:`No targets yet.`,renderItem:(e,t,n)=>(0,M.jsx)(x,{id:`scenario-${t}`,title:e,level:3,actions:n,children:(0,M.jsx)(`p`,{className:`note`,children:`A connection, a profile and a prompt for each job.`})},`${e}-${t}`)})}function Ne(){let[e,t]=(0,k.useState)(je),n=(n,r)=>t(e.map(e=>e.name===n?{...e,...r}:e));return(0,M.jsx)(xe,{mappings:e,onValue:(e,t)=>n(e,{value:t}),onEnabled:(e,t)=>n(e,{enabled:t}),onEdit:N,onRemove:n=>t(e.filter(e=>e.name!==n)),onAdd:()=>t([...e,{name:`token${e.length+1}`,type:`value`,value:``}])})}function I({start:e,readAs:t}){let[n,r]=(0,k.useState)(e),[i,a]=(0,k.useState)(t);return(0,M.jsx)(ye,{id:`output`,out:n,readAs:i,outputKinds:A,modifiers:j,onFormat:e=>r({kind:e,modifiers:n.modifiers.filter(t=>j.find(e=>e.id===t.type)?.accepts.includes(e))}),onReadAs:a,onModifier:(e,t)=>r({...n,modifiers:n.modifiers.map((n,r)=>r===e?t:n)}),onAddModifier:e=>r({...n,modifiers:[...n.modifiers,e]}),onRemoveModifier:e=>r({...n,modifiers:n.modifiers.filter((t,n)=>n!==e)})})}function Pe(){let[e,t]=(0,k.useState)(`Job 1`),[n,r]=(0,k.useState)(!0);return(0,M.jsx)(x,{id:`renaming`,title:e,actions:[{label:`Rename…`,icon:y.rename,onSelect:()=>r(!0)}],...n?{rename:{value:e,onCommit:n=>{t(n||e),r(!1)},onCancel:()=>r(!1)}}:{},children:(0,M.jsx)(`p`,{className:`note`,children:`Enter or leaving keeps the name; Escape cancels.`})})}function Fe(){let[e,t]=(0,k.useState)(`system`);return(0,M.jsx)(`div`,{className:`gallery-row`,style:{justifyContent:`flex-end`},children:(0,M.jsx)(o,{current:{id:`w1`,slug:`work`,name:`Work`},workspaces:[{id:`w1`,slug:`work`,name:`Work`},{id:`w2`,slug:`side-project`,name:`Side project`},{id:`w3`,slug:`client-demos`,name:`Client demos`}],onSwitch:N,onNew:N,onManage:N,theme:e,onTheme:t})})}var Ie=[{id:`cur`,slug:`work`,name:`Work`,archived:!1,isDefault:!0,lastUsed:`2026-10-08T09:30:00Z`,createdAt:null,pipelines:4,runs:18},{id:`side`,slug:`side-project`,name:`Side project`,archived:!1,isDefault:!1,lastUsed:`2026-10-07T09:30:00Z`,createdAt:null,pipelines:2,runs:6},{id:`demos`,slug:`client-demos`,name:`Client demos`,archived:!1,isDefault:!1,lastUsed:`2026-10-06T09:30:00Z`,createdAt:null,pipelines:1,runs:0}],Le={id:`cur`,slug:`work`,name:`Work`},Re={undo:null,offer:N,undoNow:N,dismiss:N},ze=e=>({copyMovePreflight:async()=>({nameTaken:e,suggestedName:`Daily regressions (copy)`}),copyAsset:async()=>({id:`copy`}),moveAsset:async()=>({id:`same`}),forWorkspace:()=>({})});function L({nameTaken:e=!1,confirm:t=!1,subject:n,dependents:r=[]}){return(0,M.jsx)(_e,{api:ze(e),subject:n??{kind:`filter-set`,id:`f1`,name:`Daily regressions`},workspaces:Ie,current:Le,dependents:r,undo:Re,onClose:N,defaultDest:`side`,...t?{defaultConfirm:!0}:{}})}function Be(){let e=[{id:`w1`,name:`Work`},{id:`w2`,name:`Side project`},{id:`w3`,name:`Client demos`}];return(0,M.jsx)(`div`,{style:{display:`grid`,gap:`var(--s3)`,maxWidth:`20rem`},children:[{label:`All workspaces`,shares:void 0},{label:`Some workspaces`,shares:[`w2`]},{label:`New workspaces`,shares:[r]},{label:`No workspaces`,shares:[Ee]}].map(t=>(0,M.jsx)(oe,{label:t.label,workspaces:e,shares:t.shares,onChange:N},t.label))})}function R({sections:e,menu:t,status:n,statusBad:r,outcome:i}){return(0,M.jsx)(f,{title:`Lab Ollama`,...n?{status:n}:{},...r?{statusBad:!0}:{},...t?{menu:t}:{},sections:e,actions:[{label:`Test connection`,icon:be,onSelect:N,outcome:i?{label:i,onOpen:N}:void 0}],onClose:N})}var z=()=>[{key:`name`,label:`Name`,width:`full`,required:!0,control:{type:`text`,value:`Lab Ollama`,onChange:N}},{key:`slug`,label:`Slug`,width:`full`,required:!0,control:{type:`text`,value:`lab-ollama`,onChange:N}},{key:`type`,label:`Type`,required:!0,control:{type:`select`,value:`ollama`,onChange:N,options:[{value:`ollama`,label:`Ollama (Local)`},{value:`anthropic`,label:`Anthropic`}]}},{key:`url`,label:`Address`,width:`full`,control:{type:`text`,value:``,placeholder:`http://127.0.0.1:11434`,onChange:N}},{key:`key`,label:`Key`,control:{type:`secret`,value:``,onChange:N}},{key:`model`,label:`Model`,width:`full`,control:{type:`text`,value:`minicpm-v4.6:latest`,onChange:N}}],B=()=>[{key:`seed`,label:`Seed`,control:{type:`text`,value:``,placeholder:`1234`,onChange:N}},{key:`nPredict`,label:`Reply tokens`,width:`quarter`,control:{type:`text`,value:``,onChange:N}},{key:`temperature`,label:`Temperature`,control:{type:`text`,value:`0.3`,onChange:N}},{key:`repeatPenalty`,label:`Repeat penalty`,width:`quarter`,control:{type:`text`,value:``,onChange:N}}],V=()=>[{key:`endpoint`,label:`Endpoint`,required:!0,control:{type:`code`,text:`http://127.0.0.1:11434/api/chat`}},{key:`prompt`,label:`Prompt`,required:!0,control:{type:`static`,text:`(prompt)`}},{key:`model`,label:`model`,control:{type:`code`,text:`minicpm-v4.6:latest`}},{key:`options`,label:`options`,control:{type:`code`,text:`{"seed":1234,"temperature":0.3}`}}],H={key:`kind`,label:`Response Format`,required:!0,control:{type:`select`,value:`list`,onChange:N,options:A.map(e=>({value:e.id,label:e.label}))}};function U({actions:e}){return(0,M.jsx)(x,{id:`g`,title:`Actions`,children:(0,M.jsx)(u,{label:`Actions`,rows:[{name:`Ask_Claude`}],rowKey:e=>e.name,columns:[{key:`name`,header:`Name`,role:`title`,cell:e=>e.name},{key:`menu`,header:``,role:`menu`,sort:null,cell:()=>(0,M.jsx)(Te,{label:`Ask_Claude actions`,actions:e})}]})})}var Ve=[[`home`,`Home`,s],[`runs`,`Runs`,se],[`history`,`History`,ee],[`library`,`Library`,re],[`setup`,`Setup`,a]],He=[[`datasets`,`Datasets`,c],[`prompts`,`Prompts`,te],[`sources`,`Sources`,t]],W=e=>(0,M.jsx)(w,{label:`Lab`,current:e,items:Ve.map(([e,t,n])=>({key:e,label:t,icon:n,href:`#/${e}`}))}),G=e=>(0,M.jsx)(w,{label:`Library`,level:`section`,current:e,items:He.map(([e,t,n])=>({key:e,label:t,icon:n,href:`#/library/${e}`}))}),K=({section:e,children:t})=>(0,M.jsxs)(`div`,{children:[W(e?`library`:`runs`),e&&G(e),t]}),q=(...e)=>e.map(e=>({label:e,icon:e===`Delete`?y.remove:e===`Clone`?y.clone:y.rename,onSelect:N,destructive:e===`Delete`})),Ue={"header/pipeline":()=>(0,M.jsx)(K,{children:(0,M.jsx)(E,{kind:`Pipeline`,name:`Pipeline 1`,onPick:N,meta:`2 jobs, 3 targets`,primary:{label:`New pipeline`,icon:p,onSelect:N},actions:q(`Rename…`,`Clone`,`Export YAML`,`Import YAML…`,`Restore…`,`Delete`)})}),"header/dataset":()=>(0,M.jsx)(K,{section:`datasets`,children:(0,M.jsx)(E,{kind:`Dataset`,name:`Demo 1`,onPick:N,meta:`62 cases, 19 graded`,primary:{label:`New dataset`,icon:p,onSelect:N},actions:q(`Rename…`,`Clone`,`Import JSON…`,`Export JSON`,`Restore…`,`Delete`)})}),"header/switcher":()=>(0,M.jsx)(b,{kind:`Pipeline`,value:`p5`,onPick:N,onClose:N,recent:[`p7`,`p6`,`p5`,`p4`,`p3`],options:Array.from({length:13},(e,t)=>({id:`p${t}`,label:[`Demo 1`,`Demo 2`,`Receipts`,`Menus`,`Street signs`,`Labels`,`Plates`,`Posters`,`Packaging`,`Whiteboards`,`Book spines`,`Shop fronts`,`Timetables`][t],used:t<8?{at:`2026-10-0${t+1}T09:30:00Z`,label:O(`2026-10-0${t+1}T09:30:00Z`)}:null}))}),"header/switcher-detail":()=>(0,M.jsx)(b,{kind:`Connection`,value:`c1`,onPick:N,onClose:N,detailLabel:`Model`,recent:[`c3`,`c1`],options:[[`Lab Ollama gemma3 4b`,`gemma3:4b`],[`Lab Ollama minicpm`,`minicpm-v`],[`Anthropic`,`claude-sonnet-4-5`],[`Dell llama`,`qwen2.5vl:7b`],[`OpenAI`,`gpt-5`],[`Docker llama`,`qwen2.5vl:7b`]].map(([e,t],n)=>({id:`c${n}`,label:e,detail:t,used:n<4?{at:`2026-10-1${n}T09:30:00Z`,label:O(`2026-10-1${n}T09:30:00Z`)}:null}))}),"picker/fields":()=>(0,M.jsx)(x,{id:`g`,title:`Target A`,children:(0,M.jsx)(C,{label:`Target A setup`,rows:[{key:`profile`,label:`Profile`,control:{type:`picker`,kind:`Profile`,value:`p2`,usedLabel:`Last changed`,onChange:N,recent:[`p5`,`p4`,`p3`,`p2`,`p1`],options:[{id:`#echo`,label:`Echo`,fixed:!0},...[`Lab Ollama`,`Anthropic`,`Cloud vision`,`Local llama`,`OpenRouter`,`Bench`,`Vision`].map((e,t)=>({id:`p${t}`,label:e,used:t<6?{at:`2026-10-0${t+1}T09:30:00Z`,label:O(`2026-10-0${t+1}T09:30:00Z`)}:null}))]}},{key:`source`,label:`Source`,control:{type:`picker`,kind:`Source`,value:`gone`,usedLabel:`Last changed`,onChange:N,options:[{id:``,label:`Any`,fixed:!0},{id:`gone`,label:`Shoot 3 (missing)`,missing:!0},{id:`s1`,label:`Receipts`}]}}]})}),"header/source":()=>(0,M.jsx)(K,{section:`sources`,children:(0,M.jsx)(E,{kind:`Source`,name:`Demo 1 images`,onPick:N,meta:`File Library. 63 files, 48 MB`,primary:{label:`Upload…`,icon:_,onSelect:N},actions:q(`Rename…`,`Delete`)})}),"workspace/menu":()=>(0,M.jsx)(Fe,{}),"copymove/choose":()=>(0,M.jsx)(L,{}),"copymove/collision":()=>(0,M.jsx)(L,{nameTaken:!0}),"copymove/confirm":()=>(0,M.jsx)(L,{confirm:!0,dependents:[{kind:`pipeline`,id:`w1`,name:`Nightly regression`,href:`#/runs`}]}),"copymove/confirm-pipeline":()=>(0,M.jsx)(L,{confirm:!0,subject:{kind:`pipeline`,id:`w1`,name:`Nightly regression`},dependents:[{kind:`eval-group`,id:`g1`,name:`Receipts, 62 cases`,href:`#/library/datasets/g1`},{kind:`source`,id:`s1`,name:`Receipt images`,href:`#/library/sources`}]}),"share/menu":()=>(0,M.jsx)(Be,{}),"header/long":()=>(0,M.jsx)(K,{children:(0,M.jsx)(E,{kind:`Pipeline`,name:`Receipts and handwritten menus, second pass with the tighter prompt and a Contains metric`,onPick:N,meta:`12 jobs, 8 targets`,primary:{label:`New pipeline`,icon:p,onSelect:N},actions:q(`Rename…`,`Clone`,`Delete`)})}),"actionbar/states":()=>(0,M.jsxs)(`div`,{children:[W(`runs`),(0,M.jsx)(E,{kind:`Pipeline`,name:`Demo 1`,onPick:N,meta:`1 job, 2 targets`,docked:!0,primary:{label:`New pipeline`,icon:p,onSelect:N},actions:q(`Rename…`,`Delete`)}),(0,M.jsx)(D,{primary:{label:`Run`,icon:e,onSelect:N},status:(0,M.jsx)(`b`,{children:`Ready to run`})}),(0,M.jsxs)(`div`,{style:{display:`grid`,gap:`var(--s4)`,marginTop:`var(--s5)`},children:[(0,M.jsx)(D,{primary:{label:`Run`,icon:e,onSelect:N,disabled:!0},status:(0,M.jsxs)(M.Fragment,{children:[`Connection "Vision" not found. `,(0,M.jsxs)(`a`,{href:`#/setup`,style:{whiteSpace:`nowrap`},children:[`Open`,`\xA0`,`Setup`]})]})}),(0,M.jsx)(D,{primary:{label:`Run`,icon:e,onSelect:N,disabled:!0},status:(0,M.jsxs)(M.Fragment,{children:[(0,M.jsx)(`b`,{children:`Running`}),` 12 of 42`]}),secondary:{label:`Stop`,icon:n,onSelect:N},progress:28,progressLabel:`Run progress`}),(0,M.jsx)(D,{primary:{label:`Run`,icon:e,onSelect:N},status:(0,M.jsxs)(M.Fragment,{children:[(0,M.jsx)(`b`,{children:`Done`}),` 42 in 2m`]})})]})]}),"tabs/main":()=>W(`runs`),"tabs/section":()=>(0,M.jsxs)(`div`,{children:[W(`library`),G(`datasets`)]}),"group/open":()=>(0,M.jsx)(x,{id:`g`,title:`Evals`,actions:P(`Change…`,`Remove`),children:(0,M.jsx)(`p`,{className:`note`,children:`The graded set.`})}),"group/closed":()=>(0,M.jsx)(x,{id:`g`,title:`Content`,open:!1,note:`Sample library, 63 files`,actions:P(`Change…`,`Remove`)}),"group/no-menu":()=>(0,M.jsx)(x,{id:`g`,title:`Mapping`,children:(0,M.jsx)(`p`,{className:`note`,children:`Nothing to do to it.`})}),"group/sub":()=>(0,M.jsx)(x,{id:`g`,title:`Job 1`,actions:P(`Rename…`,`Remove`),children:(0,M.jsx)(x,{id:`g-sub`,title:`Scenarios`,level:3,actions:P(`Clear`),children:(0,M.jsx)(`p`,{className:`note`,children:`Inside a pane.`})})}),"group/depth":()=>(0,M.jsxs)(x,{id:`g`,title:`Job 1`,actions:P(`Rename…`,`Remove`),children:[(0,M.jsxs)(x,{id:`g-scenarios`,title:`Scenarios`,level:3,children:[(0,M.jsx)(x,{id:`g-plain`,title:`Plain`,level:3,actions:P(`Rename…`,`Remove`),children:(0,M.jsx)(`p`,{className:`note`,children:`A pane, a section of it, and a thing with a name inside that section.`})}),(0,M.jsx)(x,{id:`g-strict`,title:`Strict`,level:3,actions:P(`Rename…`,`Remove`)})]}),(0,M.jsx)(x,{id:`g-output`,title:`Output`,level:3,children:(0,M.jsx)(`p`,{className:`note`,children:`The next section of the same pane.`})})]}),"group/renaming":()=>(0,M.jsx)(Pe,{}),"menu/disabled":()=>(0,M.jsx)(x,{id:`g`,title:`Target D`,actions:[{label:`Rename…`,icon:y.rename,onSelect:N},{label:`Clone`,icon:y.clone,onSelect:N,disabled:!0},{label:`Remove`,icon:y.remove,onSelect:N,destructive:!0}]}),"row/button":()=>(0,M.jsx)(U,{actions:[{label:`New pipeline`,icon:e,onSelect:N}]}),"row/menu":()=>(0,M.jsx)(U,{actions:[{label:`View…`,icon:l,onSelect:N},{label:`Download`,icon:ce,onSelect:N},{label:`Remove`,icon:g,onSelect:N,destructive:!0}]}),"menu/busy":()=>(0,M.jsx)(x,{id:`g`,title:`History`,actions:[{label:`Export JSON`,icon:y.export,onSelect:N,busy:!0},{label:`Clear`,icon:y.clear,onSelect:N,destructive:!0}]}),"loading/group":()=>(0,M.jsx)(x,{id:`g`,title:`History`,actions:P(`Rename…`),children:(0,M.jsx)(S,{label:`Runs`,delay:0})}),"loading/error":()=>(0,M.jsx)(x,{id:`g`,title:`History`,children:(0,M.jsx)(S,{label:`Runs`,error:`Runs not loaded: server unreachable.`,onRetry:N})}),"loading/busy-button":()=>(0,M.jsx)(x,{id:`g`,title:`Run`,children:(0,M.jsxs)(`div`,{className:`gallery-row`,children:[(0,M.jsxs)(`button`,{type:`button`,className:`run`,disabled:!0,"aria-busy":!0,children:[(0,M.jsx)(Se,{size:16}),`Run`]}),(0,M.jsxs)(`button`,{type:`button`,className:`ghost`,disabled:!0,"aria-busy":!0,children:[(0,M.jsx)(Se,{}),`Older`]})]})}),"repeater/empty":()=>(0,M.jsx)(F,{start:[]}),"repeater/min":()=>(0,M.jsx)(F,{start:[`Target A`],min:1}),"repeater/between":()=>(0,M.jsx)(F,{start:[`Target A`,`Target B`],min:1,max:4}),"repeater/max":()=>(0,M.jsx)(F,{start:[`Target A`,`Target B`,`Target C`,`Target D`],min:1,max:4}),"repeater/locked":()=>(0,M.jsx)(F,{start:[`Reply`,`Target A`],locked:(e,t)=>t===0}),"props/controls":()=>(0,M.jsx)(C,{label:`Controls`,onRename:N,onRemove:N,onAdd:N,addLabel:`Add row`,rows:[H,{key:`language`,label:`{language}`,code:!0,control:{type:`text`,value:`English UK`,onChange:N}},{key:`geo`,label:`{geo}…{/geo}`,code:!0,control:{type:`static`,text:`Block`},enabled:{checked:!0,onChange:N}},{key:`image`,label:`Image`,control:{type:`checkbox`,checked:!0,label:`Send`,onChange:N}}]}),"props/required":()=>(0,M.jsx)(C,{label:`Output`,onRemove:N,rows:[H]}),"props/long":()=>(0,M.jsx)(C,{label:`Long`,onRemove:N,rows:[{key:`geo-location`,label:`{geo-location}`,code:!0,control:{type:`text`,value:`Hamilton, Waikato, New Zealand, Southern Hemisphere, Earth`,onChange:N}},{key:`averylongtokennamethatdoesnotbreak`,label:`{averylongtokennamethatdoesnotbreak}`,code:!0,control:{type:`text`,value:``,onChange:N}}]}),"props/cards":()=>(0,M.jsx)(tt,{}),"props/widths":()=>(0,M.jsx)(C,{label:`Widths`,rows:[{key:`type`,label:`Type`,required:!0,control:{type:`select`,value:`ollama`,onChange:N,options:[{value:`ollama`,label:`Ollama (Local)`},{value:`anthropic`,label:`Anthropic`}]}},{key:`url`,label:`Address`,width:`full`,control:{type:`text`,value:``,placeholder:`http://127.0.0.1:11434`,onChange:N}},{key:`model`,label:`Model`,width:`full`,control:{type:`text`,value:`minicpm-v4.6:latest`,onChange:N}},{key:`seed`,label:`Seed`,control:{type:`text`,value:``,placeholder:`1234`,onChange:N}},{key:`nPredict`,label:`Reply tokens`,width:`quarter`,control:{type:`text`,value:``,onChange:N}},{key:`temperature`,label:`Temperature`,control:{type:`text`,value:`0.2`,onChange:N}},{key:`grammar`,label:`Grammar`,control:{type:`textarea`,value:`root ::= item (", " item)*
|
|
2
|
+
item ::= [a-z ]+`,onChange:N}}]}),"props/affix":()=>(0,M.jsx)(C,{label:`Call`,rows:[{key:`name`,label:`Name`,control:{type:`text`,value:`open-meteo-forecast`,suffix:`.txt`,onChange:N}},{key:`taken`,label:`Name`,error:`open-meteo-forecast-storm.txt is taken.`,control:{type:`text`,value:`open-meteo-forecast-storm`,suffix:`.txt`,onChange:N}},{key:`status`,label:`Status`,width:`quarter`,control:{type:`text`,value:`200`,numeric:!0,onChange:N}},{key:`body`,label:`Body`,control:{type:`textarea`,mono:!0,value:`{
|
|
3
|
+
"category": "utilities"
|
|
4
|
+
}`,onChange:N}}]}),"props/secret":()=>(0,M.jsx)(C,{label:`Keys`,rows:[{key:`held`,label:`Key`,control:{type:`secret`,value:`sk-not-a-real-key-0000`,onChange:N}},{key:`empty`,label:`Key`,control:{type:`secret`,value:``,onChange:N}},{key:`server`,label:`Key`,control:{type:`secret`,value:``,held:!0,onChange:N}}]}),"props/code":()=>(0,M.jsx)(C,{label:`Debug`,rows:[{key:`endpoint`,label:`Endpoint`,required:!0,control:{type:`code`,text:`https://api.anthropic.com/v1/messages`}},{key:`prompt`,label:`Prompt`,required:!0,control:{type:`static`,text:`(prompt)`}},{key:`model`,label:`model`,control:{type:`code`,text:`claude-sonnet-4-5-20250929`}},{key:`options`,label:`options`,control:{type:`code`,text:`{"seed":1234,"temperature":0}`}},{key:`stream`,label:`stream`,control:{type:`code`,text:`false`}}]}),"table/sortable":()=>(0,M.jsx)($,{count:4}),"table/paged":()=>(0,M.jsx)($,{count:35,pageSize:10}),"table/select":()=>(0,M.jsx)($,{count:5,picked:[]}),"table/select-on":()=>(0,M.jsx)($,{count:5,picked:[1,3]}),"table/filter":()=>(0,M.jsx)(et,{}),"table/filter-on":()=>(0,M.jsx)(et,{search:`IMG_40`,size:`large`}),"edit/form":()=>(0,M.jsx)(R,{outcome:`Connected`,menu:[{label:`Restore…`,icon:y.restore,onSelect:N},{label:`Apply preset: repeat 1.3`,icon:y.preset,onSelect:N}],sections:[{key:`identity`,rows:z()},{key:`settings`,title:`Settings`,rows:B()},{key:`debug`,title:`Debug`,rows:V(),folded:!0}]}),"edit/plain":()=>(0,M.jsx)(f,{title:`A mapping`,sections:[{key:`one`,rows:[H,{key:`with`,label:`Separator`,control:{type:`text`,value:`, `,onChange:N}}]}],onClose:N}),"edit/long":()=>(0,M.jsx)(R,{menu:[{label:`Restore…`,icon:y.restore,onSelect:N,disabled:!0}],sections:[{key:`identity`,rows:z()},{key:`settings`,title:`Settings`,rows:[...B(),{key:`grammar`,label:`Grammar`,control:{type:`textarea`,value:`root ::= item (", " item)*
|
|
5
|
+
item ::= [a-z ]+`,onChange:N}},{key:`imagePosition`,label:`Image position`,control:{type:`select`,value:`after`,onChange:N,options:[{value:`before`,label:`before the prompt`},{value:`after`,label:`after the prompt`}]}},{key:`cachePrompt`,label:`Cache prompt`,control:{type:`select`,value:`off`,onChange:N,options:[{value:`on`,label:`on`},{value:`off`,label:`off`}]}}]},{key:`debug`,title:`Debug`,rows:V(),folded:!0}]}),"edit/status":()=>(0,M.jsx)(R,{status:`the relay could not reach http://127.0.0.1:11434`,statusBad:!0,sections:[{key:`identity`,rows:z()}]}),"edit/picker":()=>(0,M.jsx)(ie,{title:`Link eval group`,onClose:N,dismiss:`Cancel`,children:(0,M.jsx)(`div`,{className:`edit-choices`,children:[`Captions`,`Sentiment`,`Weather alerts`].map(e=>(0,M.jsx)(`button`,{type:`button`,className:`ghost`,children:e},e))})}),"edit/viewer":()=>(0,M.jsx)(f,{title:`Test connection`,sections:[{key:`result`,rows:[{key:`time`,label:`Time`,control:{type:`static`,text:`412 ms`}},{key:`result`,label:`Result`,control:{type:`static`,text:`Reached Ollama. 2 models: gemma3:4b, minicpm-v.`}}]}],onClose:N}),"view/tokens":()=>(0,M.jsx)(x,{id:`g`,title:`Token mappings`,level:3,children:(0,M.jsx)(Ne,{})}),"view/output":()=>(0,M.jsx)(I,{start:{kind:`list`,parse:`csv`,modifiers:[{type:`case`,mode:`LOWER`}]}}),"view/output-text":()=>(0,M.jsx)(I,{start:{kind:`text`,modifiers:[]}}),"view/output-two":()=>(0,M.jsx)(I,{start:{kind:`list`,parse:`csv`,modifiers:[{type:`case`,mode:`TITLE`},{type:`join`,with:` | `}]}}),"view/output-twice":()=>(0,M.jsx)(I,{start:{kind:`list`,parse:`csv`,modifiers:[{type:`case`,mode:`TITLE`},{type:`case`,mode:`LOWER`}]}}),"view/output-flow":()=>(0,M.jsx)(I,{start:{kind:`text`,modifiers:[]},readAs:`@body('Ask')?['content']?[0]?['text']`}),"view/field-chip":()=>(0,M.jsx)(x,{id:`g`,title:`Edited`,level:3,children:(0,M.jsxs)(`div`,{className:`prompt`,children:[(0,M.jsx)(`span`,{className:`prop-name`,children:`Prompt`}),(0,M.jsx)(T,{words:`Summarise @{triggerBody()?['text']} in two short sentences for @{variables('Audience')}.`,was:`Summarise @{triggerBody()?['text']} in one sentence for @{variables('Audience')}.`})]})}),"view/field-edit":()=>(0,M.jsx)(Xe,{}),"view/insert-field":()=>(0,M.jsx)(x,{id:`g`,title:`Edited`,level:3,children:(0,M.jsxs)(`div`,{className:`prompt`,children:[(0,M.jsxs)(`div`,{className:`pe-head`,children:[(0,M.jsx)(`span`,{className:`prop-name`,children:`Prompt`}),(0,M.jsx)(fe,{fields:Ye,onInsert:N,label:`Edited`,defaultOpen:!0})]}),(0,M.jsx)(`textarea`,{"aria-label":`Edited, prompt`,rows:4,defaultValue:X}),(0,M.jsx)(T,{className:`pe-words`,words:X,was:Je,showExprs:!1})]})}),"multi/closed":()=>(0,M.jsx)(Z,{}),"multi/open":()=>(0,M.jsx)(Z,{open:!0}),"chiplist/words":()=>(0,M.jsx)(Ze,{start:[`clearly`,`obviously`,`as an AI`]}),"chiplist/empty":()=>(0,M.jsx)(Ze,{start:[]}),"wizard/pill":()=>(0,M.jsx)(Qe,{}),"wizard/pill-open":()=>(0,M.jsx)(Qe,{open:!0}),"switch/off":()=>(0,M.jsx)(qe,{}),"switch/on":()=>(0,M.jsx)(qe,{start:!0}),"switch/disabled":()=>(0,M.jsx)(d,{checked:!0,disabled:!0,label:`Fetch now`,onChange:N}),"badge/tones":()=>(0,M.jsxs)(`div`,{className:`gallery-row`,children:[(0,M.jsx)(v,{children:`Latest`}),(0,M.jsx)(v,{tone:`amber`,children:`Default`}),(0,M.jsx)(v,{tone:`sage`,children:`Done`}),(0,M.jsx)(v,{tone:`rust`,children:`Failed`})]}),"button/link":()=>(0,M.jsxs)(x,{id:`g`,title:`Evals`,children:[(0,M.jsxs)(`p`,{className:`note`,children:[`Graded by `,(0,M.jsx)(`button`,{type:`button`,className:`link-btn`,onClick:N,children:`Reference`}),`.`]}),(0,M.jsx)(u,{label:`Eval groups`,rows:[{id:`reference`,name:`Reference`},{id:`tone`,name:`Tone of voice`}],rowKey:e=>e.id,columns:[{key:`name`,header:`Name`,role:`title`,sort:e=>e.name,cell:e=>(0,M.jsx)(`button`,{type:`button`,className:`link-btn`,onClick:N,children:e.name})}]})]}),"button/destructive":()=>(0,M.jsxs)(`div`,{className:`gallery-row`,children:[(0,M.jsxs)(`button`,{type:`button`,className:`ghost destructive`,onClick:N,children:[(0,M.jsx)(g,{size:14,"aria-hidden":`true`}),` Remove`]}),(0,M.jsxs)(`button`,{type:`button`,className:`destructive`,onClick:N,children:[(0,M.jsx)(g,{size:14,"aria-hidden":`true`}),` Delete`]}),(0,M.jsx)(`button`,{type:`button`,className:`destructive`,disabled:!0,onClick:N,children:`Delete`})]}),"pills/one":()=>(0,M.jsx)(J,{}),"pills/some":()=>(0,M.jsx)(J,{some:!0}),"radiocards/types":()=>(0,M.jsx)(Y,{}),"radiocards/detail":()=>(0,M.jsx)(Y,{detail:!0}),"radiocards/compact":()=>(0,M.jsx)(Y,{compact:!0}),"versions/restore":()=>(0,M.jsx)(ge,{noun:`pipeline`,versions:We,at:e=>e.at,reason:e=>e.reason,onRestore:N,onClose:N}),"versions/table":()=>(0,M.jsx)(x,{id:`versions`,title:`Versions`,children:(0,M.jsx)(de,{label:`Versions`,versions:Ge,at:e=>e.at,atLabel:`Made`,rowKey:e=>String(e.version),columns:[{key:`version`,header:`Version`,role:`title`,cell:e=>`v${e.version}${e.version===3?` (newest)`:``}`}],current:e=>e.version===3,onRestore:N,expand:{label:(e,t)=>t?`Hide words`:`Show words`,detail:e=>(0,M.jsx)(`p`,{className:`note`,children:e.text})}})}),"table/expand":()=>(0,M.jsx)(Ke,{}),"table/pinned":()=>(0,M.jsx)(x,{id:`profiles`,title:`Connection Profiles`,children:(0,M.jsx)(u,{label:`Profiles`,cards:!0,rows:Q(3),rowKey:e=>e.name,pinnedRow:{name:`(Default)`,kb:0},select:{noun:`profile`},columns:[{key:`name`,header:`Profile`,role:`title`,cell:e=>e.name===`(Default)`?(0,M.jsx)(`span`,{className:`note`,children:e.name}):e.name},{key:`size`,header:`Size`,className:`num`,sort:e=>e.kb,cell:e=>e.kb?`${e.kb} KB`:`(Any)`}]})}),"sync/bar":()=>(0,M.jsx)(me,{lines:[{key:`c`,alert:!0,text:`Data conflict: Reference.`,actions:[{label:`Keep this tab's data`,onSelect:N},{label:`Lose this tab's changes`,onSelect:N}]},{key:`o`,text:`Receipts not saved: the server could not be reached.`,actions:[{label:`Retry`,onSelect:N}]}]}),"why/button":()=>(0,M.jsxs)(`div`,{className:`sacts`,children:[(0,M.jsx)(`button`,{type:`button`,className:`ghost`,children:`Cancel`}),(0,M.jsx)(we,{why:`Needs a prompt`,disabled:!0,onClick:N,children:`Create`})]})},We=[{at:`2026-10-13T14:47:00Z`,reason:`run`},{at:`2026-10-13T11:02:00Z`,reason:`idle`},{at:`2026-10-12T09:30:00Z`,reason:`restore`}],Ge=[{version:3,at:`2026-10-13T14:47:00Z`,text:`List what you see, one item a line.`},{version:2,at:`2026-10-12T11:02:00Z`,text:`List what you see.`},{version:1,at:`2026-10-10T09:30:00Z`,text:`Describe it.`}];function J({some:e}){let[t,n]=(0,k.useState)(`thumbs`),[r,i]=(0,k.useState)(new Set([`todo`,`missing`]));return e?(0,M.jsx)(h,{label:`Show`,on:r,onToggle:e=>i(t=>{let n=new Set(t);return n.delete(e)||n.add(e),n}),options:[{value:`graded`,label:`Graded 12`},{value:`todo`,label:`To do 3`},{value:`missing`,label:`Missing 1`}]}):(0,M.jsx)(h,{label:`View`,value:t,onChange:n,options:[{value:`thumbs`,label:`Thumbnails`},{value:`list`,label:`List`}]})}function Y({detail:e,compact:t}){let[n,r]=(0,k.useState)(t?`b.jpg`:e?`new`:`drop`),[i,a]=(0,k.useState)(``);return t?(0,M.jsx)(m,{label:`3 items without a case`,legend:!0,compact:!0,value:n,onChange:r,options:[`a.jpg`,`b.jpg`,`notes.txt`].map(e=>({value:e,label:e,lead:(0,M.jsx)(`span`,{style:{width:56,height:42,flex:`none`,borderRadius:4,background:`var(--surface2)`,border:`1px solid var(--line)`},"aria-hidden":`true`})}))}):e?(0,M.jsx)(m,{label:`Filter set`,value:n,onChange:r,options:[{value:`new`,label:`New filter set`,children:(0,M.jsx)(`input`,{type:`text`,"aria-label":`Name`,placeholder:`Name`,value:i,onChange:e=>a(e.target.value)})},{value:`existing`,label:`Existing filter set`,about:`Joins the end of its filters.`}]}):(0,M.jsx)(m,{label:`Post-format`,legend:!0,value:n,onChange:r,options:[{value:`drop`,label:`Drop items`,about:`Each item of a list reply, dropped when it matches.`},{value:`keep`,label:`Keep first`,about:`Keep the first N items.`},{value:`reject`,label:`Reject reply`,about:`The whole answer, refused when it matches.`}]})}function Ke(){let[e,t]=(0,k.useState)(()=>new Set([Q(4)[0].name]));return(0,M.jsx)(x,{id:`runs`,title:`Runs`,children:(0,M.jsx)(u,{label:`Runs`,cards:!0,rows:Q(4),rowKey:e=>e.name,defaultSort:null,expand:{label:(e,t)=>`${t?`Hide`:`Show`} ${e.name}`,can:(e,t)=>t!==2,open:e,onChange:t,detail:e=>(0,M.jsxs)(`p`,{className:`note`,children:[e.name,` sent 2 requests, `,e.kb,` KB back.`]})},columns:[{key:`name`,header:`Name`,role:`title`,cell:e=>e.name},{key:`size`,header:`Size`,className:`num`,sort:e=>e.kb,cell:e=>`${e.kb} KB`}]})})}function qe({start:e}){let[t,n]=(0,k.useState)(!!e);return(0,M.jsx)(d,{checked:t,onChange:n,label:`Fetch now`})}var Je=`Tell me about this location in 1 sentence: @{variables('LocationVar')}`,X=`Tell me about this location in 2 sentences, for someone visiting for the first time: @{variables('LocationVar')}`,Ye=[{name:`LocationVar`,expr:`@{variables('LocationVar')}`},{name:`text`,expr:`@{triggerBody()?['text']}`}];function Xe(){let[e,t]=(0,k.useState)(X);return(0,M.jsx)(x,{id:`g`,title:`Edited`,level:3,children:(0,M.jsx)(Ce,{label:`Edited`,asks:[{key:`connection`,label:`Connection`,control:{type:`static`,text:`Anthropic Direct`}}],prompt:e,onPrompt:t,rows:[{key:`model`,label:`Model`,control:{type:`static`,text:`claude-haiku-4-5`}}],request:[{key:`request`,label:`Request`,control:{type:`code`,text:`POST /v1/messages`}},{key:`body`,label:`Body`,control:{type:`code`,text:JSON.stringify({model:`claude-haiku-4-5`,max_tokens:1024,messages:[{role:`user`,content:e}]},null,2)}}],requestId:`story-edited-request`,words:{text:e,was:Je},fields:Ye})})}function Z({open:e=!1}){let[t,n]=(0,k.useState)([`better`,`same`]),r=[{value:`better`,label:`Better`},{value:`same`,label:`Same`},{value:`worse`,label:`Worse`}];return e?(0,M.jsx)(`div`,{style:{minHeight:180},children:(0,M.jsx)(le,{value:t,options:r,onChange:n,defaultOpen:!0})}):(0,M.jsx)(C,{label:`Judged against recorded`,rows:[{key:`expected`,label:`Expected`,required:!0,control:{type:`multi`,value:t,options:r,onChange:n}}]})}function Ze({start:e}){let[t,n]=(0,k.useState)(e);return(0,M.jsx)(`div`,{style:{maxWidth:360},children:(0,M.jsx)(i,{value:t,onChange:n})})}function Qe({open:e}){return(0,M.jsx)(`div`,{style:{display:`flex`,justifyContent:`flex-end`,padding:`var(--s3)`},children:(0,M.jsx)(ve,{name:`Test a workflow`,done:2,total:4,current:2,steps:[{title:`Add a workflow Source`,done:!0},{title:`Test an action`,done:!0},{title:`Run the test`,done:!1},{title:`Compare the replies`,done:!1}],onOpen:N,onCancel:N,...e?{defaultOpen:!0}:{}})})}var $e=Me.map(e=>({...e,render:Ue[e.path]})),Q=e=>Array.from({length:e},(e,t)=>({name:`IMG_${String(4e3+t*7919%97).padStart(4,`0`)}.jpg`,kb:t*37%900+40}));function et({search:e=``,size:t=`all`}){let[n,r]=(0,k.useState)(e),[i,a]=(0,k.useState)(t),[o,s]=(0,k.useState)(`shoot`),c=Q(12),l=c.filter(e=>e.name.toLowerCase().includes(n.trim().toLowerCase())&&(i===`all`||i===`large`==e.kb>=400));return(0,M.jsxs)(x,{id:`files`,title:`Files`,children:[(0,M.jsx)(ne,{noun:`files`,search:{label:`Name`,placeholder:`Search names`,value:n,onChange:r},count:{shown:l.length,total:c.length},filters:[{key:`source`,label:`Source`,value:o,neutral:null,onChange:s,options:[{value:`shoot`,label:`Tuesday shoot`},{value:`samples`,label:`Sample library`}]},{key:`size`,label:`Size`,value:i,onChange:a,options:[{value:`all`,label:`All`},{value:`small`,label:`Small`},{value:`large`,label:`Large`}]}]}),l.length?(0,M.jsx)(u,{label:`Files`,rows:l,rowKey:e=>e.name,columns:[{key:`name`,header:`Name`,cell:e=>e.name},{key:`size`,header:`Size`,sort:e=>e.kb,cell:e=>`${e.kb} KB`}]}):(0,M.jsx)(`p`,{className:`note`,children:`No files match these filters.`})]})}function $({count:e,pageSize:t,picked:n}){let r=Q(e),[i,a]=(0,k.useState)(r),[o,s]=(0,k.useState)(()=>new Set((n??[]).map(e=>r[e].name)));return(0,M.jsx)(x,{id:`files`,title:`Files`,children:(0,M.jsx)(u,{label:`Files`,cards:!0,rows:i,rowKey:e=>e.name,pageSize:t??null,select:n&&{noun:`file`,selected:o,onChange:s,actions:e=>[{label:`Move…`,icon:y.rename,onSelect:N},{label:`Remove`,icon:y.remove,destructive:!0,onSelect:()=>{a(t=>t.filter(t=>!e.includes(t))),s(new Set)}},{label:`Export`,icon:_,onSelect:N}]},columns:[{key:`name`,header:`Name`,role:`title`,cell:e=>e.name},{key:`size`,header:`Size`,className:`num`,sort:e=>e.kb,cell:e=>`${e.kb} KB`},{key:`menu`,header:``,role:`menu`,sort:null,cell:e=>(0,M.jsx)(he,{label:`${e.name} actions`,actions:[{label:`Rename…`,icon:y.rename,onSelect:N},{label:`Remove`,icon:y.remove,destructive:!0,onSelect:N}]})}]})})}function tt(){let[e,t]=(0,k.useState)(`files`);return(0,M.jsx)(C,{label:`New Source`,rows:[{key:`type`,label:`Type`,control:{type:`cards`,value:e,onChange:t,options:[{value:`files`,label:`File Library`,icon:(0,M.jsx)(ke,{size:16,fill:`currentColor`,"aria-hidden":`true`})},{value:`flow`,label:`Power Automate flow`,icon:(0,M.jsx)(Oe,{size:16,fill:`currentColor`,"aria-hidden":`true`})}]}},{key:`name`,label:`Name`,control:{type:`text`,value:``,onChange:N}}]})}var nt=()=>decodeURIComponent(location.hash.replace(/^#\/?/,``));function rt(){let[e,t]=(0,k.useState)(nt);(0,k.useEffect)(()=>{let e=()=>t(nt());return window.addEventListener(`hashchange`,e),()=>window.removeEventListener(`hashchange`,e)},[]);let n=$e.find(t=>t.path===e);return n?(0,M.jsxs)(`main`,{className:`gallery-one`,"data-route":n.path,children:[(0,M.jsxs)(`nav`,{className:`gallery-nav`,children:[(0,M.jsx)(`a`,{href:`#/`,children:`All`}),(0,M.jsx)(`span`,{children:n.title})]}),n.render()]}):(0,M.jsxs)(`main`,{className:`gallery-index`,"data-route":``,children:[(0,M.jsx)(`h1`,{children:`Components`}),(0,M.jsx)(`ul`,{children:$e.map(e=>(0,M.jsxs)(`li`,{children:[(0,M.jsx)(`a`,{href:`#/${e.path}`,children:e.title}),` `,(0,M.jsx)(`code`,{children:e.path})]},e.path))})]})}(0,Ae.createRoot)(document.getElementById(`root`)).render((0,M.jsx)(k.StrictMode,{children:(0,M.jsx)(rt,{})}));
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.gallery-index,.gallery-one{max-width:720px;padding:var(--s4);min-width:0;margin:0 auto}.gallery-index h1{font-size:var(--t-title);font-weight:600}.gallery-index ul{gap:var(--s2);margin:0;padding:0;list-style:none;display:grid}.gallery-index li{gap:var(--s2);min-height:var(--tap);flex-wrap:wrap;align-items:baseline;display:flex}.gallery-index a{color:var(--amber)}.gallery-index code{font-size:var(--t-note);color:var(--faint)}.gallery-nav{gap:var(--s2);margin-bottom:var(--s3);font-size:var(--t-note);color:var(--dim);min-height:var(--tap);align-items:center;display:flex}.gallery-nav a{color:var(--amber)}.gallery-row{gap:var(--s2);flex-wrap:wrap;display:flex}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.figures{--fig-lead:32px;--fig-lead-dense:22px;align-items:stretch;gap:var(--s4);display:flex}.fig{align-content:start;gap:var(--s-half);min-width:0;display:grid}.fig-label{font-size:var(--t-label);color:var(--dim)}.fig-value{font-size:var(--t-body);color:var(--ink);font-variant-numeric:tabular-nums lining-nums}.fig-good{color:var(--sage)}.fig-bad{color:var(--rust)}.fig-lead{flex:none}.fig-headline{gap:var(--s1);display:grid}.fig-headline>.fig-value{font-size:var(--fig-lead);letter-spacing:-.01em;font-weight:600;line-height:1.1}.fig-under{font-size:var(--t-label);color:var(--ink)}.fig-part{font-variant-numeric:tabular-nums lining-nums}.fig-of{color:var(--dim)}.fig-rest{align-content:start;gap:var(--s3) var(--s5);padding-left:var(--s4);border-left:1px solid var(--line);flex-wrap:wrap;flex:auto;display:flex}.figures.dense{display:block}.figures.dense .fig-headline{align-items:baseline;gap:var(--s1) var(--s2);flex-wrap:wrap;display:flex}.figures.dense .fig-headline>.fig-value{font-size:var(--fig-lead-dense)}.figures.dense>.fig-rest{margin-top:var(--s2);padding:var(--s2) 0 0;border-left:0;border-top:1px solid var(--line);gap:var(--s2) var(--s4)}@media (width<=600px){.figures{display:block}.figures>.fig-rest{margin-top:var(--s3);padding:var(--s3) 0 0;border-left:0;border-top:1px solid var(--line);gap:var(--s2) var(--s4);grid-template-columns:repeat(2,minmax(0,1fr));display:grid}}.raw-content{resize:none;flex:1;width:100%;min-height:40vh}.raw-foot{align-items:center;gap:var(--s3);margin-top:var(--s3);flex-wrap:wrap;display:flex}.raw-foot .note{flex:auto;margin:0}.raw-foot .note.bad{color:var(--rust)}.datasets{gap:var(--s4);grid-template-columns:minmax(0,1fr);display:grid}.datasets>.note{margin:0}@media (pointer:coarse),(width<=600px){.eg-groups td[data-state=none]{display:none}}.cf-preview img{border:1px solid var(--line);border-radius:var(--r-ctl);max-width:100%;max-height:220px;display:block}.cf-preview .note{margin:var(--s1) 0 0;overflow-wrap:anywhere}.ev-all{margin-left:var(--s3);flex:none;justify-content:flex-start}@media (width>=601px){.ev-all{display:none}}@media (width<=600px){.ev-all{margin-left:calc(var(--s3) + 1px)}}.ev-from{gap:var(--s1) var(--s3);margin:0 0 var(--s3);flex-wrap:wrap;display:flex}.ev-empty .note a{color:var(--amber)}.ev-check{cursor:pointer;justify-content:center;align-items:center;min-width:24px;min-height:24px;display:inline-flex}.ev-check input{margin:0}@media (pointer:coarse),(width<=600px){.ev-check{min-width:var(--tap);min-height:var(--tap)}}.dstable .ds-todo{color:var(--amber)}.ds-nomatch{font-size:var(--t-label);color:var(--dim)}.ds-status{font-size:var(--t-label);color:var(--sage);font-weight:600}.ds-status.ds-todo{color:var(--dim)}.ds-status.ds-missing{color:var(--rust)}.ds-status.ds-nocase{color:var(--dim)}.ds-note{text-overflow:ellipsis;white-space:nowrap;max-width:36ch;color:var(--dim);display:block;overflow:hidden}.item-picker .ip-items{max-height:50vh;overflow:auto}.item-picker .ip-thumb{object-fit:cover;background:var(--surface2);border:1px solid var(--line);border-radius:4px;flex:none;width:56px;height:42px}.ev-bulk{width:min(100%,480px)}.ev-changes{margin:var(--s3) 0 0}.ev-refusal{margin-top:var(--s3);color:var(--rust);font-size:var(--t-label)}.ev-refusal-head{margin:0 0 var(--s1);font-weight:600}.ev-refusal ul{padding-left:var(--s4);gap:var(--s1);margin:0;display:grid}.ev-refusal li{overflow-wrap:anywhere}.ev-refusal b{font-weight:600}@media (width<=600px){.dstable td[data-label=Note][data-state=none]{display:none}.dstable .ds-note{white-space:normal;max-width:none}.dstable td[data-label=Status]:before{content:none}.ds-cases{max-height:calc(100vh - 300px);overflow:auto}.ds-cases .dt-bulk{z-index:1;background:var(--surface);position:sticky;top:0}.ds-cases .dstable{padding-bottom:56px}}.filters-page{gap:var(--s4);grid-template-columns:minmax(0,1fr);display:grid}.filters-page>.note{margin:0}.filters-page>.note.bad{color:var(--rust)}.nf-verbs{gap:var(--s1);margin:0;padding:0;list-style:none;display:grid}.nf-verb{gap:var(--s2);width:100%;padding:var(--s2) var(--s3);border-radius:var(--r-ctl);color:var(--ink);font:inherit;text-align:left;cursor:pointer;background:0 0;border:0;align-items:flex-start;display:flex}.nf-verb:hover,.nf-verb:focus-visible{background:color-mix(in srgb, var(--amber) 10%, transparent)}.nf-verb-icon{color:var(--dim);padding-top:3px;display:flex}.nf-verb-text{gap:var(--s-half);display:grid}.nf-verb-name{font-weight:600}.nf-verb-about{color:var(--dim);font-size:var(--t-label)}.verb-label{align-items:center;gap:var(--s2);display:inline-flex}.edit-override{align-items:center;gap:var(--s2);cursor:pointer;display:inline-flex}.edit-override input{accent-color:var(--amber)}.cond-builder{gap:var(--s2);display:grid}.cond-row{gap:var(--s1);display:grid}.cond-line{align-items:center;gap:var(--s2);flex-wrap:wrap;display:flex}.cond-prefix,.cond-unit{color:var(--dim)}.cond-num{text-align:center;width:5rem}.cond-regex{min-width:12ch;font-family:var(--mono);flex:16ch}.cond-x{width:var(--field);height:var(--field);color:var(--dim);cursor:pointer;background:0 0;border:0;justify-content:center;align-items:center;margin-left:auto;display:inline-flex}.cond-x:hover,.cond-x:focus-visible{color:var(--rust)}.cond-share{gap:var(--s1);display:grid}.cond-share .cond-num{justify-self:start}.cond-add{margin:var(--s1) auto 0 0;justify-self:start}.filter-tests{gap:var(--s3);display:grid}.filter-tests>.note{margin:0}.filter-test{gap:var(--s2);padding:var(--s3);border:1px solid var(--line);border-radius:var(--r-ctl);display:grid}.filter-test-result{justify-content:space-between;align-items:center;gap:var(--s2);display:flex}.filter-test-verdict{font-size:var(--t-label);overflow-wrap:anywhere}.filter-test-verdict.hit{color:var(--sage)}.filter-test-verdict.fault{color:var(--rust)}@media (pointer:coarse),(width<=600px){.cond-num{text-align:left;width:100%}}.pl-open{gap:var(--s-half);justify-items:start;width:100%;display:grid}.pl-title{align-items:center;gap:var(--s2);overflow-wrap:anywhere;flex-wrap:wrap;display:inline-flex}.pl-preview{color:var(--dim);font-size:var(--t-note);-webkit-line-clamp:2;line-clamp:2;white-space:pre-line;overflow-wrap:anywhere;-webkit-box-orient:vertical;font-weight:400;display:-webkit-box;overflow:hidden}.pl-run{color:var(--amber)}.pl-words{max-height:240px;font-family:var(--sans);overflow:auto}.edit-section .dt{margin-top:var(--s1)}.edit .prop[data-key=text] textarea{min-height:180px}@media (pointer:coarse),(width<=600px){.pl-run{min-height:var(--tap);align-items:center;display:inline-flex}}@media (width<=600px){.pl-words{max-height:240px;font-family:var(--sans);overflow:auto}.edit-section .dt{margin-top:var(--s1)}}.sp-list{gap:var(--s2);margin:0;padding:0;list-style:none;display:grid}.sp-pick{gap:var(--s1);width:100%;padding:var(--s3);text-align:left;color:var(--ink);justify-items:start;font-weight:400;display:grid}.sp-pick:hover,.sp-pick:focus-visible,.sp-pick.top-match{border-color:var(--amber)}.sp-head{align-items:center;gap:var(--s2);flex-wrap:wrap;display:inline-flex}.sp-title{overflow-wrap:anywhere;font-weight:600}.sp-text{color:var(--dim);font-size:var(--t-label);white-space:pre-line;overflow-wrap:anywhere;-webkit-line-clamp:3;line-clamp:3;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.sp-meta{gap:var(--s3);color:var(--dim);font-size:var(--t-note);font-variant-numeric:tabular-nums;flex-wrap:wrap;display:flex}.sources{gap:var(--s3);grid-template-columns:minmax(0,1fr);display:grid}.shead{align-items:center;gap:var(--s2) var(--s3);flex-wrap:wrap;display:flex}.shead-title{font-size:var(--t-title);flex:100%;margin:0;font-weight:600}.sfoot{align-items:center;gap:var(--s2) var(--s3);margin-top:var(--s2);flex-wrap:wrap;display:flex}.swarn{align-items:center;gap:var(--s2);font-size:var(--t-label);color:var(--rust);margin:0;display:flex}.swarn svg{flex:none}.sfoot .add-btn{margin:0 0 0 auto}.skind{color:var(--amber);flex:none}.sfolders{gap:var(--s2);grid-template-columns:repeat(auto-fill,minmax(240px,1fr));grid-auto-rows:1fr;margin:0;padding:0;list-style:none;display:grid}.sfolder{display:grid;position:relative}.sfolder-open{align-items:flex-start;gap:var(--s1);width:100%;height:100%;padding:var(--s3);color:var(--ink);font:var(--t-body) var(--sans);text-align:left;flex-direction:column;display:flex}.sfolder-open:hover,.sfolder-open:focus-visible{border-color:var(--amber)}.sfolder-open.off{opacity:.5;cursor:not-allowed}.sfolder-open .skind{margin-bottom:var(--s1)}.sfolder-name{word-break:break-word;padding-right:calc(var(--ctl) + var(--s1));font-weight:600}.sfolder-meta{color:var(--dim);font-size:var(--t-note)}.squota{align-items:center;display:inline-flex;position:relative}.sfolder-open .squota{width:100%;min-height:14px;margin-top:auto;display:flex}.squota-bar{border-radius:var(--r-pill);background:var(--surface2);width:100%;height:6px;display:block;overflow:hidden}.squota-fill{background:var(--amber);height:100%;display:block}.sfolder-open .squota-pct{margin-left:var(--s2);color:var(--dim);font-size:var(--t-note);font-variant-numeric:tabular-nums;flex:none}.squota-pop{visibility:hidden;right:0;top:calc(100% + var(--s1));z-index:var(--z-popover);padding:var(--s1) var(--s2);background:var(--surface);border:1px solid var(--line);border-radius:var(--r-pane);box-shadow:var(--e-pop);font:var(--t-label) var(--sans);color:var(--ink);white-space:nowrap;position:absolute}.squota:hover>.squota-pop,.sfolder-open:focus-visible .squota-pop{visibility:visible}.sfolder-menu{top:var(--s2);right:var(--s2);position:absolute}.slist tbody tr{cursor:pointer}.slist .stype{color:var(--dim);font-size:var(--t-note);white-space:nowrap}.slist .sfile-name{white-space:nowrap}.slist-folders td.sfile-name{white-space:normal;word-break:break-word}.slist-folders .sfile-name .skind{vertical-align:-2px;margin-right:var(--s2)}.sadd .props{--prop-cols:minmax(88px, 22%) minmax(0, 1fr) auto var(--ctl)}.sfiles{min-height:96px;max-height:calc(100vh - 320px);overflow:auto}.sfiles.drag{outline:2px dashed var(--amber);outline-offset:-2px}.stiles{padding:var(--s2);gap:var(--s2);grid-template-columns:repeat(auto-fill,minmax(120px,1fr));grid-auto-rows:1fr;margin:0;list-style:none;display:grid}.stile-cell{min-width:0;display:grid;position:relative}.stile{background:var(--surface2);border:1px solid var(--line);border-radius:var(--r-pane);width:100%;min-width:0;height:100%;color:var(--ink);cursor:pointer;font:var(--t-body) var(--sans);flex-direction:column;align-items:stretch;margin:0;padding:0;display:flex;position:relative;overflow:hidden}.stile:hover,.stile:focus-visible{border-color:var(--amber)}.stile-img{aspect-ratio:1;object-fit:cover;background:var(--surface2);width:100%;display:block}.stile-type{gap:var(--s1);aspect-ratio:1;width:100%;color:var(--dim);font-size:var(--t-note);flex-direction:column;justify-content:center;align-items:center;display:flex}.stile-type svg{color:var(--faint)}.stile-text{aspect-ratio:1;width:100%;padding:var(--s2);background:var(--surface);color:var(--dim);font:var(--t-caption) / 1.4 var(--mono);white-space:pre-wrap;overflow-wrap:anywhere;text-align:left;display:block;overflow:hidden}.stile-name{padding:var(--s2) calc(var(--ctl) + var(--s1)) var(--s2) var(--s2);font-size:var(--t-note);text-align:left;white-space:nowrap;text-overflow:ellipsis;margin-top:auto;overflow:hidden}.stile-menu{right:var(--s1);bottom:var(--s-half);position:absolute}.supload{gap:var(--s1);display:grid}.sdrop{color:var(--dim);margin:0}.suploads{gap:var(--s1);margin:0;padding:0;list-style:none;display:grid}.suploads li{align-items:center;gap:var(--s2);font-size:var(--t-note);display:flex}.supload-name{word-break:break-word;flex:auto}.suploads .bad{color:var(--rust)}.supload-bar{border-radius:var(--r-pill);background:var(--surface2);width:72px;height:6px;display:inline-block;position:relative;overflow:hidden}.supload-bar:after{content:"";background:var(--amber);animation:1.2s ease-in-out infinite supload;position:absolute;inset:0}@keyframes supload{0%{transform:translate(-100%)}to{transform:translate(200%)}}.sacts{gap:var(--s2);margin-top:var(--s3);justify-content:flex-end;display:flex}.spreview-img{border-radius:var(--r-ctl);max-width:100%;max-height:60vh;margin:0 auto;display:block}.spreview-text{max-height:60vh;overflow:auto}.spreview-doc{border-radius:var(--r-ctl);border:0;width:100%;height:min(62vh,600px);display:block}@media (pointer:coarse){.sfolder-open{min-height:72px}.stile{min-height:96px}.sfiles{max-height:calc(100vh - 300px)}}.sflow{overflow-x:auto}.sflow td{overflow-wrap:anywhere}.sflow-in{color:var(--dim);font-size:var(--t-note);display:block}.sresult{align-items:center;gap:var(--s1);vertical-align:middle;white-space:nowrap;display:inline-flex}.slist tr[data-fresh]>td{background:var(--tint-amber)}.call-content{min-height:16lh}.modal.edit .prop[data-key=error] .prop-value{color:var(--rust)}.snone{color:var(--dim)}.slist a[href]{color:var(--amber);overflow-wrap:anywhere;text-decoration:none}.slist a[href]:hover{text-decoration:underline}.home{--mark:36px;--sub:28px;--rail:2px}.home-line,.home-branch{margin:0;padding:0;list-style:none}.home-line{max-width:560px}.home-pane{margin-top:var(--s5);padding:var(--s5)}@media (width<=600px){.home-pane{margin-top:var(--s4);padding:var(--s4)}}.home-stop{padding:0 0 var(--s5) calc(var(--mark) + var(--s3));position:relative}.home-stop.branch{padding:0 0 var(--s4) calc(var(--sub) + var(--s3))}.home-mark{left:0;top:calc(var(--ctl) / 2 - var(--mark) / 2);z-index:1;width:var(--mark);height:var(--mark);border:var(--rail) solid var(--line);background:var(--surface);color:var(--dim);border-radius:50%;place-items:center;display:grid;position:absolute}.branch .home-mark{width:var(--sub);height:var(--sub);top:calc(var(--ctl) / 2 - var(--sub) / 2)}.home-stop:after{content:"";left:calc(var(--mark) / 2 - var(--rail) / 2);top:calc(var(--ctl) / 2);bottom:calc(var(--ctl) / -2);width:var(--rail);background:var(--line);position:absolute}.home-stop.branch:after{left:calc(var(--sub) / 2 - var(--rail) / 2)}.home-stop:last-child:after{display:none}.home-branch>.home-stop:first-child:before{content:"";top:calc(var(--ctl) / 2 - var(--rail) / 2);height:var(--rail);left:calc(-1 * (var(--mark) / 2 + var(--s3)));width:calc(var(--mark) / 2 + var(--s3));background:var(--line);position:absolute}.home-branch{margin-top:var(--s2)}.home-fork{padding-bottom:var(--s3)}.hub>.home-name .home-mark,.start>.home-name .home-mark{background:var(--amber);border-color:var(--amber);color:var(--on-amber)}.home-line>.hub:after{background:var(--amber)}.home-line>.hub+.home-stop>.home-name .home-mark{border-color:var(--amber)}.home-name{min-height:var(--ctl);font-size:var(--t-title);color:var(--ink);align-items:center;font-weight:600;text-decoration:none;display:inline-flex}.branch>.home-name{font-size:var(--t-heading)}.home-name:hover{text-underline-offset:3px;text-decoration:underline}.home-name:hover .home-mark{color:var(--ink)}.hub>.home-name:hover .home-mark,.start>.home-name:hover .home-mark{color:var(--on-amber)}.home-fact{margin-left:var(--s2);color:var(--dim);font-size:var(--t-label);font-variant-numeric:tabular-nums}.home-start{min-height:var(--ctl);margin-left:var(--s2);align-items:center;text-decoration:none;display:inline-flex}.home-start:hover .badge{background:var(--tint-amber)}.home-items{margin:0;padding:0;list-style:none}.home-items a{align-items:baseline;gap:var(--s2);min-height:var(--ctl);padding-block:calc((var(--ctl) - 1.5em) / 2);color:var(--ink);min-width:0;text-decoration:none;display:flex}.home-items a:hover .home-item{text-underline-offset:3px;text-decoration:underline}.home-item{-webkit-line-clamp:2;line-clamp:2;overflow-wrap:anywhere;white-space:normal;-webkit-box-orient:vertical;flex:0 auto;min-width:0;display:-webkit-box;overflow:hidden}.home-item code{font-size:var(--t-label)}.home-sub{color:var(--dim);font-size:var(--t-note);font-variant-numeric:tabular-nums;flex:none}.home-items .home-more{color:var(--dim);font-size:var(--t-label)}.home-version{margin:var(--s4) 0 0;color:var(--dim);font-size:var(--t-caption);font-variant-numeric:tabular-nums}@media (width>=960px){.home-line{gap:0 var(--s4);grid-template-columns:repeat(6,minmax(0,1fr));max-width:none;display:grid}.home-fork{grid-column:span 3;padding-bottom:0}.home-branch{gap:0 var(--s4);margin-top:var(--s3);grid-template-columns:repeat(3,minmax(0,1fr));display:grid}.home-stop,.home-stop.branch{padding:calc(var(--mark) + var(--s2)) 0 0}.home-stop.branch{padding-top:calc(var(--sub) + var(--s2))}.home-mark{top:0}.branch .home-mark{top:0;left:calc(var(--mark) / 2 - var(--sub) / 2)}.home-stop:after{top:calc(var(--mark) / 2 - var(--rail) / 2);bottom:auto;left:var(--mark);right:calc(-1 * var(--s4));width:auto;height:var(--rail)}.home-stop.branch:after{top:calc(var(--sub) / 2 - var(--rail) / 2);left:calc(var(--mark) / 2 + var(--sub) / 2)}.home-branch>.home-stop:first-child:before{display:none}.home-fork{padding-top:0}.home-fork>.home-name{z-index:1;min-height:var(--mark);padding:0 var(--s3) 0 calc(var(--mark) + var(--s2));background:var(--surface);position:relative}.home-fork .home-branch{margin-top:var(--s4)}.home-fork:before{content:"";left:calc(var(--mark) / 2 - var(--rail) / 2);width:var(--rail);top:calc(var(--mark) / 2);height:calc(var(--mark) / 2 + var(--s4) + var(--sub) / 2);background:var(--line);position:absolute}.home-fact{margin-left:0;display:block}.home-start{width:fit-content;margin:0;display:flex}.home-items{margin-top:var(--s2)}.home-items a{padding-block:var(--s1);flex-direction:column;align-items:flex-start;gap:0}.home-item{max-width:100%}.home-version{margin-top:var(--s5)}}.runs{gap:var(--s4);grid-template-columns:minmax(0,1fr);display:grid}.repeater[data-noun=job]>.repeater-items{gap:var(--s4)}.add-why{margin-top:var(--s1)}#pipelines select{min-width:min(16rem,100%)}.pick-item{text-align:left;justify-content:flex-start;width:100%}.pick-others{gap:var(--s2);margin-top:var(--s4);display:grid}.pick-item:has(.pick-about){align-items:flex-start;gap:var(--s-half);height:auto;padding-block:var(--s2);flex-direction:column}.pick-about{font-size:var(--t-note);color:var(--dim);font-weight:400}.eval-flag{align-items:center;gap:var(--s1);color:var(--rust);display:inline-flex}.eval-flag svg{flex:none}@media (pointer:coarse),(width<=600px){.eg-links td[data-state=none]{display:none}}.mkey{margin-top:var(--s2)}.mchips{gap:var(--s1);margin-top:var(--s2);flex-wrap:wrap;display:flex}.mchip{min-height:var(--ctl);font-size:var(--t-label)}.mchip.ok{background:var(--sage);color:var(--on-sage);border-color:#0000}.mchip.missing{border-style:dashed}.mchip.todo{border-color:var(--line)}.runbar{z-index:var(--z-sticky);margin-bottom:var(--s4);padding-top:calc(var(--s2) + env(safe-area-inset-top,0px));position:sticky;top:0}@media (width<=600px){.runbar{padding-top:calc(var(--s3) + env(safe-area-inset-top,0px))}}.runbar-why{overflow-wrap:anywhere}.runbar-why.bad{color:var(--rust)}.runbar-fix{color:var(--amber);white-space:nowrap}button.runbar-fix{min-height:0}.runbar-open{align-items:baseline;gap:var(--s2);max-width:100%;font-size:var(--t-label);color:var(--dim);text-align:left;background:0 0;border:0;border-radius:0;flex-wrap:wrap;padding:0;font-weight:400;display:inline-flex}.runbar-open:hover .runbar-word,.runbar-open:focus-visible .runbar-word{color:var(--amber)}.runbar-word{color:var(--ink);font-weight:600}.runbar-detail{overflow-wrap:anywhere;font-variant-numeric:tabular-nums}.runs :is(input,select,textarea,button,summary){scroll-margin-top:calc(var(--ctl) + var(--s4))}.import-missing{gap:var(--s2);margin:var(--s2) 0 0;padding:0;list-style:none;display:grid}.import-missing li{font-size:var(--t-label);color:var(--rust)}.stages{counter-reset:stage;--rail:28px;--rail-dot:24px}.stages>.group.sub{counter-increment:stage;margin-inline-start:0;padding-inline-start:calc(var(--rail) + var(--s3));padding-top:0;padding-bottom:var(--s4);border-top:0;margin-top:0;position:relative}.stages>.group.sub:last-child{padding-bottom:0}.stages>.group.sub:before{content:counter(stage);inset-inline-start:calc((var(--rail) - var(--rail-dot)) / 2);top:calc((var(--ctl) - var(--rail-dot)) / 2);width:var(--rail-dot);height:var(--rail-dot);box-sizing:border-box;border:1.5px solid var(--line);font-size:var(--t-caption);color:var(--dim);background:var(--surface);border-radius:50%;justify-content:center;align-items:center;font-weight:600;display:flex;position:absolute}.stages>.group.sub:not(:last-child):after{content:"";inset-inline-start:calc(var(--rail) / 2 - 1px);top:calc((var(--ctl) + var(--rail-dot)) / 2 + 4px);background:var(--line);width:2px;position:absolute;bottom:4px}.stages .repeater-items:has(>.stage-row){gap:var(--s2)}.stages .stage-row>.props{padding-top:0}.job-reply{margin:calc(-1 * var(--s1)) 0;font-size:var(--t-note);color:var(--dim);justify-content:center;align-items:center;gap:6px;display:flex}.job-reply svg{color:var(--faint)}.repeater-items:has(>.target){gap:var(--s4);grid-template-columns:repeat(auto-fit,minmax(min(100%,20rem),1fr));display:grid}.target:not(:last-child){padding-bottom:var(--s2);border-bottom:1px solid var(--line)}.repeater-items:has(>.target)>.target:not(:last-child){border-bottom:0;padding-bottom:0}.target-head{grid-template-columns:22px minmax(0, 1fr) auto var(--ctl);gap:var(--s3);align-items:center;min-height:48px;display:grid}.target-badge{background:var(--surface2);width:22px;height:22px;color:var(--ink);font-size:var(--t-caption);justify-content:center;padding:0;font-weight:700}.target-name{font-size:var(--t-label);overflow-wrap:anywhere;grid-column:2;margin:0;font-weight:600}.target-idle{color:var(--dim);font-size:var(--t-label);white-space:nowrap;grid-column:3}.target-head .menu{grid-column:4;justify-self:end}.target .group.sub{margin-inline-start:0}@media (width<=600px){.stages{--rail:24px;--rail-dot:22px}.stages>.group.sub{padding-inline-start:calc(var(--rail) + var(--s2))}.target-head{column-gap:var(--s2);padding:var(--s1) 0}}.recorded-replies{gap:var(--s4);display:grid}.recorded-replies section{gap:var(--s2);min-width:0;display:grid}.recorded-replies h3{font-size:var(--t-label);margin:0;font-weight:600}.flow{--flow:16px;--flow-dot:10px;margin:0;padding:0;list-style:none}.flow-step{min-width:0;padding-inline-start:calc(var(--flow) + var(--s3));padding-bottom:var(--s4);position:relative}.flow-step:last-child{padding-bottom:0}.flow-step:before{content:"";inset-inline-start:calc((var(--flow) - var(--flow-dot)) / 2);top:calc((var(--ctl) - var(--flow-dot)) / 2);width:var(--flow-dot);height:var(--flow-dot);box-sizing:border-box;border:1.5px solid var(--dim);background:var(--surface);border-radius:50%;position:absolute}.flow-step:not(:last-child):after{content:"";inset-inline-start:calc(var(--flow) / 2 - 1px);top:calc((var(--ctl) + var(--flow-dot)) / 2 + 4px);background:var(--line);width:2px;position:absolute;bottom:4px}.flow-head{min-height:var(--ctl);font-size:var(--t-label);color:var(--ink);align-items:center;margin:0;font-weight:600;display:flex}.flow-head>p{flex:auto;margin:0}.filter-stage{min-width:0;display:grid}.fs-table .fs-type{width:30%}.fs-table td.fs-n{width:3ch;color:var(--dim);font-variant-numeric:tabular-nums}.fs-set,.fs-inner{align-items:center;gap:var(--s2);flex-wrap:wrap;flex:auto;min-width:0;display:inline-flex}.fs-toggle{width:24px;height:24px;min-height:0;color:var(--dim);justify-content:center;padding:0}.fs-inner{padding-inline-start:calc(24px + var(--s2));font-weight:400}.fs-inner-row td{color:var(--dim)}.fs-name{align-items:center;gap:var(--s2);flex-wrap:wrap;min-width:0;display:inline-flex}.fs-per-item{font-size:var(--t-caption);color:var(--dim);white-space:nowrap;font-weight:400}@media (width>=601px){.fs-table>:is(thead,tbody)>tr>:is(th,td){height:calc(var(--ctl) + var(--s3));padding-block:0}}.fs-format-row>td{background:color-mix(in srgb, var(--surface2) 70%, transparent)}.fs-format{align-items:center;gap:var(--s2) var(--s3);flex-wrap:wrap;min-width:0;display:inline-flex}.fs-format-name{align-items:center;gap:var(--s2);white-space:nowrap;font-weight:600;display:inline-flex}.fs-format-controls{align-items:center;gap:var(--s2) var(--s3);flex-wrap:wrap;font-weight:400;display:inline-flex}.fs-format-controls select{width:10rem}.fs-format-setting{align-items:center;gap:var(--s2);color:var(--dim);white-space:nowrap;display:inline-flex}table.dt-cards.fs-table td.fs-type:empty{display:none}@media (width<=600px){.flow{--flow:12px}.flow-step{padding-inline-start:calc(var(--flow) + var(--s2))}table.dt-cards.fs-table tbody tr{padding-inline-start:calc(var(--s3) + 3ch)}table.dt-cards.fs-table td.fs-n{top:var(--s2);left:var(--s3);height:var(--ctl);align-items:center;width:auto;display:flex;position:absolute}.fs-inner{padding-inline-start:0}table.dt-cards.fs-table .fs-type{width:auto}.fs-set{flex-wrap:nowrap}.fs-set .link-btn{min-width:0}.fs-toggle{flex:none}}.history{gap:var(--s3);grid-template-columns:minmax(0,1fr);display:grid}.hstatus{margin:0}.htable .runrow td{white-space:nowrap}.htable .scenrows>td{background:var(--surface2);vertical-align:top}.runlink{color:var(--amber);cursor:pointer}.htable time{white-space:nowrap}.htable .runrow td{vertical-align:middle}.hcomment{text-overflow:ellipsis;white-space:nowrap;vertical-align:bottom;max-width:240px;display:inline-block;overflow:hidden}.hcomment.empty{color:var(--dim);letter-spacing:.12em}.scen-table td{white-space:nowrap}.hcols{gap:var(--s3);display:grid}.hcols .groups{gap:var(--s1);display:grid}.hcols h3{font-size:var(--t-label);color:var(--dim);margin:0;font-weight:600}.hcols label{align-items:center;gap:var(--s2);min-height:var(--ctl);font-size:var(--t-label);display:flex}@media (pointer:coarse),(width<=600px){.hcols label{min-height:var(--tap)}.htable td.dt-expand .icon-btn{min-width:var(--tap);min-height:var(--tap)}}@media (width<=600px){.htable,.htable :is(thead,tbody,tr,th,td){display:block}.htable thead{display:none}.htable>tbody>tr{border:1px solid var(--line);border-radius:var(--r-pane);margin-bottom:var(--s2);padding:var(--s2) var(--s3)}.htable td{padding:var(--s1) 0;border:0;height:auto}.htable td[data-label]{gap:var(--s2);white-space:normal;grid-template-columns:7.5rem minmax(0,1fr);align-items:baseline;display:grid}.htable td[data-label]:before{content:attr(data-label);font-size:var(--t-label);color:var(--dim);font-weight:600}.htable .hval{overflow-wrap:anywhere;min-width:0}.htable :is(th,td).num,.scen-table :is(th,td).num{text-align:left}.htable>tbody>.runrow{position:relative}.htable>tbody>.runrow:not(:has(>td.hrunid)){padding-top:calc(var(--tap) + var(--s2))}.htable .runrow>td.dt-expand{top:var(--s1);left:auto;right:var(--s1);width:auto;padding:0;position:absolute}.htable .runrow>td.hrunid{min-height:var(--tap);align-items:center;padding-right:96px;font-weight:600;display:flex}.htable .runrow>td.hrunid:before{content:none}.htable>tbody>.runrow.dt-open{border-bottom-right-radius:0;border-bottom-left-radius:0;margin-bottom:0}.htable>tbody>.scenrows{background:var(--surface2);border-top:0;border-top-left-radius:0;border-top-right-radius:0}.htable .scenrows>td{background:0 0;padding:0}.scen-table tr+tr{border-top:1px solid var(--line)}.scen-table tr{padding:var(--s1) 0}}.hrerun{font-size:var(--t-note);display:block}.htable .hactions{width:1px;padding:0 var(--s1)}.htable>tbody>.runrow.fresh>td{background:var(--surface2)}.htable>tbody>.runrow.fresh>td:first-child{box-shadow:inset 3px 0 0 var(--amber)}@media (pointer:coarse),(width<=600px){.hactions .icon-btn,.hactions button{min-width:var(--tap);min-height:var(--tap)}}@media (width<=600px){.htable .runrow>td.hactions{top:var(--s1);width:auto;padding:0;position:absolute;right:48px}.htable>tbody>.runrow.fresh{border-color:var(--amber)}.htable>tbody>.runrow.fresh>td{background:0 0}.htable>tbody>.runrow.fresh>td:first-child{box-shadow:none}}.setup{gap:var(--s3);display:grid}.setup-sections{margin-bottom:var(--s3)}.setup-section{gap:var(--s3);display:grid}.setup-wizard{display:grid}.setup-wizard .ctx-head{margin-top:calc(-1 * var(--s5))}.wiz-list-name{display:block}.wiz-step-title{flex-basis:100%;display:block}.wiz-step-title.current{color:var(--ink);font-weight:600}.wiz-row-state.done{color:var(--sage)}.wiz-row-state.now{color:var(--ink);font-weight:600}.wiz-row-state.todo{color:var(--dim)}.ws-archived{margin-top:var(--s3)}.ws-table{margin-top:var(--s2)}.ws-address{align-items:center;gap:var(--s2);flex-wrap:wrap;display:inline-flex}.ws-regen{gap:var(--s1);font-size:var(--t-note)}.ws-regen-dialog{gap:var(--s3);display:grid}.ws-regen-rows{gap:var(--s2);margin:0;display:grid}.ws-regen-rows>div{gap:var(--s3);grid-template-columns:4rem 1fr;align-items:baseline;display:grid}.ws-regen-rows dt{color:var(--dim)}.ws-regen-rows dd{overflow-wrap:anywhere;margin:0}.setup-table{margin-top:var(--s3)}.setup-table td[data-label=Model],.setup-table td[data-label=Used\ by]{overflow-wrap:anywhere}.setup-endpoint,.setup-sets{color:var(--dim);overflow-wrap:anywhere}.setup-endpoint{overflow-wrap:break-word}.setup-sets{-webkit-line-clamp:2;line-clamp:2;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.setup-attention{color:var(--rust)}.setup-table td[data-label=Model]{color:var(--ink);font-weight:500}.setup-row{cursor:pointer}.setup-profile{align-items:flex-start;gap:var(--s1);display:flex}.setup-profile-main{flex-direction:column;min-width:0;display:flex}.setup-profile-name{align-items:center;gap:var(--s2);min-height:var(--ctl);display:flex}.setup-sub{font-size:var(--t-note);color:var(--dim);font-weight:400}.setup-open{min-width:0;min-height:var(--ctl)}.setup-intro{justify-content:space-between;align-items:center;gap:var(--s3);flex-wrap:wrap;display:flex}.setup-intro .note{margin:0}.setup-dot{width:var(--ctl);height:var(--ctl);cursor:pointer;background:0 0;border:0;flex:none;place-items:center;padding:0;display:inline-grid}.setup-dot-mark{border-radius:var(--r-pill);background:var(--faint);width:9px;height:9px}.setup-dot.connected .setup-dot-mark{background:var(--sage)}.setup-dot.key-needed .setup-dot-mark{background:var(--amber)}.setup-dot.unreachable .setup-dot-mark{background:var(--rust)}.setup-dot:hover .setup-dot-mark{box-shadow:0 0 0 3px var(--surface2)}.setup-unset,.setup-used{color:var(--dim)}.setup-usedby{gap:var(--s1);display:grid}.setup-usedby-label{font-size:var(--t-note);color:var(--dim);font-weight:600}.setup-usedby-list{gap:var(--s1);margin:0;padding:0;list-style:none;display:grid}.setup-usedby-list li{align-items:baseline;gap:var(--s2);display:flex}.setup-usedby-kind{font-size:var(--t-note);color:var(--dim)}@media (width<=600px){.wiz-table.dt-cards td.dt-title{padding-right:0}.wiz-table.dt-cards td.dt-menu{width:auto;margin-top:var(--s2);position:static}.setup-table.dt-cards .setup-profile{grid-template-columns:minmax(0,auto) auto;justify-content:start;align-items:center;display:grid}.setup-table.dt-cards .setup-profile-main{display:contents}.setup-table.dt-cards .setup-profile-name{grid-area:1/1;min-width:0}.setup-table.dt-cards .setup-dot{grid-area:1/2}.setup-table.dt-cards .setup-sub{grid-area:2/1/auto/-1}}.results{margin-top:var(--s4)}.results-bar{align-items:center;gap:var(--s2);margin-bottom:var(--s3);display:flex}.rrback{flex:none}.rrcode{display:none}.rtabs{gap:var(--s1);flex-wrap:wrap;display:flex}.rtab{border:1px solid var(--line);border-radius:var(--r-ctl);background:var(--surface);align-items:center;display:flex}.rtab.on{border-color:var(--amber)}.rname{color:var(--dim);min-height:var(--ctl);border-radius:calc(var(--r-ctl) - 1px) 0 0 calc(var(--r-ctl) - 1px);background:0 0;border:0;font-weight:500}.rtab.on .rname{color:var(--ink)}.rx{color:var(--faint);border:0;border-left:1px solid var(--line);min-height:var(--ctl);padding:0 var(--s2);border-radius:0 calc(var(--r-ctl) - 1px) calc(var(--r-ctl) - 1px) 0;background:0 0}.runhead{align-items:center;gap:var(--s2);flex-wrap:wrap;display:flex}.run-queue{align-items:baseline;gap:var(--s2);flex-wrap:wrap;flex:1 1 0;min-width:0;margin:0;display:flex}.run-state{color:var(--ink);font-weight:600}.run-item{overflow-wrap:anywhere}.stop-btn{margin-left:auto}.rrbar{align-items:center;gap:var(--s2);margin-top:var(--s2);min-height:24px;display:flex}.rrmeter{background:var(--surface2);border:1px solid var(--line);border-radius:var(--r-ctl);flex:1;height:24px;position:relative;overflow:hidden}.rrbarfill{background:var(--amber);position:absolute;inset:0 auto 0 0}.rrpct{height:100%;font-size:var(--t-note);font-variant-numeric:tabular-nums;color:var(--ink);background:linear-gradient(90deg, var(--on-amber) var(--pct,0%), var(--ink) var(--pct,0%));-webkit-text-fill-color:transparent;-webkit-background-clip:text;background-clip:text;justify-content:center;align-items:center;font-weight:600;display:flex;position:relative}.rrprogress{font-size:var(--t-label);color:var(--dim)}.rrstatus{margin-top:var(--s2)}.runstats{margin-top:var(--s3)}.runstats .fig-value code{font-size:inherit;color:inherit}.runstats .fig-comment{text-overflow:ellipsis;white-space:nowrap;vertical-align:bottom;max-width:16rem;display:inline-block;overflow:hidden}.rrtable td{vertical-align:top}.rrtable tr.reasons td{background:var(--surface2)}.scenstats-label{font-weight:600;font-size:var(--t-label);color:var(--dim)}.rr-target{gap:var(--s-half);display:grid}.rr-asked{font-size:var(--t-note);color:var(--dim);overflow-wrap:anywhere;font-weight:400}.runview{--lead:34%}.runview :is(.rrtable,.egtable) :is(th,td){text-align:left}@media (width>=601px){.rrtable,.egtable{table-layout:fixed;min-width:calc(14rem + var(--scenarios,1) * 10rem)}:is(.rrtable th.col-item,.egtable th.col-eg){width:var(--lead)}}.runview .fbar-quick{margin-left:auto}.egtable td{height:auto;padding-block:var(--s2);vertical-align:top;overflow-wrap:anywhere}.eg-name{font-weight:600}.eg-ver,.col-egver{color:var(--dim);font-size:var(--t-label)}.eg-cell{align-items:center;gap:var(--s2);display:inline-flex}.eg-pct{font-variant-numeric:tabular-nums;font-size:var(--t-label);color:var(--ink)}.eg-none{color:var(--dim)}.eg-rule{color:var(--dim);font-size:var(--t-note);margin-left:var(--s1)}.egtable tr:has(+tr.eg-overall)>td{border-bottom-color:#0000}.egtable tr.eg-overall>td{border-bottom:0;background:var(--surface2)!important}.egtable tr.eg-overall>td:first-child{border-radius:var(--r-ctl) 0 0 var(--r-ctl)}.egtable tr.eg-overall>td:last-child{border-radius:0 var(--r-ctl) var(--r-ctl) 0}@media (width<=600px){.egtable,.egtable :is(tbody,tr){display:block}.egtable thead{display:none}.egtable>tbody>tr{padding:var(--s2) 0;border-top:1px solid var(--line)}.egtable>tbody>tr:first-child{border-top:0}.egtable>tbody>tr>td{justify-content:space-between;align-items:center;gap:var(--s3);border:0;padding:3px 0;display:flex}.egtable>tbody>tr>td.col-eg{padding-bottom:var(--s1)}.egtable>tbody>tr>td[data-label]:before{content:attr(data-label);color:var(--dim)}.egtable>tbody>tr>td[data-label][data-asked]:before{content:attr(data-label) ", " attr(data-asked)}.egtable>tbody>tr.eg-overall{margin-top:var(--s2);padding:var(--s2) var(--s3);background:var(--surface2);border-radius:var(--r-ctl);border-top:0}.egtable>tbody>tr.eg-overall>td{border-radius:0;background:0 0!important}.egtable>tbody>tr.scenstats>td.scenstat{padding-block:var(--s1);display:block}.egtable>tbody>tr.scenstats>td.scenstat:before{margin-bottom:var(--s1);display:block}}.reasons-none{font-size:var(--t-label);color:var(--sage)}.reasons-list{gap:var(--s-half);margin:0;padding:0;list-style:none;display:grid}.reasons-list li{border-radius:var(--r-ctl);background:linear-gradient(to right, color-mix(in srgb, var(--rust) 16%, transparent) var(--share), transparent var(--share))}.reason{align-items:baseline;gap:var(--s2);padding:3px var(--s2) 3px var(--s1);font-size:var(--t-label);color:var(--ink);border-radius:var(--r-ctl);grid-template-columns:2.5ch minmax(0,1fr);line-height:1.35;text-decoration:none;display:grid}.reason-n{text-align:right;font-variant-numeric:tabular-nums;color:var(--rust);font-weight:700}.reason-t{-webkit-line-clamp:2;line-clamp:2;overflow-wrap:anywhere;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.reason-note{color:var(--dim);font-size:var(--t-note)}a.reason:hover .reason-t,a.reason:focus-visible .reason-t{color:var(--amber);text-underline-offset:2px;text-decoration:underline}@media (pointer:coarse),(width<=600px){.reason{min-height:var(--tap);align-items:center}}.rrtable .thumb{background:0 0;border:0;padding:0}.rrtable .thumb img{border-radius:var(--r-ctl);max-width:96px;display:block}.rrtable .meta{font-size:var(--t-note);color:var(--dim);overflow-wrap:anywhere}.rritem{align-items:center;gap:var(--s2);margin-top:var(--s1);display:flex}.rritem .meta{flex:auto;min-width:0;margin-top:0}.rritem :is(.rrname,.rrcall){-webkit-line-clamp:2;line-clamp:2;overflow-wrap:anywhere;white-space:normal;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.rrloop{font-size:var(--t-note);color:var(--dim);font-variant-numeric:tabular-nums;flex:none}.rritem :is(.menu,.dt-chevron){flex:none}.verdict{text-transform:uppercase;font-weight:700;font-size:var(--t-label)}.verdict.pass{color:var(--sage)}.verdict.fail{color:var(--rust)}.verdict.skipped{color:var(--dim)}.eval-block{margin:0 0 var(--s2)}.eval-block+.eval-block{padding-top:var(--s2);border-top:1px solid var(--line)}.eval-head{align-items:baseline;column-gap:var(--s2);font-size:var(--t-label);flex-wrap:wrap;display:flex}.eval-group{color:var(--ink);overflow-wrap:anywhere;font-weight:600}.eval-head .metric-score{color:var(--dim);font-variant-numeric:tabular-nums}.eval-block ul{margin:var(--s1) 0 0;gap:var(--s1);padding:0;list-style:none;display:grid}.eval-block li{font-size:var(--t-label);color:var(--ink);overflow-wrap:anywhere;align-items:baseline;gap:6px;display:flex}.eval-block li>.mark{flex:none;align-self:flex-start;margin-top:3px}.eval-block li.nil{color:var(--dim)}.mark.nil{width:14px;color:var(--dim);justify-content:center;line-height:14px}.metric-line{gap:var(--s-half);min-width:0;display:grid}.reply-stopped{margin-top:var(--s1);font-size:var(--t-label);color:var(--rust)}.metric-reason{color:var(--dim)}.metric-reason.err{color:var(--rust)}.pct{font-variant-numeric:tabular-nums;margin-left:var(--s2);font-size:var(--t-label)}.reasons{font-size:var(--t-note);margin-top:var(--s1)}.reasons.fault{color:var(--rust)}.reasons.hit{color:var(--sage)}.chips{gap:var(--s1);margin-top:var(--s2);flex-wrap:wrap;display:flex}.term.no{text-decoration:line-through}.hit{color:var(--sage)}.fault{color:var(--rust)}.rrtable tr.rrdetail>td{padding-top:0}.rrtable tr.hasdetail>td{border-bottom:0}.rrdetail-panel{padding:var(--s3);background:var(--ground);position:relative}.transcript{gap:var(--s4);min-width:0;display:grid}.tx-block{gap:var(--s2);border-radius:var(--r-ctl);min-width:0;display:grid}.tx-head{font:600 var(--t-label) / 1.4 var(--sans);margin:0}.tx-call{gap:var(--s2);display:grid}.tx-call+.tx-call{padding-top:var(--s2);border-top:1px solid var(--line)}.tx-part{gap:var(--s1);min-width:0;display:grid}.tx-label{font-size:var(--t-caption);color:var(--dim);font-weight:600}.tx-part pre{font:var(--t-note) / 1.5 var(--mono);white-space:pre-wrap;overflow-wrap:anywhere;margin:0}.tx-part .tx-text.err{color:var(--rust)}.tx-part .tx-text,.tx-part .json-view{max-height:24rem;overflow:auto}.rrtable td>pre{white-space:pre-wrap;overflow-wrap:anywhere;max-width:100%}.dropped summary{cursor:pointer;font-size:var(--t-note);color:var(--dim)}.droppedrow{align-items:center;gap:var(--s2);margin-top:var(--s1);display:flex}.lightbox-img{border-radius:var(--r-ctl);max-width:100%;max-height:60vh;margin:0 auto;display:block}@media (width<=600px){.results{z-index:calc(var(--z-sticky) + 1);background:var(--ground);padding:var(--s3);margin:0;position:fixed;inset:0;overflow-y:auto}.rtabs{display:none}.rrback{min-width:var(--tap);min-height:var(--tap)}.rrcode{padding:0 var(--s2);border:1px solid var(--amber);border-radius:var(--r-ctl);min-height:32px;font-size:var(--t-body);color:var(--ink);align-items:center;display:inline-flex}.rrtable,.rrtable :is(thead,tbody,tr,th,td){display:block}.rrtable thead tr:first-child{display:none}.rrtable tbody tr{border:1px solid var(--line);border-radius:var(--r-pane);margin-bottom:var(--s2);padding:var(--s2) var(--s3)}.rrtable td{border:0;height:auto}.rrtable td[data-label]:before{content:attr(data-label);font-size:var(--t-note);color:var(--dim);margin-bottom:var(--s1);font-weight:600;display:block}.rrtable td[data-label][data-asked]:before{content:attr(data-label) ", " attr(data-asked)}.rrtable tr.reasons td{border-bottom:1px solid var(--line)}.rrtable tr.reasons td:last-of-type{border-bottom:0}.rrtable .thumb img{width:100%;max-width:none}.rrtable td[data-label=Expected]{border-top:1px solid var(--line)}.rrtable td.col-item{flex-direction:column;align-items:stretch;display:flex}.rrtable tbody tr.hasdetail{border-bottom:0;border-bottom-right-radius:0;border-bottom-left-radius:0;margin-bottom:0}.rrtable tbody tr.rrdetail{border-top:0;border-top-left-radius:0;border-top-right-radius:0}}.eval-block .watched{margin-top:var(--s1)}.eval-block .watched>b{font-size:var(--t-label);color:var(--dim);font-weight:600}.rrorigin{margin:0}.egtable.recorded tr.eg-metric>td.col-eg{font-weight:400}.egtable.recorded .eg-metric-name{color:var(--dim);padding-left:var(--s3)}.egtable.recorded tr.eg-group:not(:first-child)>td{border-top:1px solid var(--line)}@media (width<=600px){.egtable.recorded .eg-metric-name{padding-left:0}}.rrcall{flex:auto;min-width:0}.rec-compare{gap:var(--s4);grid-template-columns:repeat(var(--scenarios,2), minmax(0, 1fr));display:grid}.rec-side{gap:var(--s2);align-content:start;min-width:0;display:grid}.rec-side-title{font-size:var(--t-label);margin:0;font-weight:600}.rec-checks{gap:var(--s-half);margin:0;padding:0;list-style:none;display:grid}.rec-checks li{justify-content:space-between;align-items:center;gap:var(--s2);font-size:var(--t-label);display:flex}.rec-checks .eval-name{color:var(--ink);min-width:0}@media (width<=600px){.rec-compare{grid-template-columns:1fr}}@media (pointer:coarse),(width<=600px){.eval-block li:has(>.metric-line>.metric-open)>.mark{margin-top:calc((var(--tap) - 14px) / 2)}}@media print{:root{--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light}body{background:0 0}.app-head,.app-tabs,.results-bar,.menu,.undo-toast,.runview .fbar,.stop-btn,.rrtable .dt-chevron{display:none!important}.runview .scrollx{overflow:visible}.rrtable,.egtable{min-width:0}.runview tr{break-inside:avoid}.runview thead{display:table-header-group}.egtable tr.eg-overall>td{border-top:1px solid var(--line);background-color:#0000!important}}.app{max-width:1100px;padding:var(--s4);margin:0 auto;overflow-x:clip}.app .note a,.group-about a{color:var(--amber)}.app-head{align-items:center;gap:var(--s3);margin-bottom:var(--s3);flex-wrap:wrap;display:flex}.app-head h1{font-size:var(--t-title);flex:auto;margin:0;font-weight:600}.sync{align-items:center;gap:var(--s2);font-size:var(--t-label);flex-wrap:wrap;margin:0;display:flex}.sync>span:first-child{margin-right:auto}.sync.bad{color:var(--rust)}.ws-archived-bar{align-items:center;gap:var(--s2);margin-bottom:var(--s3);padding:var(--s2) var(--s3);background:var(--surface2);font-size:var(--t-label);color:var(--dim);flex-wrap:wrap;display:flex}.ws-archived-bar span{margin-right:auto}main[inert]{opacity:.5}.ws-gone{align-items:flex-start;gap:var(--s3);padding:var(--s4) 0;flex-direction:column;display:flex}.ws-gone p{color:var(--ink);margin:0}.ws-gone code{color:var(--dim)}@media (width<=600px){.app-head .sync{flex-basis:100%;order:1}.app{padding-inline:var(--s2)}}
|