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/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
- """Fetch now (#587): produce the Source's Call through the provider,
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) drops the `stage` version 2 (#405) gave it: a set belongs to no stage,
3704
- # and each filter's type decides where it runs, so a set linked before and after
3705
- # Read as runs its share in each. Version 1 named no stage either. A filter set
3706
- # is a Library row the lab stores and versions like an eval group (#336,
3707
- # FilterSets below); this and its twin are the body it keeps, held to
3708
- # evals-core.ts by proxy-check.py.
3709
- FILTER_SET_BODY_VERSION = 3
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 3): evals-core.ts's
3714
- upgradeFilterSetBody, in Python. A version-1 or -2 body loses any `stage`
3715
- and takes this version; a version-3 body, and anything that is not a body,
3716
- come back as they are. Pure."""
3717
- if isinstance(body, dict) and body.get("version") in (1, 2):
3718
- return {**{k: v for k, v in body.items() if k != "stage"}, "version": FILTER_SET_BODY_VERSION}
3719
- return body
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
- PIPELINE_VERSION = 18
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
- return self._json(201, {"run": QUEUE.submit(run, groups=groups, filter_sets=filter_sets or None,
9507
- produced=produced)})
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)}}