strata-notebook 0.11.0__py3-none-any.whl
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.
- strata/.agents/skills/strata-scratchpad/SKILL.md +163 -0
- strata/__init__.py +9 -0
- strata/__main__.py +6 -0
- strata/_frontend/assets/AppView-CfbAQfnj.css +1 -0
- strata/_frontend/assets/AppView-DEAuXdCg.js +2 -0
- strata/_frontend/assets/ArtifactsPage-BSeZIjwB.css +1 -0
- strata/_frontend/assets/ArtifactsPage-Ddzlj2Ug.js +1 -0
- strata/_frontend/assets/ConnectionsPanel--ExPjDi_.js +1 -0
- strata/_frontend/assets/ConnectionsPanel-ziUNjWNM.css +1 -0
- strata/_frontend/assets/DagView-0pJwy5rt.css +1 -0
- strata/_frontend/assets/DagView-CWI1mo2i.js +1 -0
- strata/_frontend/assets/DataTable-DSpStbJ9.css +1 -0
- strata/_frontend/assets/DataTable-Djt8YiVM.js +4 -0
- strata/_frontend/assets/EnvironmentPanel-CBzPxucv.js +10 -0
- strata/_frontend/assets/EnvironmentPanel-C_rW2Euc.css +1 -0
- strata/_frontend/assets/ImpactPreview-CextJi5p.js +1 -0
- strata/_frontend/assets/ImpactPreview-D7K4fufy.css +1 -0
- strata/_frontend/assets/InspectPanel-BLmhBTuZ.css +1 -0
- strata/_frontend/assets/InspectPanel-CiqV9sgV.js +1 -0
- strata/_frontend/assets/InspectSwapConfirm-CXY2-3SY.js +1 -0
- strata/_frontend/assets/InspectSwapConfirm-qbl06L3k.css +1 -0
- strata/_frontend/assets/LineageModal-BePHnwF6.js +1 -0
- strata/_frontend/assets/LineageModal-Dc4KaESb.css +1 -0
- strata/_frontend/assets/LogsPage-CT4yH6UY.css +1 -0
- strata/_frontend/assets/LogsPage-CXDPnOEx.js +1 -0
- strata/_frontend/assets/MountsPanel-BlMF6mf9.js +1 -0
- strata/_frontend/assets/MountsPanel-DZCbmxNs.css +1 -0
- strata/_frontend/assets/NotebookPage-BGceSq9e.js +22 -0
- strata/_frontend/assets/NotebookPage-CrbhmtIn.css +1 -0
- strata/_frontend/assets/NotesPanel-C8knXflq.js +3 -0
- strata/_frontend/assets/NotesPanel-D-d0v7Ap.css +1 -0
- strata/_frontend/assets/ProfilingPanel-C4A8X3sf.js +1 -0
- strata/_frontend/assets/ProfilingPanel-D5Mo6s1V.css +1 -0
- strata/_frontend/assets/ReadConfirm-ChlIAMJK.css +1 -0
- strata/_frontend/assets/ReadConfirm-gVY4VVB2.js +1 -0
- strata/_frontend/assets/RegistryPanel-BB_qisdn.js +1 -0
- strata/_frontend/assets/RegistryPanel-CXVIwXkw.css +1 -0
- strata/_frontend/assets/RuntimePanel-CboOb447.js +1 -0
- strata/_frontend/assets/RuntimePanel-D_bL2Oue.css +1 -0
- strata/_frontend/assets/SchemaPanel-BrMbPzNk.css +1 -0
- strata/_frontend/assets/SchemaPanel-CdfqheDK.js +1 -0
- strata/_frontend/assets/TestsPanel-BXQG4EN2.js +2 -0
- strata/_frontend/assets/TestsPanel-DKFAQ4dK.css +1 -0
- strata/_frontend/assets/WorkersPanel-2ib-AojW.js +1 -0
- strata/_frontend/assets/WorkersPanel-BV9QJrYn.css +1 -0
- strata/_frontend/assets/codemirror-vendor-JCYuYFv4.js +12 -0
- strata/_frontend/assets/dist-BYy0f13V.js +28 -0
- strata/_frontend/assets/index-C-zgQzKr.js +17 -0
- strata/_frontend/assets/index-DK8IHPfU.css +1 -0
- strata/_frontend/assets/refusal-Bl6E8RZG.js +1 -0
- strata/_frontend/favicon.svg +1 -0
- strata/_frontend/index.html +19 -0
- strata/_uv_runtime.py +50 -0
- strata/adaptive_concurrency.py +508 -0
- strata/api/__init__.py +1 -0
- strata/api/badge.py +98 -0
- strata/api/dependencies.py +426 -0
- strata/api/provenance_ld.py +364 -0
- strata/api/publication_bundle.py +385 -0
- strata/api/publication_page.py +550 -0
- strata/api/remote_registry.py +110 -0
- strata/api/routers/__init__.py +5 -0
- strata/api/routers/admin.py +365 -0
- strata/api/routers/artifacts.py +1470 -0
- strata/api/routers/builds.py +801 -0
- strata/api/routers/cache.py +376 -0
- strata/api/routers/debug.py +249 -0
- strata/api/routers/logs.py +83 -0
- strata/api/routers/materialize.py +751 -0
- strata/api/routers/metadata.py +64 -0
- strata/api/routers/metrics_health.py +832 -0
- strata/api/routers/names.py +471 -0
- strata/api/routers/publications.py +677 -0
- strata/api/routers/registry.py +217 -0
- strata/api/routers/streams.py +272 -0
- strata/api/served_bytes.py +33 -0
- strata/artifact/__init__.py +2 -0
- strata/artifact/blob_store.py +1169 -0
- strata/artifact/cli.py +1043 -0
- strata/artifact/provenance.py +81 -0
- strata/artifact/store.py +5109 -0
- strata/artifact/table_export.py +135 -0
- strata/artifact/transfer.py +495 -0
- strata/artifact/uris.py +46 -0
- strata/auth/__init__.py +2 -0
- strata/auth/api_key_cli.py +137 -0
- strata/auth/api_keys.py +310 -0
- strata/auth/principal.py +235 -0
- strata/auth/run_tokens.py +134 -0
- strata/cache/__init__.py +2 -0
- strata/cache/disk.py +720 -0
- strata/cache/metadata.py +919 -0
- strata/cache/metadata_store.py +569 -0
- strata/cache/metrics.py +193 -0
- strata/cache/stats.py +289 -0
- strata/cache/warmer.py +412 -0
- strata/cli.py +839 -0
- strata/config.py +1486 -0
- strata/executors.py +55 -0
- strata/fast_io.py +283 -0
- strata/fetcher.py +189 -0
- strata/file_modes.py +57 -0
- strata/filters.py +158 -0
- strata/iceberg/__init__.py +2 -0
- strata/iceberg/catalog.py +667 -0
- strata/iceberg/deletes.py +103 -0
- strata/iceberg/equality.py +363 -0
- strata/iceberg/lake_files.py +165 -0
- strata/iceberg/schema.py +363 -0
- strata/json_types.py +5 -0
- strata/migrate.py +291 -0
- strata/migrate_cli.py +104 -0
- strata/notebook/__init__.py +35 -0
- strata/notebook/agent_launch.py +461 -0
- strata/notebook/analyzer.py +632 -0
- strata/notebook/annotation_validation.py +1072 -0
- strata/notebook/annotations.py +691 -0
- strata/notebook/artifact_integration.py +397 -0
- strata/notebook/authorship.py +49 -0
- strata/notebook/cascade.py +132 -0
- strata/notebook/causality.py +238 -0
- strata/notebook/cell_test_conftest.py +167 -0
- strata/notebook/cell_test_runner.py +147 -0
- strata/notebook/cli.py +2073 -0
- strata/notebook/console_relay.py +193 -0
- strata/notebook/credentials.py +247 -0
- strata/notebook/dag.py +487 -0
- strata/notebook/datasets.py +328 -0
- strata/notebook/dependencies.py +1742 -0
- strata/notebook/display/__init__.py +9 -0
- strata/notebook/display/runtime.py +149 -0
- strata/notebook/env.py +364 -0
- strata/notebook/env_backend.py +258 -0
- strata/notebook/executor.py +8010 -0
- strata/notebook/export.py +1001 -0
- strata/notebook/fetch.py +455 -0
- strata/notebook/hardware.py +101 -0
- strata/notebook/harness.py +946 -0
- strata/notebook/harness_env.py +114 -0
- strata/notebook/harness_user.py +408 -0
- strata/notebook/immutability.py +469 -0
- strata/notebook/impact.py +115 -0
- strata/notebook/inspect_harness.py +209 -0
- strata/notebook/inspect_repl.py +228 -0
- strata/notebook/jupyter_import.py +1198 -0
- strata/notebook/languages/__init__.py +37 -0
- strata/notebook/languages/analyzer.py +191 -0
- strata/notebook/languages/executor.py +340 -0
- strata/notebook/languages/r/__init__.py +10 -0
- strata/notebook/languages/r/analyze_cell.R +215 -0
- strata/notebook/languages/r/analyzer.py +146 -0
- strata/notebook/languages/r/executor.py +57 -0
- strata/notebook/languages/r/harness.R +611 -0
- strata/notebook/languages/r/pool_worker.R +93 -0
- strata/notebook/layout.py +97 -0
- strata/notebook/lifeline.py +83 -0
- strata/notebook/llm/__init__.py +45 -0
- strata/notebook/llm/client.py +373 -0
- strata/notebook/llm/config.py +247 -0
- strata/notebook/llm/prompts.py +202 -0
- strata/notebook/llm/structured.py +170 -0
- strata/notebook/llm/usage.py +61 -0
- strata/notebook/mcp_server.py +1379 -0
- strata/notebook/models.py +1036 -0
- strata/notebook/module_export.py +528 -0
- strata/notebook/mount_cache.py +365 -0
- strata/notebook/mounts.py +939 -0
- strata/notebook/notebook_client.py +378 -0
- strata/notebook/ops.py +1410 -0
- strata/notebook/output_dirs.py +366 -0
- strata/notebook/output_file_relay.py +90 -0
- strata/notebook/parser.py +311 -0
- strata/notebook/pool.py +310 -0
- strata/notebook/pool_worker.py +425 -0
- strata/notebook/presence.py +122 -0
- strata/notebook/prewarm.py +121 -0
- strata/notebook/process_tree.py +129 -0
- strata/notebook/prompt_analyzer.py +156 -0
- strata/notebook/prompt_executor.py +705 -0
- strata/notebook/protocol.py +100 -0
- strata/notebook/provenance.py +111 -0
- strata/notebook/python_versions.py +175 -0
- strata/notebook/quiesce.py +135 -0
- strata/notebook/read_confirm.py +110 -0
- strata/notebook/reads_index.py +70 -0
- strata/notebook/remote_bundle.py +388 -0
- strata/notebook/remote_executor.py +1766 -0
- strata/notebook/remote_worker_supervisor.py +409 -0
- strata/notebook/routes.py +3771 -0
- strata/notebook/runtime_state.py +378 -0
- strata/notebook/scopes.py +221 -0
- strata/notebook/secret_manager/__init__.py +28 -0
- strata/notebook/secret_manager/infisical.py +151 -0
- strata/notebook/secret_manager/provider.py +61 -0
- strata/notebook/secret_manager/registry.py +37 -0
- strata/notebook/secret_manager/session_integration.py +127 -0
- strata/notebook/serializer.py +2007 -0
- strata/notebook/session.py +4060 -0
- strata/notebook/shared_env.py +594 -0
- strata/notebook/snapshot.py +381 -0
- strata/notebook/snapshot_import.py +602 -0
- strata/notebook/sql/__init__.py +42 -0
- strata/notebook/sql/adapter.py +192 -0
- strata/notebook/sql/analyzer.py +551 -0
- strata/notebook/sql/bind.py +77 -0
- strata/notebook/sql/cell_executor.py +1378 -0
- strata/notebook/sql/drivers/__init__.py +43 -0
- strata/notebook/sql/drivers/bigquery.py +445 -0
- strata/notebook/sql/drivers/duckdb.py +633 -0
- strata/notebook/sql/drivers/postgresql.py +433 -0
- strata/notebook/sql/drivers/snowflake.py +582 -0
- strata/notebook/sql/drivers/sqlite.py +407 -0
- strata/notebook/sql/lake.py +440 -0
- strata/notebook/sql/provenance.py +282 -0
- strata/notebook/sql/registry.py +48 -0
- strata/notebook/sql/time_travel.py +106 -0
- strata/notebook/ssh_worker.py +322 -0
- strata/notebook/ssh_worker_service.py +93 -0
- strata/notebook/table_index.py +85 -0
- strata/notebook/table_writes.py +205 -0
- strata/notebook/tables.py +152 -0
- strata/notebook/team_store.py +445 -0
- strata/notebook/timing.py +49 -0
- strata/notebook/tui/__init__.py +5 -0
- strata/notebook/tui/__main__.py +6 -0
- strata/notebook/tui/app.py +1116 -0
- strata/notebook/tui/cli.py +75 -0
- strata/notebook/tui/client.py +116 -0
- strata/notebook/tui/dag_render.py +405 -0
- strata/notebook/tui/viewmodel.py +318 -0
- strata/notebook/widget_analyzer.py +251 -0
- strata/notebook/widget_executor.py +96 -0
- strata/notebook/work_dir.py +47 -0
- strata/notebook/worker_connect.py +256 -0
- strata/notebook/worker_env.py +399 -0
- strata/notebook/worker_secrets.py +31 -0
- strata/notebook/workers.py +1197 -0
- strata/notebook/writer.py +1411 -0
- strata/notebook/ws.py +3721 -0
- strata/notebook/ws_payloads.py +564 -0
- strata/observability/__init__.py +2 -0
- strata/observability/gc_tracker.py +244 -0
- strata/observability/health.py +445 -0
- strata/observability/log_buffer.py +106 -0
- strata/observability/logging.py +467 -0
- strata/observability/memory_profiler.py +340 -0
- strata/observability/metrics.py +435 -0
- strata/observability/pool_metrics.py +267 -0
- strata/observability/slow_ops.py +329 -0
- strata/observability/tracing.py +218 -0
- strata/planner.py +763 -0
- strata/py.typed +0 -0
- strata/rate_limiter.py +334 -0
- strata/server.py +2015 -0
- strata/services/__init__.py +5 -0
- strata/services/artifact.py +318 -0
- strata/services/build.py +134 -0
- strata/services/materialize.py +277 -0
- strata/services/registry.py +123 -0
- strata/sql_backend.py +581 -0
- strata/streaming/__init__.py +18 -0
- strata/streaming/ownership.py +137 -0
- strata/streaming/qos.py +329 -0
- strata/streaming/registry.py +150 -0
- strata/streaming/scan_builds.py +488 -0
- strata/tenancy/__init__.py +2 -0
- strata/tenancy/registry.py +271 -0
- strata/tenancy/tenant.py +162 -0
- strata/timing.py +27 -0
- strata/transforms/__init__.py +64 -0
- strata/transforms/base.py +141 -0
- strata/transforms/build_metrics.py +594 -0
- strata/transforms/build_qos.py +516 -0
- strata/transforms/build_store.py +927 -0
- strata/transforms/duckdb_sql.py +82 -0
- strata/transforms/reference_executor.py +325 -0
- strata/transforms/registry.py +173 -0
- strata/transforms/runner.py +1006 -0
- strata/transforms/scan.py +102 -0
- strata/transforms/signed_urls.py +481 -0
- strata/types.py +931 -0
- strata/url_safety.py +281 -0
- strata_notebook-0.11.0.dist-info/METADATA +479 -0
- strata_notebook-0.11.0.dist-info/RECORD +287 -0
- strata_notebook-0.11.0.dist-info/WHEEL +4 -0
- strata_notebook-0.11.0.dist-info/entry_points.txt +6 -0
- strata_notebook-0.11.0.dist-info/licenses/LICENSE +201 -0
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: strata-scratchpad
|
|
3
|
+
description: Use a persistent, cached Strata notebook as a scratchpad for throwaway Python (quick computations, data exploration, sanity checks, inspecting a value) instead of writing temp scripts or running `python -c`. Triggers whenever you are about to run ad-hoc Python to compute, inspect, or explore, and the `strata` CLI is available.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Strata as your scratchpad
|
|
7
|
+
|
|
8
|
+
When you need to run throwaway Python (compute a number, inspect a dataframe,
|
|
9
|
+
sanity-check a function, explore some data), **put it in a Strata notebook cell
|
|
10
|
+
instead of a `/tmp` script or `python -c`.** A cell costs the same one call, but
|
|
11
|
+
unlike a scratch script it **persists, is inspectable, and caches**, so you
|
|
12
|
+
build on your own prior work instead of recomputing it.
|
|
13
|
+
|
|
14
|
+
This is a *stateful* scratchpad, not a stateless shell. Every cell and its
|
|
15
|
+
variables stay for the whole session; you can look back at them, reference them,
|
|
16
|
+
and edit-and-rerun them.
|
|
17
|
+
|
|
18
|
+
## Decision rule
|
|
19
|
+
|
|
20
|
+
> Any Python you'd run to check or compute something → a notebook cell via
|
|
21
|
+
> add-and-run, **not** `Bash: python -c` and **not** a temp `.py` file.
|
|
22
|
+
|
|
23
|
+
## Setup (once per project)
|
|
24
|
+
|
|
25
|
+
Create a scratchpad notebook if one doesn't exist yet, and gitignore it:
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
strata new scratch --parent . --no-env --project-mount # ./scratch/, project mounted as `project`
|
|
29
|
+
echo "scratch/" >> .gitignore # optional; it's your workspace
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
`--project-mount` mounts the project dir read-only as a `project` Path variable in
|
|
33
|
+
every cell, so you can read project files as `project / "file"` (see below).
|
|
34
|
+
|
|
35
|
+
If a `strata-notebook` **MCP server is connected** (you were launched via
|
|
36
|
+
`strata agent`, or `.mcp.json` registers one), prefer the MCP tools below:
|
|
37
|
+
your runs then appear **live in the human's terminal viewer**. Otherwise use the
|
|
38
|
+
`strata` CLI against the directory; a human can attach a viewer anytime with
|
|
39
|
+
`strata agent ./scratch`, which starts a server scoped to the scratchpad's
|
|
40
|
+
parent. (Plain `strata watch ./scratch` usually cannot open it: a server only
|
|
41
|
+
opens notebooks under its own storage root, and a scratchpad lives in the
|
|
42
|
+
project.)
|
|
43
|
+
|
|
44
|
+
**Once someone is watching, switch to the session they are watching.** A
|
|
45
|
+
path-based `strata … ./scratch` opens its own offline session, so its runs
|
|
46
|
+
never reach the viewer and two sessions write the same files. Use the MCP
|
|
47
|
+
tools, or add the live selectors to the same commands:
|
|
48
|
+
|
|
49
|
+
```bash
|
|
50
|
+
SID=$(curl -s http://127.0.0.1:8765/v1/notebooks/sessions | jq -r '.sessions[0].session_id')
|
|
51
|
+
strata cell add --server http://127.0.0.1:8765 --session "$SID" -c 'print(1 + 1)' --run
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
## Run a snippet (one call)
|
|
55
|
+
|
|
56
|
+
CLI (works anywhere, no server needed):
|
|
57
|
+
|
|
58
|
+
```bash
|
|
59
|
+
strata cell add ./scratch -c 'print(sum(range(6)) / 6)' --run
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
Returns JSON: the new cell (with its rendered `outputs`) plus a `run` block with
|
|
63
|
+
`status`, `cache_hit`, `stdout`, `stderr`. The first run of new code is always
|
|
64
|
+
cold (`cache_hit: false`); that's expected. **End a cell in a bare expression**
|
|
65
|
+
(e.g. a final line `df.describe()` or `total`) to get its value back in
|
|
66
|
+
`outputs`; you don't have to `print()` it. Use `print(...)` for free-form text.
|
|
67
|
+
|
|
68
|
+
MCP (when a session is connected, visible live in the viewer):
|
|
69
|
+
|
|
70
|
+
```
|
|
71
|
+
run_snippet(session_id, "print(sum(range(6)) / 6)")
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
**Third-party libraries:** a fresh scratchpad ships only the notebook runtime
|
|
75
|
+
(`pyarrow`, `orjson`, `cloudpickle`). Add anything else first, then use it:
|
|
76
|
+
|
|
77
|
+
```bash
|
|
78
|
+
strata dep add ./scratch numpy # or: add_dependency(session_id, "numpy")
|
|
79
|
+
strata cell add ./scratch -c 'import numpy as np; print(np.arange(6).mean())' --run
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
## Reading files from your project
|
|
83
|
+
|
|
84
|
+
A cell executes with its **working directory set to the notebook's `work/`**
|
|
85
|
+
(e.g. `./scratch/work`), **not** the directory you launched from, so a bare
|
|
86
|
+
`open("data.txt")` won't find a file in your project. If you created the
|
|
87
|
+
scratchpad with `--project-mount` (above), read project files through the
|
|
88
|
+
`project` Path variable, which points at the project root:
|
|
89
|
+
|
|
90
|
+
```bash
|
|
91
|
+
strata cell add ./scratch -c 'import json; print(len(json.load(open(project / "events.json"))))' --run
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
Without the mount, pass an **absolute path** instead (`open("/abs/path/events.json")`),
|
|
95
|
+
or add a per-cell `# @mount data /abs/path ro` (injects `data` as a `pathlib.Path`).
|
|
96
|
+
|
|
97
|
+
**Reading a file that is changing? Mark the cell `# @nocache`.** The `project`
|
|
98
|
+
mount is pinned, so editing a project file does not restale the cell that read
|
|
99
|
+
it. The cell replays the old contents and nothing says it is out of date.
|
|
100
|
+
That pin is why the mount is cheap, and it is the right default for files you
|
|
101
|
+
are not touching. A cell whose point is to observe a file you are editing needs
|
|
102
|
+
the annotation below, the same as a clock read.
|
|
103
|
+
|
|
104
|
+
## Looking at a plot
|
|
105
|
+
|
|
106
|
+
A plotting cell's output comes back as `image/png` with a size and no preview:
|
|
107
|
+
an image has no text form. To check what you drew, write it to a file and open
|
|
108
|
+
that file:
|
|
109
|
+
|
|
110
|
+
```bash
|
|
111
|
+
strata cell output ./scratch <cell_id> --out /tmp/plot.png
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
(MCP: `save_cell_output(session_id, cell_id)` returns the `path`.) Look at it
|
|
115
|
+
before telling the human what the chart shows.
|
|
116
|
+
|
|
117
|
+
## Look before you compute
|
|
118
|
+
|
|
119
|
+
Before recomputing something, check what the scratchpad already holds:
|
|
120
|
+
|
|
121
|
+
```bash
|
|
122
|
+
strata status ./scratch # cells, their variables, staleness
|
|
123
|
+
strata cell show ./scratch --var df # the cell that defines `df`, or, if it's not
|
|
124
|
+
# defined, the list of variables that ARE
|
|
125
|
+
strata cell show ./scratch <cell_id> # a specific cell's source + output + console
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
(MCP: `get_variable(session_id, "df")`.) If a variable you need already exists,
|
|
129
|
+
**reference it in a new cell** rather than recomputing it: the DAG wires the
|
|
130
|
+
dependency and the upstream stays cached.
|
|
131
|
+
|
|
132
|
+
## The caching payoff: how to get it
|
|
133
|
+
|
|
134
|
+
- **Put an expensive step in its own cell whose result a later cell consumes.**
|
|
135
|
+
That result is cached by provenance across the whole session: iterate on the
|
|
136
|
+
downstream cell all you like, the expensive upstream is a cache hit and never
|
|
137
|
+
re-executes. (This is the point: don't recompute the slow thing.)
|
|
138
|
+
- **To change a result, edit its cell and re-run** (`strata cell edit … && strata
|
|
139
|
+
cell run …`, or `edit_cell` + `run_cell`). Only that cell and what's downstream
|
|
140
|
+
recompute; everything upstream stays cached.
|
|
141
|
+
- **Prefer editing an existing cell over adding a new identical one.** A leaf
|
|
142
|
+
cell that only prints replays its cached output on an *unchanged same-cell*
|
|
143
|
+
re-run; re-adding the same snippet as a new cell runs cold.
|
|
144
|
+
|
|
145
|
+
## The one exception: side effects and fresh values
|
|
146
|
+
|
|
147
|
+
A cell whose point is a **side effect** (writing a file, calling an API, mutating
|
|
148
|
+
external state) or a **fresh value** (the clock, `random`, a live endpoint) must
|
|
149
|
+
not replay a cached result. Put `# @nocache` on its first line so it always
|
|
150
|
+
re-executes:
|
|
151
|
+
|
|
152
|
+
```bash
|
|
153
|
+
strata cell add ./scratch -c '# @nocache
|
|
154
|
+
import time; print(time.time())' --run
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
## Don'ts
|
|
158
|
+
|
|
159
|
+
- Don't fall back to `python -c` / temp scripts for exploration; that work is
|
|
160
|
+
invisible, uncached, and thrown away.
|
|
161
|
+
- Don't delete a diagnostic cell just because it "finished". Leave it; an
|
|
162
|
+
unchanged re-run is instant, and the human can see it.
|
|
163
|
+
- Don't read `./scratch/.strata/` directly: it's machine-managed runtime state.
|
strata/__init__.py
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
"""Strata: a materialization and persistence layer for expensive computations.
|
|
2
|
+
|
|
3
|
+
This is the ``strata-notebook`` distribution: the server, the notebook and the CLI.
|
|
4
|
+
The HTTP client is the separate ``strata-client`` package (``strata_client``); the
|
|
5
|
+
two share only the JSON wire protocol, not code.
|
|
6
|
+
|
|
7
|
+
Import from the submodules (``strata.filters``, ``strata.config``, ...); the
|
|
8
|
+
package root exports nothing, so importing any submodule loads only what it uses.
|
|
9
|
+
"""
|
strata/__main__.py
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.app-view[data-v-40cd80f5]{max-width:900px;margin:0 auto;padding:24px 20px 64px}.app-view.embed[data-v-40cd80f5]{background:0 0;max-width:none;padding:12px 14px}.app-header[data-v-40cd80f5]{border-bottom:1px solid var(--border);justify-content:space-between;align-items:baseline;margin-bottom:24px;padding-bottom:12px;display:flex}.app-header h1[data-v-40cd80f5]{color:var(--text-primary);font-size:22px;font-weight:700}.edit-link[data-v-40cd80f5]{color:var(--text-muted);font-size:13px;text-decoration:none}.edit-link[data-v-40cd80f5]:hover{color:var(--accent-primary)}.app-status[data-v-40cd80f5]{color:var(--text-muted);text-align:center;padding:40px 0}.app-status.error[data-v-40cd80f5]{color:var(--accent-danger)}.app-cell[data-v-40cd80f5]{margin-bottom:28px}.app-cell-title[data-v-40cd80f5]{color:var(--text-primary);margin-bottom:10px;font-size:15px;font-weight:600}.app-image[data-v-40cd80f5]{max-width:100%;display:block}.app-scalar[data-v-40cd80f5]{color:var(--text-primary);white-space:pre-wrap;font-family:JetBrains Mono,Fira Code,monospace;font-size:13px}.app-markdown[data-v-40cd80f5]{color:var(--text-primary);line-height:1.6}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{A as e,B as t,D as n,E as r,F as i,J as a,K as o,L as s,M as c,O as l,P as u,R as d,U as f,V as p,Y as m,Z as h,g,i as _,j as v,k as y,m as b,w as x,z as S}from"./index-C-zgQzKr.js";import{n as C,r as w,t as T}from"./DataTable-Djt8YiVM.js";var E={key:0,class:`app-header`},D={key:1,class:`app-status`},O={key:2,class:`app-status error`},k={key:3,class:`app-status`},A={key:4,class:`app-body`},j={key:0,class:`app-cell-title`},M=[`innerHTML`],N=[`src`],P=[`innerHTML`],F={key:3,class:`app-scalar`},I=g(u({__name:`AppView`,props:{sessionId:{}},setup(u){let g=u,{notebook:I,orderedCells:L,openBySessionId:R,cleanupWebSocket:z,setViewerMode:B}=w(),V=o(!0),H=o(null),U=b(),W=r(()=>U.query.embed===`1`),G=o(null),K=null;function q(){if(!W.value||window.parent===window)return;let e=Math.ceil(G.value?.scrollHeight??document.body.scrollHeight);window.parent.postMessage({type:`strata:embed:resize`,sessionId:g.sessionId,height:e},`*`)}s(async()=>{z(),B(!0);try{await R(g.sessionId)}catch(e){H.value=e.message||`Failed to open notebook`}finally{V.value=!1}W.value&&(await i(),K=new ResizeObserver(()=>q()),G.value&&K.observe(G.value),q())}),d(()=>{B(!1),z(),K?.disconnect()});let J=r(()=>I.name||`Notebook`);function Y(e){return e.split(`
|
|
2
|
+
`).some(e=>/^#\s*@app\s+hide\b/.test(e.trim()))}let X=r(()=>L.value.filter(e=>!Y(e.source)&&(e.language===`widget`||e.language===`markdown`||e.displayOutputs&&e.displayOutputs.length>0)));function Z(e){return e.annotations?.name||``}function Q(e){let t=e.columns??[];return(e.rows??[]).map(e=>t.map(t=>e[t]))}return(r,i)=>{let o=p(`router-link`);return S(),e(`div`,{ref_key:`rootEl`,ref:G,class:m([`app-view`,{embed:W.value}])},[W.value?y(``,!0):(S(),e(`header`,E,[n(`h1`,null,h(J.value),1),c(o,{class:`edit-link`,to:`/notebook/${u.sessionId}`},{default:f(()=>[...i[0]||=[v(`← Edit`,-1)]]),_:1},8,[`to`])])),V.value?(S(),e(`div`,D,`Loading…`)):H.value?(S(),e(`div`,O,h(H.value),1)):X.value.length?(S(),e(`div`,A,[(S(!0),e(x,null,t(X.value,n=>(S(),e(`section`,{key:n.id,class:`app-cell`},[Z(n)?(S(),e(`h2`,j,h(Z(n)),1)):y(``,!0),n.language===`widget`?(S(),l(C,{key:1,cell:n},null,8,[`cell`])):n.language===`markdown`?(S(),e(`div`,{key:2,class:`app-markdown`,innerHTML:a(_)(n.source)},null,8,M)):(S(!0),e(x,{key:3},t(n.displayOutputs||[],(t,r)=>(S(),e(`div`,{key:r,class:`app-output`},[t.contentType===`arrow/ipc`&&t.columns?.length?(S(),l(T,{key:0,"notebook-id":u.sessionId,"cell-id":n.id,"artifact-uri":t.artifactUri||``,columns:t.columns,"preview-rows":Q(t),total:t.rowCount??t.rows?.length??0},null,8,[`notebook-id`,`cell-id`,`artifact-uri`,`columns`,`preview-rows`,`total`])):t.contentType===`image/png`&&t.inlineDataUrl?(S(),e(`img`,{key:1,src:t.inlineDataUrl,alt:`output`,class:`app-image`},null,8,N)):t.contentType===`text/markdown`&&t.markdownText?(S(),e(`div`,{key:2,class:`app-markdown`,innerHTML:a(_)(t.markdownText)},null,8,P)):t.scalar===void 0?y(``,!0):(S(),e(`pre`,F,h(t.scalar),1))]))),128))]))),128))])):(S(),e(`div`,k,` This notebook has no widgets or outputs to display yet. `))],2)}}}),[[`__scopeId`,`data-v-40cd80f5`]]);export{I as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.artifacts[data-v-0c8efcbb]{flex-direction:column;gap:12px;height:100vh;padding:16px 24px;display:flex}.artifacts-header[data-v-0c8efcbb]{justify-content:space-between;align-items:center;display:flex}.artifacts-title[data-v-0c8efcbb]{align-items:baseline;gap:8px;display:flex}.artifacts-header-actions[data-v-0c8efcbb]{align-items:center;gap:12px;display:flex}.back-link[data-v-0c8efcbb]{color:var(--accent-primary);font-size:20px;font-weight:700;text-decoration:none}.crumb[data-v-0c8efcbb]{color:var(--text-muted)}.page-name[data-v-0c8efcbb]{color:var(--text-muted);font-size:20px;font-weight:300}.nav-link[data-v-0c8efcbb]{color:var(--text-secondary);border:1px solid var(--border);border-radius:6px;padding:4px 10px;font-size:13px;text-decoration:none}.back-btn[data-v-0c8efcbb]{cursor:pointer;background:0 0;font-family:inherit;line-height:1.4}.nav-link[data-v-0c8efcbb]:hover{color:var(--text-primary);border-color:var(--border-strong)}.stat-strip[data-v-0c8efcbb]{flex-wrap:wrap;gap:12px;display:flex}.stat-card[data-v-0c8efcbb]{background:var(--bg-surface);border:1px solid var(--border);border-radius:8px;flex-direction:column;gap:2px;min-width:90px;padding:10px 16px;display:flex}.stat-value[data-v-0c8efcbb]{color:var(--text-primary);font-size:20px;font-weight:700}.stat-value.ready[data-v-0c8efcbb]{color:var(--accent-primary)}.stat-value.building[data-v-0c8efcbb]{color:var(--accent-warning)}.stat-value.failed[data-v-0c8efcbb]{color:var(--accent-danger)}.stat-label[data-v-0c8efcbb]{text-transform:uppercase;letter-spacing:.04em;color:var(--text-muted);font-size:11px}.filter-bar[data-v-0c8efcbb]{flex-wrap:wrap;align-items:flex-end;gap:12px;display:flex}.filter[data-v-0c8efcbb]{color:var(--text-secondary);flex-direction:column;gap:4px;font-size:11px;display:flex}.filter-grow[data-v-0c8efcbb]{flex:1;min-width:180px}.control[data-v-0c8efcbb]{background:var(--bg-input);border:1px solid var(--border-strong);color:var(--text-primary);border-radius:6px;padding:6px 10px;font-size:13px}.btn[data-v-0c8efcbb]{border:1px solid var(--accent-primary);background:var(--accent-primary);color:var(--bg-base,#fff);cursor:pointer;border-radius:6px;padding:7px 14px;font-size:13px}.btn[data-v-0c8efcbb]:disabled{opacity:.5;cursor:default}.btn-secondary[data-v-0c8efcbb]{color:var(--text-secondary);border-color:var(--border-strong);background:0 0}.banner[data-v-0c8efcbb]{border-radius:6px;padding:8px 12px;font-size:13px}.banner-info[data-v-0c8efcbb]{background:var(--tint-info);border:1px solid var(--border-subtle);color:var(--text-secondary)}.banner-error[data-v-0c8efcbb]{background:var(--tint-danger);border:1px solid var(--accent-danger);color:var(--accent-danger)}.table-wrap[data-v-0c8efcbb]{border:1px solid var(--border);background:var(--bg-surface);border-radius:8px;flex:1;overflow-y:auto}.artifact-table[data-v-0c8efcbb]{border-collapse:collapse;width:100%;font-size:13px}.artifact-table th[data-v-0c8efcbb]{background:var(--bg-elevated);text-align:left;text-transform:uppercase;letter-spacing:.04em;color:var(--text-muted);border-bottom:1px solid var(--border);white-space:nowrap;padding:8px 12px;font-size:11px;position:sticky;top:0}.artifact-table th.sortable[data-v-0c8efcbb]{cursor:pointer;-webkit-user-select:none;user-select:none}.artifact-table th.sortable[data-v-0c8efcbb]:hover{color:var(--text-primary)}.sort-ind[data-v-0c8efcbb]{color:var(--accent-primary);font-size:10px}.artifact-table td[data-v-0c8efcbb]{border-bottom:1px solid var(--border);color:var(--text-primary);padding:6px 12px}.artifact-table tr:hover td[data-v-0c8efcbb]{background:var(--bg-hover)}.num[data-v-0c8efcbb]{text-align:right;font-variant-numeric:tabular-nums}.mono[data-v-0c8efcbb]{color:var(--text-secondary);font-family:JetBrains Mono,Fira Code,monospace}.empty[data-v-0c8efcbb]{text-align:center;color:var(--text-muted);padding:24px}.state-pill[data-v-0c8efcbb]{border-radius:999px;padding:2px 8px;font-size:11px;font-weight:600}.state-ready[data-v-0c8efcbb]{background:var(--tint-primary);color:var(--accent-primary)}.state-building[data-v-0c8efcbb]{background:var(--tint-warning,var(--bg-input));color:var(--accent-warning)}.state-failed[data-v-0c8efcbb]{background:var(--tint-danger);color:var(--accent-danger)}.state-superseded[data-v-0c8efcbb]{background:var(--bg-input);color:var(--text-muted)}.pager[data-v-0c8efcbb]{justify-content:center;align-items:center;gap:16px;display:flex}.page-info[data-v-0c8efcbb]{color:var(--text-muted);font-variant-numeric:tabular-nums;font-size:12px}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{A as e,B as t,D as n,E as r,H as i,K as a,L as ee,M as o,P as te,U as s,V as ne,W as c,Y as re,Z as l,b as ie,g as u,h as ae,j as d,k as f,n as oe,u as se,w as p,y as ce,z as m}from"./index-C-zgQzKr.js";import{t as le}from"./refusal-Bl6E8RZG.js";var ue={class:`artifacts`,"data-testid":`artifacts-page`},de={class:`artifacts-header`},fe={class:`artifacts-title`},pe={class:`artifacts-header-actions`},me={key:0,class:`stat-strip`,"data-testid":`artifact-stats`},he={class:`stat-card`},ge={class:`stat-value`},_e={class:`stat-card`},ve={class:`stat-value`},ye={class:`stat-card`},be={class:`stat-value ready`},xe={class:`stat-card`},h={class:`stat-value building`},g={class:`stat-card`},_={class:`stat-value`},v={class:`stat-card`},y={class:`stat-value failed`},b={class:`stat-card`},x={class:`stat-value`},S={class:`stat-card`},C={class:`stat-value`},w={key:1,class:`banner banner-info`,"data-testid":`artifacts-list-unavailable`},T={key:2,class:`filter-bar`},E={class:`filter`},D=[`value`],O={class:`filter filter-grow`},k=[`disabled`],A={key:3,class:`banner banner-error`,"data-testid":`artifacts-error`},j={key:4,class:`table-wrap`},M={class:`artifact-table`,"data-testid":`artifacts-table`},Se={class:`sort-ind`},Ce={class:`sort-ind`},we={class:`sort-ind`},Te={key:0},Ee=[`data-testid`],De=[`title`],Oe={class:`num`},ke={class:`num`},N={class:`num`},Ae={key:5,class:`pager`},je=[`disabled`],Me={class:`page-info`},Ne=[`disabled`],P=100,F=u(te({__name:`ArtifactsPage`,setup(te){let u=ae();function F(){window.history.length>1?u.back():u.push(`/`)}let I=se(),Pe=[``,`ready`,`building`,`superseded`,`failed`],L=a(null),R=a([]),z=a(!1),B=a(null),V=a(!1),H=a(``),U=a(``),W=a(`created_at`),G=a(`desc`),K=a(0);function q(e){if(e==null)return`n/a`;if(e<1024)return`${e} B`;let t=[`KB`,`MB`,`GB`,`TB`],n=e/1024,r=0;for(;n>=1024&&r<t.length-1;)n/=1024,r+=1;return`${n.toFixed(n>=10?0:1)} ${t[r]}`}function Fe(e){return e==null?`n/a`:e.toLocaleString()}function Ie(e){return e==null?`n/a`:new Date(e*1e3).toLocaleString()}async function Le(){try{L.value=await I.getArtifactStats()}catch{L.value=null}}async function J(){z.value=!0,B.value=null;try{let e=await I.getArtifacts({limit:P,offset:K.value,state:H.value||void 0,namePrefix:U.value.trim()||void 0,sort:W.value,order:G.value});R.value=e.artifacts}catch(e){R.value=[],le(e)===`writes_disabled`?V.value=!0:B.value=e?.message||`Failed to fetch artifacts`}finally{z.value=!1}}function Y(){Le(),J()}function X(e){W.value===e?G.value=G.value===`asc`?`desc`:`asc`:(W.value=e,G.value=`desc`)}function Z(e){return W.value===e?G.value===`asc`?`▲`:`▼`:``}function Re(e){return e.length>20?`${e.slice(0,17)}…`:e}let Q=r(()=>K.value>0),$=r(()=>R.value.length===P);function ze(){Q.value&&(K.value=Math.max(0,K.value-P))}function Be(){$.value&&(K.value+=P)}return i([H,U,W,G],()=>{K.value===0?J():K.value=0}),i(K,()=>{J()}),ee(()=>{Y()}),(r,i)=>{let a=ne(`router-link`);return m(),e(`div`,ue,[n(`div`,de,[n(`div`,fe,[n(`button`,{type:`button`,class:`nav-link back-btn`,"data-testid":`page-back`,onClick:F},` ← Back `),o(a,{to:`/`,class:`back-link`,title:`Back to notebooks`},{default:s(()=>[...i[5]||=[d(`◆ strata`,-1)]]),_:1}),i[6]||=n(`span`,{class:`crumb`},`/`,-1),i[7]||=n(`span`,{class:`page-name`},`artifacts`,-1)]),n(`div`,pe,[o(a,{to:`/logs`,class:`nav-link`,"data-testid":`nav-logs`},{default:s(()=>[...i[8]||=[d(`Logs`,-1)]]),_:1}),o(oe)])]),L.value?(m(),e(`div`,me,[n(`div`,he,[n(`span`,ge,l(L.value.total_versions.toLocaleString()),1),i[9]||=n(`span`,{class:`stat-label`},`versions`,-1)]),n(`div`,_e,[n(`span`,ve,l(L.value.name_count.toLocaleString()),1),i[10]||=n(`span`,{class:`stat-label`},`names`,-1)]),n(`div`,ye,[n(`span`,be,l(L.value.ready_versions.toLocaleString()),1),i[11]||=n(`span`,{class:`stat-label`},`ready`,-1)]),n(`div`,xe,[n(`span`,h,l(L.value.building_versions.toLocaleString()),1),i[12]||=n(`span`,{class:`stat-label`},`building`,-1)]),n(`div`,g,[n(`span`,_,l(L.value.superseded_versions.toLocaleString()),1),i[13]||=n(`span`,{class:`stat-label`},`superseded`,-1)]),n(`div`,v,[n(`span`,y,l(L.value.failed_versions.toLocaleString()),1),i[14]||=n(`span`,{class:`stat-label`},`failed`,-1)]),n(`div`,b,[n(`span`,x,l(q(L.value.total_bytes)),1),i[15]||=n(`span`,{class:`stat-label`},`total size`,-1)]),n(`div`,S,[n(`span`,C,l(L.value.total_rows.toLocaleString()),1),i[16]||=n(`span`,{class:`stat-label`},`total rows`,-1)])])):f(``,!0),V.value?(m(),e(`div`,w,` This server is shared, so it does not list artifact versions one by one. The totals above are your team's. `)):f(``,!0),V.value?f(``,!0):(m(),e(`div`,T,[n(`label`,E,[i[17]||=d(` State `,-1),c(n(`select`,{"onUpdate:modelValue":i[0]||=e=>H.value=e,class:`control`,"data-testid":`artifacts-state`},[(m(),e(p,null,t(Pe,e=>n(`option`,{key:e,value:e},l(e||`all`),9,D)),64))],512),[[ce,H.value]])]),n(`label`,O,[i[18]||=d(` Name prefix `,-1),c(n(`input`,{"onUpdate:modelValue":i[1]||=e=>U.value=e,class:`control`,type:`text`,placeholder:`filter by name prefix`,"data-testid":`artifacts-name-prefix`},null,512),[[ie,U.value]])]),n(`button`,{class:`btn`,disabled:z.value,"data-testid":`artifacts-refresh`,onClick:Y},` Refresh `,8,k)])),B.value?(m(),e(`div`,A,l(B.value),1)):f(``,!0),V.value?f(``,!0):(m(),e(`div`,j,[n(`table`,M,[n(`thead`,null,[n(`tr`,null,[i[22]||=n(`th`,null,`Artifact ID`,-1),i[23]||=n(`th`,null,`Ver`,-1),i[24]||=n(`th`,null,`State`,-1),n(`th`,{class:`sortable num`,onClick:i[2]||=e=>X(`row_count`)},[i[19]||=d(` Rows `,-1),n(`span`,Se,l(Z(`row_count`)),1)]),n(`th`,{class:`sortable num`,onClick:i[3]||=e=>X(`byte_size`)},[i[20]||=d(` Size `,-1),n(`span`,Ce,l(Z(`byte_size`)),1)]),n(`th`,{class:`sortable`,onClick:i[4]||=e=>X(`created_at`)},[i[21]||=d(` Created `,-1),n(`span`,we,l(Z(`created_at`)),1)])])]),n(`tbody`,null,[!R.value.length&&!z.value?(m(),e(`tr`,Te,[...i[25]||=[n(`td`,{colspan:`6`,class:`empty`},`No artifacts match these filters.`,-1)]])):f(``,!0),(m(!0),e(p,null,t(R.value,t=>(m(),e(`tr`,{key:t.artifact_uri,"data-testid":`artifact-row-${t.artifact_id}-${t.version}`},[n(`td`,{class:`mono`,title:t.artifact_id},l(Re(t.artifact_id)),9,De),n(`td`,Oe,l(t.version),1),n(`td`,null,[n(`span`,{class:re([`state-pill`,`state-${t.state}`])},l(t.state),3)]),n(`td`,ke,l(Fe(t.row_count)),1),n(`td`,N,l(q(t.byte_size)),1),n(`td`,null,l(Ie(t.created_at)),1)],8,Ee))),128))])])])),V.value?f(``,!0):(m(),e(`div`,Ae,[n(`button`,{class:`btn btn-secondary`,disabled:!Q.value,"data-testid":`artifacts-prev`,onClick:ze},` ‹ Prev `,8,je),n(`span`,Me,`rows `+l(K.value+1)+`–`+l(K.value+R.value.length),1),n(`button`,{class:`btn btn-secondary`,disabled:!$.value,"data-testid":`artifacts-next`,onClick:Be},` Next › `,8,Ne)]))])}}}),[[`__scopeId`,`data-v-0c8efcbb`]]);export{F as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{A as e,B as t,D as n,E as r,H as i,J as a,K as o,M as s,P as c,W as l,Y as u,Z as d,b as f,g as p,j as m,k as h,w as g,y as ee,z as _}from"./index-C-zgQzKr.js";import{r as v}from"./DataTable-Djt8YiVM.js";function y(e){return e==null?!0:Array.isArray(e)?e.length===0:typeof e==`object`&&Object.keys(e).length===0}function te(e,t){let n={};for(let[r,i]of Object.entries(e))t.has(r)||y(i)||(n[r]=i);return n}var ne={class:`conn-editor`},re={key:0,class:`conn-empty`},ie={class:`conn-row-header`},ae=[`onUpdate:modelValue`,`disabled`],oe=[`onUpdate:modelValue`,`disabled`],se=[`value`],ce=[`value`],le=[`disabled`,`onClick`],ue={key:0,class:`conn-driver-hint`},de={key:1,class:`conn-extras-hint`},fe={class:`conn-fields`},b={key:0,class:`conn-field`},x=[`onUpdate:modelValue`,`disabled`],S={key:1,class:`conn-field`},C=[`onUpdate:modelValue`,`disabled`],w={class:`conn-field`},T=[`onUpdate:modelValue`,`disabled`],E={class:`conn-field-row`},D={class:`conn-field`},O=[`onUpdate:modelValue`,`disabled`],k={class:`conn-field`},A=[`onUpdate:modelValue`,`disabled`],j={key:0,class:`conn-secret-hint`},M={class:`conn-field-row`},N={class:`conn-field`},P=[`onUpdate:modelValue`,`disabled`],F={class:`conn-field`},I=[`onUpdate:modelValue`,`disabled`],L={class:`conn-field-row`},R={class:`conn-field`},z=[`onUpdate:modelValue`,`disabled`],B={class:`conn-field`},V=[`onUpdate:modelValue`,`disabled`],pe={class:`conn-field-row`},me={class:`conn-field`},he=[`onUpdate:modelValue`,`disabled`],ge={class:`conn-field`},_e=[`onUpdate:modelValue`,`disabled`],ve={class:`conn-field-row`},ye={class:`conn-field`},be=[`onUpdate:modelValue`,`disabled`],xe={class:`conn-field`},Se=[`onUpdate:modelValue`,`disabled`],Ce={class:`conn-field-row`},we={class:`conn-field`},Te=[`onUpdate:modelValue`,`disabled`],Ee={class:`conn-field`},De=[`onUpdate:modelValue`,`disabled`],H={key:0,class:`conn-secret-hint`},Oe={class:`conn-field`},ke=[`onUpdate:modelValue`,`disabled`],Ae={class:`conn-field-row`},je={class:`conn-field`},Me=[`onUpdate:modelValue`,`disabled`],Ne={class:`conn-field`},Pe=[`onUpdate:modelValue`,`disabled`],Fe={class:`conn-field`},Ie=[`onUpdate:modelValue`,`disabled`],Le={class:`conn-field`},Re=[`onUpdate:modelValue`,`disabled`],ze={class:`conn-field`},Be=[`onUpdate:modelValue`,`disabled`],Ve={class:`conn-field`},He=[`onUpdate:modelValue`,`disabled`],Ue={key:2,class:`conn-error`},We={class:`conn-actions`},Ge=[`disabled`],Ke={class:`conn-actions-right`},qe=[`disabled`],Je=[`disabled`],Ye={key:1,class:`conn-error`},U=p(c({__name:`ConnectionListEditor`,props:{connections:{},readOnly:{type:Boolean,default:!1}},emits:[`save`],setup(a,{emit:s}){let c=a,p=s,v=new Set([`name`,`driver`,`path`,`uri`,`auth`,`role`,`search_path`,`account`,`warehouse`,`database`,`schema`,`write_role`,`project_id`,`dataset_id`,`credentials_path`,`write_credentials_path`]),y=[{value:`duckdb`,label:`DuckDB`},{value:`sqlite`,label:`SQLite`},{value:`postgresql`,label:`PostgreSQL`},{value:`snowflake`,label:`Snowflake`},{value:`bigquery`,label:`BigQuery`}],U=new Set(y.map(e=>e.value)),W=o([]),G=0,K=o(!1),q=o(null),J=o({});function Y(e){let{user:t=``,password:n=``,...r}=e?.auth??{},i=e?te(e,v):{},a=e??{};return{_key:`conn-${G++}`,name:e?.name??``,driver:e?.driver??`sqlite`,path:typeof e?.path==`string`?e.path:``,uri:typeof e?.uri==`string`?e.uri:``,authUser:t,authPassword:n,role:typeof e?.role==`string`?e.role:``,searchPath:typeof e?.search_path==`string`?e.search_path:``,account:typeof a.account==`string`?a.account:``,warehouse:typeof a.warehouse==`string`?a.warehouse:``,database:typeof a.database==`string`?a.database:``,schema:typeof a.schema==`string`?a.schema:``,writeRole:typeof a.write_role==`string`?a.write_role:``,projectId:typeof a.project_id==`string`?a.project_id:``,datasetId:typeof a.dataset_id==`string`?a.dataset_id:``,credentialsPath:typeof a.credentials_path==`string`?a.credentials_path:``,writeCredentialsPath:typeof a.write_credentials_path==`string`?a.write_credentials_path:``,extras:i,extraAuth:r}}i(()=>c.connections,e=>{W.value=e.map(e=>Y(e))},{immediate:!0,deep:!0});let X=r(()=>JSON.stringify(c.connections.map(e=>Y(e)).map(Z))!==JSON.stringify(W.value.map(Z)));function Z(e){let{_key:t,...n}=e;return n}function Xe(){W.value.push(Y())}function Ze(e){W.value.splice(e,1)}function Qe(){let e={},t=new Set;for(let n of W.value)n.name.trim()?t.has(n.name)?e[n._key]=`Duplicate name: ${n.name}`:(t.add(n.name),n.driver===`sqlite`?!n.path.trim()&&!n.uri.trim()&&(e[n._key]=`SQLite needs either a path or a URI`):n.driver===`duckdb`?n.path.trim()||(e[n._key]=`DuckDB needs a path (a database file, or :memory:)`):n.driver===`postgresql`?n.uri.trim()||(e[n._key]=`PostgreSQL needs a connection URI`):n.driver===`snowflake`?!n.uri.trim()&&!n.account.trim()&&(e[n._key]=`Snowflake needs either an account identifier or a full URI`):n.driver===`bigquery`&&(n.projectId.trim()||(e[n._key]=`BigQuery needs a project ID`))):e[n._key]=`Connection name is required`;return J.value=e,Object.keys(e).length===0}function $e(e){let t={...e.extras,name:e.name.trim(),driver:e.driver};if(e.driver===`sqlite`)e.path.trim()?t.path=e.path.trim():delete t.path,e.uri.trim()?t.uri=e.uri.trim():delete t.uri;else if(e.driver===`duckdb`)e.path.trim()?t.path=e.path.trim():delete t.path;else if(e.driver===`postgresql`){e.uri.trim()?t.uri=e.uri.trim():delete t.uri,e.path.trim()?t.path=e.path.trim():delete t.path;let n={...e.extraAuth};e.authUser.trim()&&(n.user=e.authUser.trim()),e.authPassword.trim()&&(n.password=e.authPassword.trim()),Object.keys(n).length?t.auth=n:delete t.auth,e.role.trim()?t.role=e.role.trim():delete t.role,e.searchPath.trim()?t.search_path=e.searchPath.trim():delete t.search_path}else if(e.driver===`bigquery`)e.projectId.trim()?t.project_id=e.projectId.trim():delete t.project_id,e.datasetId.trim()?t.dataset_id=e.datasetId.trim():delete t.dataset_id,e.credentialsPath.trim()?t.credentials_path=e.credentialsPath.trim():delete t.credentials_path,e.writeCredentialsPath.trim()?t.write_credentials_path=e.writeCredentialsPath.trim():delete t.write_credentials_path;else if(e.driver===`snowflake`){e.uri.trim()?t.uri=e.uri.trim():delete t.uri,e.account.trim()?t.account=e.account.trim():delete t.account,e.warehouse.trim()?t.warehouse=e.warehouse.trim():delete t.warehouse,e.database.trim()?t.database=e.database.trim():delete t.database,e.schema.trim()?t.schema=e.schema.trim():delete t.schema,e.role.trim()?t.role=e.role.trim():delete t.role,e.writeRole.trim()?t.write_role=e.writeRole.trim():delete t.write_role;let n={...e.extraAuth};e.authUser.trim()&&(n.user=e.authUser.trim()),e.authPassword.trim()&&(n.password=e.authPassword.trim()),Object.keys(n).length?t.auth=n:delete t.auth}else{e.uri.trim()?t.uri=e.uri.trim():delete t.uri,e.path.trim()?t.path=e.path.trim():delete t.path;let n={...e.extraAuth};e.authUser.trim()&&(n.user=e.authUser.trim()),e.authPassword.trim()&&(n.password=e.authPassword.trim()),Object.keys(n).length?t.auth=n:delete t.auth}return t}async function et(){if(!c.readOnly&&Qe()){K.value=!0,q.value=null;try{p(`save`,W.value.map(e=>$e(e)))}catch(e){q.value=e instanceof Error?e.message:String(e)}finally{K.value=!1}}}function tt(){W.value=c.connections.map(e=>Y(e)),J.value={}}function Q(e){return e?!/^\$\{[A-Za-z_][A-Za-z0-9_]*\}$/.test(e):!1}function $(e){return e.length>0&&!U.has(e)}function nt(e){let t=[];for(let n of Object.keys(e.extras))t.push(n);for(let n of Object.keys(e.extraAuth))t.push(`auth.${n}`);return t.join(`, `)}return(r,i)=>(_(),e(`div`,ne,[W.value.length===0?(_(),e(`div`,re,` No connections yet. Click "Add connection" to declare one. `)):h(``,!0),(_(!0),e(g,null,t(W.value,(r,o)=>(_(),e(`div`,{key:r._key,class:u([`conn-row`,{"has-error":J.value[r._key]}])},[n(`div`,ie,[l(n(`input`,{"onUpdate:modelValue":e=>r.name=e,class:`conn-name-input`,placeholder:`connection-name`,disabled:a.readOnly},null,8,ae),[[f,r.name]]),l(n(`select`,{"onUpdate:modelValue":e=>r.driver=e,class:`conn-driver-select`,disabled:a.readOnly},[(_(),e(g,null,t(y,e=>n(`option`,{key:e.value,value:e.value},d(e.label),9,se)),64)),$(r.driver)?(_(),e(`option`,{key:0,value:r.driver},d(r.driver)+` (custom) `,9,ce)):h(``,!0)],8,oe),[[ee,r.driver]]),n(`button`,{class:`conn-remove-btn`,disabled:a.readOnly,title:`Remove this connection`,onClick:e=>Ze(o)},` × `,8,le)]),$(r.driver)?(_(),e(`p`,ue,` Unknown driver: only the URI / path / auth fields are editable here. Everything else round-trips unchanged. `)):h(``,!0),Object.keys(r.extras).length>0||Object.keys(r.extraAuth).length>0?(_(),e(`p`,de,[i[0]||=m(` Preserved from notebook.toml: `,-1),n(`code`,null,d(nt(r)),1)])):h(``,!0),n(`div`,fe,[r.driver===`sqlite`?(_(),e(`label`,b,[i[1]||=n(`span`,{class:`field-label`},`Path`,-1),l(n(`input`,{"onUpdate:modelValue":e=>r.path=e,type:`text`,placeholder:`analytics.db (relative to notebook dir)`,disabled:a.readOnly},null,8,x),[[f,r.path]])])):r.driver===`duckdb`?(_(),e(`label`,S,[i[2]||=n(`span`,{class:`field-label`},`Path`,-1),l(n(`input`,{"onUpdate:modelValue":e=>r.path=e,type:`text`,placeholder:`analytics.duckdb (relative to notebook dir), or :memory:`,disabled:a.readOnly},null,8,C),[[f,r.path]])])):r.driver===`postgresql`?(_(),e(g,{key:2},[n(`label`,w,[i[3]||=n(`span`,{class:`field-label`},`URI`,-1),l(n(`input`,{"onUpdate:modelValue":e=>r.uri=e,type:`text`,placeholder:`postgresql://host:5432/dbname`,disabled:a.readOnly},null,8,T),[[f,r.uri]])]),n(`div`,E,[n(`label`,D,[i[4]||=n(`span`,{class:`field-label`},`User`,-1),l(n(`input`,{"onUpdate:modelValue":e=>r.authUser=e,type:`text`,placeholder:"${PGUSER}",disabled:a.readOnly,class:u({"literal-secret":Q(r.authUser)})},null,10,O),[[f,r.authUser]])]),n(`label`,k,[i[5]||=n(`span`,{class:`field-label`},`Password`,-1),l(n(`input`,{"onUpdate:modelValue":e=>r.authPassword=e,type:`text`,placeholder:"${PGPASS}",disabled:a.readOnly,class:u({"literal-secret":Q(r.authPassword)})},null,10,A),[[f,r.authPassword]])])]),Q(r.authUser)||Q(r.authPassword)?(_(),e(`p`,j,[...i[6]||=[m(` Use `,-1),n(`code`,null,"${VAR}",-1),m(` indirection; literal credentials are blanked when notebook.toml is saved. `,-1)]])):h(``,!0),n(`div`,M,[n(`label`,N,[i[7]||=n(`span`,{class:`field-label`},`Role`,-1),l(n(`input`,{"onUpdate:modelValue":e=>r.role=e,type:`text`,placeholder:`reader`,disabled:a.readOnly},null,8,P),[[f,r.role]])]),n(`label`,F,[i[8]||=n(`span`,{class:`field-label`},`search_path`,-1),l(n(`input`,{"onUpdate:modelValue":e=>r.searchPath=e,type:`text`,placeholder:`public`,disabled:a.readOnly},null,8,I),[[f,r.searchPath]])])])],64)):r.driver===`snowflake`?(_(),e(g,{key:3},[n(`div`,L,[n(`label`,R,[i[9]||=n(`span`,{class:`field-label`},`Account`,-1),l(n(`input`,{"onUpdate:modelValue":e=>r.account=e,type:`text`,placeholder:`ACME-PROD`,disabled:a.readOnly},null,8,z),[[f,r.account]])]),n(`label`,B,[i[10]||=n(`span`,{class:`field-label`},`Warehouse`,-1),l(n(`input`,{"onUpdate:modelValue":e=>r.warehouse=e,type:`text`,placeholder:`ANALYTICS_WH`,disabled:a.readOnly},null,8,V),[[f,r.warehouse]])])]),n(`div`,pe,[n(`label`,me,[i[11]||=n(`span`,{class:`field-label`},`Database`,-1),l(n(`input`,{"onUpdate:modelValue":e=>r.database=e,type:`text`,placeholder:`EVENTS`,disabled:a.readOnly},null,8,he),[[f,r.database]])]),n(`label`,ge,[i[12]||=n(`span`,{class:`field-label`},`Schema`,-1),l(n(`input`,{"onUpdate:modelValue":e=>r.schema=e,type:`text`,placeholder:`PUBLIC`,disabled:a.readOnly},null,8,_e),[[f,r.schema]])])]),n(`div`,ve,[n(`label`,ye,[i[13]||=n(`span`,{class:`field-label`},`Role (read cells)`,-1),l(n(`input`,{"onUpdate:modelValue":e=>r.role=e,type:`text`,placeholder:`ANALYTICS_RO`,disabled:a.readOnly},null,8,be),[[f,r.role]])]),n(`label`,xe,[i[14]||=n(`span`,{class:`field-label`},`write_role (write cells, optional)`,-1),l(n(`input`,{"onUpdate:modelValue":e=>r.writeRole=e,type:`text`,placeholder:`ANALYTICS_RW`,disabled:a.readOnly},null,8,Se),[[f,r.writeRole]])])]),n(`div`,Ce,[n(`label`,we,[i[15]||=n(`span`,{class:`field-label`},`User`,-1),l(n(`input`,{"onUpdate:modelValue":e=>r.authUser=e,type:`text`,placeholder:"${SF_USER}",disabled:a.readOnly,class:u({"literal-secret":Q(r.authUser)})},null,10,Te),[[f,r.authUser]])]),n(`label`,Ee,[i[16]||=n(`span`,{class:`field-label`},`Password`,-1),l(n(`input`,{"onUpdate:modelValue":e=>r.authPassword=e,type:`text`,placeholder:"${SF_PASS}",disabled:a.readOnly,class:u({"literal-secret":Q(r.authPassword)})},null,10,De),[[f,r.authPassword]])])]),Q(r.authUser)||Q(r.authPassword)?(_(),e(`p`,H,[...i[17]||=[m(` Use `,-1),n(`code`,null,"${VAR}",-1),m(` indirection; literal credentials are blanked when notebook.toml is saved. `,-1)]])):h(``,!0),i[19]||=n(`p`,{class:`conn-secret-hint`},` Snowflake read-only enforcement is role-based: configure a role that has SELECT but not INSERT/UPDATE/DELETE for read cells. `,-1),n(`label`,Oe,[i[18]||=n(`span`,{class:`field-label`},`URI (overrides the fields above)`,-1),l(n(`input`,{"onUpdate:modelValue":e=>r.uri=e,type:`text`,placeholder:`snowflake://reader@ACME/EVENTS?authenticator=externalbrowser`,disabled:a.readOnly},null,8,ke),[[f,r.uri]])])],64)):r.driver===`bigquery`?(_(),e(g,{key:4},[n(`div`,Ae,[n(`label`,je,[i[20]||=n(`span`,{class:`field-label`},`Project ID`,-1),l(n(`input`,{"onUpdate:modelValue":e=>r.projectId=e,type:`text`,placeholder:`acme-prod`,disabled:a.readOnly},null,8,Me),[[f,r.projectId]])]),n(`label`,Ne,[i[21]||=n(`span`,{class:`field-label`},`Dataset (default)`,-1),l(n(`input`,{"onUpdate:modelValue":e=>r.datasetId=e,type:`text`,placeholder:`events`,disabled:a.readOnly},null,8,Pe),[[f,r.datasetId]])])]),n(`label`,Fe,[i[22]||=n(`span`,{class:`field-label`},`Service account JSON path (read cells)`,-1),l(n(`input`,{"onUpdate:modelValue":e=>r.credentialsPath=e,type:`text`,placeholder:`/secrets/bq-reader.json`,disabled:a.readOnly},null,8,Ie),[[f,r.credentialsPath]])]),n(`label`,Le,[i[23]||=n(`span`,{class:`field-label`},`Write credentials path (write cells, optional)`,-1),l(n(`input`,{"onUpdate:modelValue":e=>r.writeCredentialsPath=e,type:`text`,placeholder:`/secrets/bq-writer.json`,disabled:a.readOnly},null,8,Re),[[f,r.writeCredentialsPath]])]),i[24]||=n(`p`,{class:`conn-secret-hint`},[m(` BigQuery read-only enforcement is credential-based: the service account's IAM grants decide what's allowed. Use a SA with `),n(`code`,null,`roles/bigquery.dataViewer`),m(` for read cells; pair with a write SA carrying `),n(`code`,null,`roles/bigquery.dataEditor`),m(` for `),n(`code`,null,`# @sql write=true`),m(`. `)],-1)],64)):$(r.driver)?(_(),e(g,{key:5},[n(`label`,ze,[i[25]||=n(`span`,{class:`field-label`},`URI`,-1),l(n(`input`,{"onUpdate:modelValue":e=>r.uri=e,type:`text`,placeholder:`driver://…`,disabled:a.readOnly},null,8,Be),[[f,r.uri]])]),n(`label`,Ve,[i[26]||=n(`span`,{class:`field-label`},`Path`,-1),l(n(`input`,{"onUpdate:modelValue":e=>r.path=e,type:`text`,disabled:a.readOnly},null,8,He),[[f,r.path]])])],64)):h(``,!0)]),J.value[r._key]?(_(),e(`p`,Ue,d(J.value[r._key]),1)):h(``,!0)],2))),128)),n(`div`,We,[n(`button`,{class:`conn-add-btn`,disabled:a.readOnly,onClick:Xe},` + Add connection `,8,Ge),n(`div`,Ke,[X.value?(_(),e(`button`,{key:0,class:`conn-reset-btn`,disabled:a.readOnly,onClick:tt},` Reset `,8,qe)):h(``,!0),n(`button`,{class:`conn-save-btn`,disabled:a.readOnly||K.value||!X.value,onClick:et},d(K.value?`Saving…`:`Save`),9,Je)])]),q.value?(_(),e(`p`,Ye,d(q.value),1)):h(``,!0)]))}}),[[`__scopeId`,`data-v-f2110503`]]),W={class:`connections-panel`},G={class:`connection-count`},K={class:`toggle-icon`},q={key:0,class:`connections-content`},J={key:0,class:`connections-error`},Y=p(c({__name:`ConnectionsPanel`,setup(t){let{notebook:i,connected:c,updateNotebookConnectionsAction:l}=v(),u=o(!1),f=o(null),p=r(()=>i.connections.length);async function g(e){f.value=null;try{await l(e)}catch(e){throw f.value=e instanceof Error?e.message:String(e),e}}return(t,r)=>(_(),e(`div`,W,[n(`button`,{class:`connections-toggle`,onClick:r[0]||=e=>u.value=!u.value},[r[1]||=m(` Connections `,-1),n(`span`,G,d(p.value),1),n(`span`,K,d(u.value?`▲`:`▼`),1)]),u.value?(_(),e(`div`,q,[r[2]||=n(`p`,{class:`connections-copy`},[m(` SQL connections referenced by `),n(`code`,null,`# @sql connection=<name>`),m(`. Use `),n(`code`,null,"${VAR}"),m(` for credentials; literal secrets are blanked when notebook.toml is saved. `)],-1),s(U,{connections:a(i).connections,"read-only":!a(c),onSave:g},null,8,[`connections`,`read-only`]),f.value?(_(),e(`p`,J,d(f.value),1)):h(``,!0)])):h(``,!0)]))}}),[[`__scopeId`,`data-v-d9422eca`]]);export{Y as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.conn-editor[data-v-f2110503]{flex-direction:column;gap:10px;display:flex}.conn-empty[data-v-f2110503]{color:var(--text-muted);padding:8px;font-size:12px;font-style:italic}.conn-row[data-v-f2110503]{border:1px solid var(--border-subtle);background:var(--bg-elevated);color:var(--text-primary);border-radius:6px;padding:10px}.conn-row.has-error[data-v-f2110503]{border-color:var(--accent-danger)}.conn-row-header[data-v-f2110503]{align-items:center;gap:8px;display:flex}.conn-name-input[data-v-f2110503]{border:1px solid var(--border-subtle);background:var(--bg-input);color:var(--text-primary);border-radius:4px;flex:1;padding:4px 8px;font-size:13px}.conn-driver-select[data-v-f2110503],.conn-driver-select option[data-v-f2110503]{border:1px solid var(--border-subtle);background:var(--bg-input);color:var(--text-primary);border-radius:4px;padding:4px 6px;font-size:12px}.conn-remove-btn[data-v-f2110503]{width:24px;height:24px;color:var(--text-muted);cursor:pointer;background:0 0;border:none;font-size:16px;line-height:1}.conn-remove-btn[data-v-f2110503]:hover:not(:disabled){color:var(--accent-danger)}.conn-fields[data-v-f2110503]{flex-direction:column;gap:6px;margin-top:8px;display:flex}.conn-field[data-v-f2110503]{flex-direction:column;flex:1;gap:2px;display:flex}.conn-field-row[data-v-f2110503]{gap:8px;display:flex}.field-label[data-v-f2110503]{color:var(--text-secondary);font-size:11px;font-weight:500}.conn-field input[data-v-f2110503]{font-size:12px;font-family:var(--font-mono,monospace);border:1px solid var(--border-subtle);background:var(--bg-input);color:var(--text-primary);border-radius:4px;padding:4px 8px}.conn-field input[data-v-f2110503]::placeholder{color:var(--text-muted)}.conn-field input.literal-secret[data-v-f2110503]{border-color:var(--accent-warning,#f39c12);background:var(--tint-warning)}.conn-secret-hint[data-v-f2110503],.conn-driver-hint[data-v-f2110503],.conn-extras-hint[data-v-f2110503]{color:var(--text-secondary);margin:4px 0 0;font-size:11px}.conn-driver-hint[data-v-f2110503]{color:var(--accent-warning,#b58400)}.conn-secret-hint code[data-v-f2110503],.conn-extras-hint code[data-v-f2110503]{background:var(--bg-input);border-radius:3px;padding:1px 4px}.conn-actions[data-v-f2110503]{justify-content:space-between;align-items:center;gap:8px;display:flex}.conn-actions-right[data-v-f2110503]{gap:6px;display:flex}.conn-add-btn[data-v-f2110503],.conn-reset-btn[data-v-f2110503],.conn-save-btn[data-v-f2110503]{border:1px solid var(--border-strong,var(--border-subtle));cursor:pointer;background:var(--bg-input);color:var(--text-primary);border-radius:4px;padding:5px 10px;font-size:12px}.conn-add-btn[data-v-f2110503]:hover:not(:disabled),.conn-reset-btn[data-v-f2110503]:hover:not(:disabled){background:var(--bg-hover,#ffffff0f)}.conn-save-btn[data-v-f2110503]{background:var(--accent-primary,#4a90e2);color:#fff;border-color:#0000}.conn-save-btn[data-v-f2110503]:disabled{opacity:.5;cursor:not-allowed}.conn-error[data-v-f2110503]{color:var(--accent-danger);margin:4px 0 0;font-size:11px}.connections-panel[data-v-d9422eca]{border-top:1px solid var(--border-subtle);margin-top:12px;padding-top:8px}.connections-toggle[data-v-d9422eca]{width:100%;color:var(--text-secondary);text-transform:uppercase;letter-spacing:.5px;cursor:pointer;background:0 0;border:none;align-items:center;gap:6px;padding:4px 0;font-size:12px;font-weight:600;display:flex}.connections-toggle[data-v-d9422eca]:hover{color:var(--text-primary)}.connection-count[data-v-d9422eca]{background:var(--bg-input);color:var(--accent-primary);border-radius:8px;padding:1px 6px;font-size:11px;font-weight:600}.toggle-icon[data-v-d9422eca]{margin-left:auto;font-size:10px}.connections-content[data-v-d9422eca]{margin-top:8px}.connections-copy[data-v-d9422eca]{color:var(--text-muted);margin-bottom:8px;font-size:12px;line-height:1.4}.connections-copy code[data-v-d9422eca]{background:var(--bg-input);border-radius:3px;padding:1px 4px;font-size:11px}.connections-error[data-v-d9422eca]{background:var(--tint-danger);color:var(--accent-danger);border-radius:4px;margin-top:8px;padding:6px 8px;font-size:12px}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.dag-panel[data-v-794f2cfd]{background:0 0;flex-direction:column;min-width:180px;height:100%;display:flex;overflow:hidden}.dag-header[data-v-794f2cfd]{color:var(--text-muted);text-transform:uppercase;letter-spacing:.5px;border-bottom:1px solid var(--border-subtle);justify-content:space-between;align-items:center;padding:8px 12px;font-size:12px;font-weight:600;display:flex}.dag-reset[data-v-794f2cfd]{border:1px solid var(--bg-input);color:var(--text-muted);cursor:pointer;text-transform:none;letter-spacing:0;background:0 0;border-radius:4px;padding:2px 6px;font-size:10px}.dag-reset[data-v-794f2cfd]:hover{border-color:var(--accent-primary);color:var(--accent-primary)}.dag-viewport[data-v-794f2cfd]{cursor:grab;-webkit-user-select:none;user-select:none;flex:1;min-height:0;overflow:hidden}.dag-viewport[data-v-794f2cfd]:active{cursor:grabbing}.dag-svg[data-v-794f2cfd]{width:100%;height:100%;display:block}.dag-node[data-v-794f2cfd]{cursor:pointer}.dag-node:hover rect[data-v-794f2cfd]{filter:brightness(1.3)}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{A as e,B as t,C as n,D as r,E as i,G as a,K as o,P as s,Z as c,g as l,j as u,k as d,w as f,z as p}from"./index-C-zgQzKr.js";import{r as m}from"./DataTable-Djt8YiVM.js";var h=Object.defineProperty,g=(e,t,n)=>t in e?h(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,_=(e,t)=>{for(var n in t)h(e,n,{get:t[n],enumerable:!0})},v=(e,t,n)=>g(e,typeof t==`symbol`?t:t+``,n),ee={};_(ee,{Graph:()=>P,alg:()=>O});var y=Object.defineProperty,b=(e,t)=>{for(var n in t)y(e,n,{get:t[n],enumerable:!0})},x=class{constructor(e){this._isDirected=!0,this._isMultigraph=!1,this._isCompound=!1,this._nodes={},this._in={},this._preds={},this._out={},this._sucs={},this._edgeObjs={},this._edgeLabels={},this._nodeCount=0,this._edgeCount=0,this._defaultNodeLabelFn=()=>{},this._defaultEdgeLabelFn=()=>{},e&&(this._isDirected=`directed`in e?e.directed:!0,this._isMultigraph=`multigraph`in e&&e.multigraph,this._isCompound=`compound`in e&&e.compound),this._isCompound&&(this._parent={},this._children={},this._children[`\0`]={})}isDirected(){return this._isDirected}isMultigraph(){return this._isMultigraph}isCompound(){return this._isCompound}setGraph(e){return this._label=e,this}graph(){return this._label}setDefaultNodeLabel(e){return this._defaultNodeLabelFn=typeof e==`function`?e:()=>e,this}nodeCount(){return this._nodeCount}nodes(){return Object.keys(this._nodes)}sources(){return this.nodes().filter(e=>Object.keys(this._in[e]).length===0)}sinks(){return this.nodes().filter(e=>Object.keys(this._out[e]).length===0)}setNodes(e,t){return e.forEach(e=>{t===void 0?this.setNode(e):this.setNode(e,t)}),this}setNode(e,t){return e in this._nodes?(arguments.length>1&&(this._nodes[e]=t),this):(this._nodes[e]=arguments.length>1?t:this._defaultNodeLabelFn(e),this._isCompound&&(this._parent[e]=`\0`,this._children[e]={},this._children[`\0`][e]=!0),this._in[e]={},this._preds[e]={},this._out[e]={},this._sucs[e]={},++this._nodeCount,this)}node(e){return this._nodes[e]}hasNode(e){return e in this._nodes}removeNode(e){if(e in this._nodes){let t=e=>this.removeEdge(this._edgeObjs[e]);delete this._nodes[e],this._isCompound&&(this._removeFromParentsChildList(e),delete this._parent[e],this.children(e).forEach(e=>{this.setParent(e)}),delete this._children[e]),Object.keys(this._in[e]).forEach(t),delete this._in[e],delete this._preds[e],Object.keys(this._out[e]).forEach(t),delete this._out[e],delete this._sucs[e],--this._nodeCount}return this}setParent(e,t){if(!this._isCompound)throw Error(`Cannot set parent in a non-compound graph`);if(t===void 0)t=`\0`;else{t+=``;for(let n=t;n!==void 0;n=this.parent(n))if(n===e)throw Error(`Setting `+t+` as parent of `+e+` would create a cycle`);this.setNode(t)}return this.setNode(e),this._removeFromParentsChildList(e),this._parent[e]=t,this._children[t][e]=!0,this}parent(e){if(this._isCompound){let t=this._parent[e];if(t!==`\0`)return t}}children(e=`\0`){if(this._isCompound){let t=this._children[e];if(t)return Object.keys(t)}else{if(e===`\0`)return this.nodes();if(this.hasNode(e))return[]}return[]}predecessors(e){let t=this._preds[e];if(t)return Object.keys(t)}successors(e){let t=this._sucs[e];if(t)return Object.keys(t)}neighbors(e){let t=this.predecessors(e);if(t){let n=new Set(t),r=this.successors(e);if(r)for(let e of r)n.add(e);return Array.from(n.values())}}isLeaf(e){let t;return t=this.isDirected()?this.successors(e):this.neighbors(e),(t?.length??0)===0}filterNodes(e){let t=new this.constructor({directed:this._isDirected,multigraph:this._isMultigraph,compound:this._isCompound});t.setGraph(this.graph()),Object.entries(this._nodes).forEach(([n,r])=>{e(n)&&t.setNode(n,r)}),Object.values(this._edgeObjs).forEach(e=>{t.hasNode(e.v)&&t.hasNode(e.w)&&t.setEdge(e,this.edge(e))});let n={},r=e=>{let i=this.parent(e);return!i||t.hasNode(i)?(n[e]=i,i):i in n?n[i]:r(i)};return this._isCompound&&t.nodes().forEach(e=>t.setParent(e,r(e))),t}setDefaultEdgeLabel(e){return this._defaultEdgeLabelFn=typeof e==`function`?e:()=>e,this}edgeCount(){return this._edgeCount}edges(){return Object.values(this._edgeObjs)}setPath(e,t){return e.reduce((e,n)=>(t===void 0?this.setEdge(e,n):this.setEdge(e,n,t),n)),this}setEdge(e,t,n,r){let i,a,o,s,c=!1;typeof e==`object`&&e&&`v`in e?(i=e.v,a=e.w,o=e.name,arguments.length===2&&(s=t,c=!0)):(i=e,a=t,o=r,arguments.length>2&&(s=n,c=!0)),i=``+i,a=``+a,o!==void 0&&(o=``+o);let l=w(this._isDirected,i,a,o);if(l in this._edgeLabels)return c&&(this._edgeLabels[l]=s),this;if(o!==void 0&&!this._isMultigraph)throw Error(`Cannot set a named edge when isMultigraph = false`);this.setNode(i),this.setNode(a),this._edgeLabels[l]=c?s:this._defaultEdgeLabelFn(i,a,o);let u=T(this._isDirected,i,a,o);return i=u.v,a=u.w,Object.freeze(u),this._edgeObjs[l]=u,S(this._preds[a],i),S(this._sucs[i],a),this._in[a][l]=u,this._out[i][l]=u,this._edgeCount++,this}edge(e,t,n){let r=arguments.length===1?E(this._isDirected,e):w(this._isDirected,e,t,n);return this._edgeLabels[r]}edgeAsObj(e,t,n){let r=arguments.length===1?this.edge(e):this.edge(e,t,n);return typeof r!=`object`||!r?{label:r}:r}hasEdge(e,t,n){return(arguments.length===1?E(this._isDirected,e):w(this._isDirected,e,t,n))in this._edgeLabels}removeEdge(e,t,n){let r=arguments.length===1?E(this._isDirected,e):w(this._isDirected,e,t,n),i=this._edgeObjs[r];if(i){let e=i.v,t=i.w;delete this._edgeLabels[r],delete this._edgeObjs[r],C(this._preds[t],e),C(this._sucs[e],t),delete this._in[t][r],delete this._out[e][r],this._edgeCount--}return this}inEdges(e,t){return this.isDirected()?this.filterEdges(this._in[e],e,t):this.nodeEdges(e,t)}outEdges(e,t){return this.isDirected()?this.filterEdges(this._out[e],e,t):this.nodeEdges(e,t)}nodeEdges(e,t){if(e in this._nodes)return this.filterEdges({...this._in[e],...this._out[e]},e,t)}_removeFromParentsChildList(e){delete this._children[this._parent[e]][e]}filterEdges(e,t,n){if(!e)return;let r=Object.values(e);return n?r.filter(e=>e.v===t&&e.w===n||e.v===n&&e.w===t):r}};function S(e,t){e[t]?e[t]++:e[t]=1}function C(e,t){e[t]!==void 0&&!--e[t]&&delete e[t]}function w(e,t,n,r){let i=``+t,a=``+n;if(!e&&i>a){let e=i;i=a,a=e}return i+``+a+``+(r===void 0?`\0`:r)}function T(e,t,n,r){let i=``+t,a=``+n;if(!e&&i>a){let e=i;i=a,a=e}let o={v:i,w:a};return r&&(o.name=r),o}function E(e,t){return w(e,t.v,t.w,t.name)}b({},{read:()=>re,write:()=>D});function D(e){let t={options:{directed:e.isDirected(),multigraph:e.isMultigraph(),compound:e.isCompound()},nodes:te(e),edges:ne(e)},n=e.graph();return n!==void 0&&(t.value=structuredClone(n)),t}function te(e){return e.nodes().map(t=>{let n=e.node(t),r=e.parent(t),i={v:t};return n!==void 0&&(i.value=n),r!==void 0&&(i.parent=r),i})}function ne(e){return e.edges().map(t=>{let n=e.edge(t),r={v:t.v,w:t.w};return t.name!==void 0&&(r.name=t.name),n!==void 0&&(r.value=n),r})}function re(e){let t=new x(e.options);return e.value!==void 0&&t.setGraph(e.value),e.nodes.forEach(e=>{t.setNode(e.v,e.value),e.parent&&t.setParent(e.v,e.parent)}),e.edges.forEach(e=>{t.setEdge({v:e.v,w:e.w,name:e.name},e.value)}),t}var O={};b(O,{CycleException:()=>N,bellmanFord:()=>k,components:()=>A,dijkstra:()=>M,dijkstraAll:()=>ce,findCycles:()=>ue,floydWarshall:()=>fe,isAcyclic:()=>he,postorder:()=>ye,preorder:()=>be,prim:()=>xe,shortestPaths:()=>Se,tarjan:()=>le,topsort:()=>me});var ie=()=>1;function k(e,t,n,r){return ae(e,String(t),n||ie,r||function(t){return e.outEdges(t)??[]})}function ae(e,t,n,r){let i={},a,o=0,s=e.nodes(),c=function(e){let t=i[e.v],r=i[e.w];if(!t||!r)return;let o=n(e);t.distance+o<r.distance&&(i[e.w]={distance:t.distance+o,predecessor:e.v},a=!0)},l=function(){s.forEach(function(e){r(e).forEach(function(t){let n=t.v===e?t.v:t.w,r=n===t.v?t.w:t.v;c({v:n,w:r})})})};s.forEach(function(e){i[e]={distance:e===t?0:1/0,predecessor:``}});let u=s.length;for(let e=1;e<u&&(a=!1,o++,l(),a);e++);if(o===u-1&&(a=!1,l(),a))throw Error(`The graph contains a negative weight cycle`);return i}function A(e){let t={},n=[],r;function i(n){var a,o;n in t||(t[n]=!0,r.push(n),(a=e.successors(n))==null||a.forEach(i),(o=e.predecessors(n))==null||o.forEach(i))}return e.nodes().forEach(function(e){r=[],i(e),r.length&&n.push(r)}),n}var j=class{constructor(){this._arr=[],this._keyIndices={}}size(){return this._arr.length}keys(){return this._arr.map(e=>e.key)}has(e){return e in this._keyIndices}priority(e){let t=this._keyIndices[e];if(t!==void 0)return this._arr[t].priority}min(){if(this.size()===0)throw Error(`Queue underflow`);return this._arr[0].key}add(e,t){let n=this._keyIndices,r=String(e);if(!(r in n)){let e=this._arr,i=e.length;return n[r]=i,e.push({key:r,priority:t}),this._decrease(i),!0}return!1}removeMin(){if(this.size()===0)throw Error(`Queue underflow`);this._swap(0,this._arr.length-1);let e=this._arr.pop();return delete this._keyIndices[e.key],this._heapify(0),e.key}decrease(e,t){let n=this._keyIndices[e];if(n===void 0)throw Error(`Key not found: ${e}`);let r=this._arr[n].priority;if(t>r)throw Error(`New priority is greater than current priority. Key: ${e} Old: ${r} New: ${t}`);this._arr[n].priority=t,this._decrease(n)}_heapify(e){let t=this._arr,n=2*e,r=n+1,i=e;n<t.length&&(i=t[n].priority<t[i].priority?n:i,r<t.length&&(i=t[r].priority<t[i].priority?r:i),i!==e&&(this._swap(e,i),this._heapify(i)))}_decrease(e){let t=this._arr,n=t[e].priority,r;for(;e!==0&&(r=e>>1,!(t[r].priority<n));)this._swap(e,r),e=r}_swap(e,t){let n=this._arr,r=this._keyIndices,i=n[e],a=n[t];n[e]=a,n[t]=i,r[a.key]=e,r[i.key]=t}},oe=()=>1;function M(e,t,n,r){return se(e,String(t),n||oe,r||function(t){return e.outEdges(t)??[]})}function se(e,t,n,r){let i={},a=new j,o,s,c=function(e){let t=e.v===o?e.w:e.v,r=i[t];if(!r)return;let c=n(e),l=s.distance+c;if(c<0)throw Error(`dijkstra does not allow negative edge weights. Bad edge: `+e+` Weight: `+c);l<r.distance&&(r.distance=l,r.predecessor=o,a.decrease(t,l))};for(e.nodes().forEach(function(e){let n=e===t?0:1/0;i[e]={distance:n,predecessor:``},a.add(e,n)});a.size()>0;){o=a.removeMin();let e=i[o];if(!e||e.distance===1/0)break;s=e,r(o).forEach(c)}return i}function ce(e,t,n){return e.nodes().reduce(function(r,i){return r[i]=M(e,i,t,n),r},{})}function le(e){let t=0,n=[],r={},i=[];function a(o){var s;let c=r[o]={onStack:!0,lowlink:t,index:t++};if(n.push(o),(s=e.successors(o))==null||s.forEach(function(e){if(e in r){let t=r[e];t!=null&&t.onStack&&(c.lowlink=Math.min(c.lowlink,t.index))}else{a(e);let t=r[e];t&&(c.lowlink=Math.min(c.lowlink,t.lowlink))}}),c.lowlink===c.index){let e=[],t;do{t=n.pop();let i=r[t];i&&(i.onStack=!1),e.push(t)}while(o!==t);i.push(e)}}return e.nodes().forEach(function(e){e in r||a(e)}),i}function ue(e){return le(e).filter(function(t){let n=t[0];return n?t.length>1||t.length===1&&(e.outEdges(n,n)??[]).length>0:!1})}var de=()=>1;function fe(e,t,n){return pe(e,t||de,n||function(t){return e.outEdges(t)??[]})}function pe(e,t,n){let r={},i=e.nodes();return i.forEach(function(e){let a={};r[e]=a,a[e]={distance:0,predecessor:``},i.forEach(function(t){e!==t&&(a[t]={distance:1/0,predecessor:``})}),n(e).forEach(function(n){let r=n.v===e?n.w:n.v,i=t(n);a[r]={distance:i,predecessor:e}})}),i.forEach(function(e){let t=r[e];t&&i.forEach(function(n){let a=r[n];a&&i.forEach(function(n){let r=a[e],i=t[n],o=a[n];if(r&&i&&o){let e=r.distance+i.distance;e<o.distance&&(o.distance=e,o.predecessor=i.predecessor)}})})}),r}var N=class extends Error{constructor(e){super(e),this.name=`CycleException`}};function me(e){let t={},n={},r=[];function i(a){var o;if(a in n)throw new N;a in t||(n[a]=!0,t[a]=!0,(o=e.predecessors(a))==null||o.forEach(i),delete n[a],r.push(a))}if(e.sinks().forEach(i),Object.keys(t).length!==e.nodeCount())throw new N;return r}function he(e){try{me(e)}catch(e){if(e instanceof N)return!1;throw e}return!0}function ge(e,t,n,r,i){Array.isArray(t)||(t=[t]);let a=(t=>(e.isDirected()?e.successors(t):e.neighbors(t))??[]),o={};return t.forEach(function(t){if(!e.hasNode(t))throw Error(`Graph does not have node: `+t);i=_e(e,t,n===`post`,o,a,r,i)}),i}function _e(e,t,n,r,i,a,o){return t in r||(r[t]=!0,n||(o=a(o,t)),i(t).forEach(function(t){o=_e(e,t,n,r,i,a,o)}),n&&(o=a(o,t))),o}function ve(e,t,n){return ge(e,t,n,function(e,t){return e.push(t),e},[])}function ye(e,t){return ve(e,t,`post`)}function be(e,t){return ve(e,t,`pre`)}function xe(e,t){var n;let r=new x,i={},a=new j,o;function s(e){let n=e.v===o?e.w:e.v,r=a.priority(n);if(r!==void 0){let s=t(e);s<r&&(i[n]=o,a.decrease(n,s))}}if(e.nodeCount()===0)return r;e.nodes().forEach(function(e){a.add(e,1/0),r.setNode(e)});let c=e.nodes()[0];c!==void 0&&a.decrease(c,0);let l=!1;for(;a.size()>0;){if(o=a.removeMin(),o in i)r.setEdge(o,i[o]);else{if(l)throw Error(`Input graph is not connected: `+e);l=!0}(n=e.nodeEdges(o))==null||n.forEach(s)}return r}function Se(e,t,n,r){return Ce(e,t,n,r??(t=>e.outEdges(t)??[]))}function Ce(e,t,n,r){if(n===void 0)return M(e,t,n,r);let i=!1,a=e.nodes();for(let o=0;o<a.length;o++){let s=a[o];if(s===void 0)continue;let c=r(s);for(let e=0;e<c.length;e++){let t=c[e];if(!t)continue;let r=t.v===s?t.v:t.w;n({v:r,w:r===t.v?t.w:t.v})<0&&(i=!0)}if(i)return k(e,t,n,r)}return M(e,t,n,r)}var P=x;function F(e,t,n,r){let i=r;for(;e.hasNode(i);)i=R(r);return n.dummy=t,e.setNode(i,n),i}function we(e){let t=new P().setGraph(e.graph());return e.nodes().forEach(n=>t.setNode(n,e.node(n))),e.edges().forEach(n=>{let r=t.edge(n.v,n.w)||{weight:0,minlen:1},i=e.edge(n);t.setEdge(n.v,n.w,{weight:r.weight+i.weight,minlen:Math.max(r.minlen,i.minlen)})}),t}function Te(e){let t=new P({multigraph:e.isMultigraph()}).setGraph(e.graph());return e.nodes().forEach(n=>{e.children(n).length||t.setNode(n,e.node(n))}),e.edges().forEach(n=>{t.setEdge(n,e.edge(n))}),t}function Ee(e,t){let n=e.x,r=e.y,i=t.x-n,a=t.y-r,o=e.width/2,s=e.height/2;if(!i&&!a)throw Error(`Not possible to find intersection inside of the rectangle`);let c,l;return Math.abs(a)*o>Math.abs(i)*s?(a<0&&(s=-s),c=s*i/a,l=s):(i<0&&(o=-o),c=o,l=o*a/i),{x:n+c,y:r+l}}function I(e){let t=z(Me(e)+1).map(()=>[]);return e.nodes().forEach(n=>{let r=e.node(n),i=r.rank;i!==void 0&&(t[i]||(t[i]=[]),t[i][r.order]=n)}),t}function De(e){let t=e.nodes().map(t=>{let n=e.node(t).rank;return n===void 0?Number.MAX_VALUE:n}),n=L(Math.min,t);e.nodes().forEach(t=>{let r=e.node(t);Object.hasOwn(r,`rank`)&&(r.rank-=n)})}function Oe(e){let t=e.nodes().map(t=>e.node(t).rank).filter(e=>e!==void 0),n=L(Math.min,t),r=[];e.nodes().forEach(t=>{let i=e.node(t).rank-n;r[i]||(r[i]=[]),r[i].push(t)});let i=0,a=e.graph().nodeRankFactor;Array.from(r).forEach((t,n)=>{t===void 0&&n%a!==0?--i:t!==void 0&&i&&t.forEach(t=>e.node(t).rank+=i)})}function ke(e,t,n,r){let i={width:0,height:0};return arguments.length>=4&&(i.rank=n,i.order=r),F(e,`border`,i,t)}function Ae(e,t=je){let n=[];for(let r=0;r<e.length;r+=t){let i=e.slice(r,r+t);n.push(i)}return n}var je=65535;function L(e,t){return t.length>je?e(...Ae(t).map(t=>e(...t))):e(...t)}function Me(e){let t=e.nodes().map(t=>{let n=e.node(t).rank;return n===void 0?Number.MIN_VALUE:n});return L(Math.max,t)}function Ne(e,t){let n={lhs:[],rhs:[]};return e.forEach(e=>{t(e)?n.lhs.push(e):n.rhs.push(e)}),n}function Pe(e,t){return t()}var Fe=0;function R(e){return e+(``+ ++Fe)}function z(e,t,n=1){t??(t=e,e=0);let r=e=>e<t;n<0&&(r=e=>t<e);let i=[];for(let t=e;r(t);t+=n)i.push(t);return i}function B(e,t){let n={};for(let r of t)e[r]!==void 0&&(n[r]=e[r]);return n}function V(e,t){let n;return n=typeof t==`string`?e=>e[t]:t,Object.entries(e).reduce((e,[t,r])=>(e[t]=n(r,t),e),{})}function Ie(e,t){return e.reduce((e,n,r)=>(e[n]=t[r],e),{})}var H=`\0`;function Le(e,t,n){if(!(e&&t&&n&&t.dummy===`edge`&&n.dummy===`edge`&&t.edgeObj&&n.edgeObj&&e[t.edgeObj.v]&&e[n.edgeObj.v]&&e[t.edgeObj.w]&&e[n.edgeObj.w]))return 0;let r=!0;t.edgeObj.w===n.edgeObj.w&&(r=!1);let i=r?e[t.edgeObj.v]?.rank??NaN:e[t.edgeObj.w]?.rank??NaN,a=Object.entries(e).find(e=>e[1].edgeObj?.v===t.edgeObj.v&&e[1].edgeObj?.w===t.edgeObj.w&&e[1].rank===i),o=Object.entries(e).find(e=>e[1].edgeObj?.v===n.edgeObj.v&&e[1].edgeObj?.w===n.edgeObj.w&&e[1].rank===i);if(!a||!o)return 0;let s=a[1].order??NaN,c=o[1].order??NaN;return isNaN(s-c)?0:s-c}var Re=class{constructor(){v(this,`_sentinel`);let e={};e._next=e._prev=e,this._sentinel=e}dequeue(){let e=this._sentinel,t=e._prev;if(t!==e)return ze(t),t}enqueue(e){let t=this._sentinel;e._prev&&e._next&&ze(e),e._next=t._next,t._next._prev=e,t._next=e,e._prev=t}toString(){let e=[],t=this._sentinel,n=t._prev;for(;n!==t;)e.push(JSON.stringify(n,Be)),n=n._prev;return`[`+e.join(`, `)+`]`}};function ze(e){e._prev._next=e._next,e._next._prev=e._prev,delete e._next,delete e._prev}function Be(e,t){if(e!==`_next`&&e!==`_prev`)return t}var Ve=Re,He=()=>1;function Ue(e,t){if(e.nodeCount()<=1)return[];let n=Ge(e,t||He);return We(n.graph,n.buckets,n.zeroIdx).flatMap(t=>e.outEdges(t.v,t.w)||[])}function We(e,t,n){let r=[],i=t[t.length-1],a=t[0],o;for(;e.nodeCount();){for(;o=a.dequeue();)U(e,t,n,o);for(;o=i.dequeue();)U(e,t,n,o);if(e.nodeCount()){for(let i=t.length-2;i>0;--i)if(o=t[i]?.dequeue(),o){r=r.concat(U(e,t,n,o,!0)||[]);break}}}return r}function U(e,t,n,r,i){let a=[],o=i?a:void 0;return(e.inEdges(r.v)||[]).forEach(r=>{let o=e.edge(r),s=e.node(r.v);i&&a.push({v:r.v,w:r.w}),s.out-=o,W(t,n,s)}),(e.outEdges(r.v)||[]).forEach(r=>{let i=e.edge(r),a=r.w,o=e.node(a);o.in-=i,W(t,n,o)}),e.removeNode(r.v),o}function Ge(e,t){let n=new P,r=0,i=0;e.nodes().forEach(e=>{n.setNode(e,{v:e,in:0,out:0})}),e.edges().forEach(e=>{let a=n.edge(e.v,e.w)||0,o=t(e),s=a+o;n.setEdge(e.v,e.w,s);let c=n.node(e.v),l=n.node(e.w);i=Math.max(i,c.out+=o),r=Math.max(r,l.in+=o)});let a=Ke(i+r+3).map(()=>new Ve),o=r+1;return n.nodes().forEach(e=>{W(a,o,n.node(e))}),{graph:n,buckets:a,zeroIdx:o}}function W(e,t,n){var r,i,a;n.out?n.in?(a=e[n.out-n.in+t])==null||a.enqueue(n):(i=e[e.length-1])==null||i.enqueue(n):(r=e[0])==null||r.enqueue(n)}function Ke(e){let t=[];for(let n=0;n<e;n++)t.push(n);return t}function qe(e,t){(e.graph().acyclicer===`greedy`?Ue(e,n(e)):Je(e,t??null)).forEach(t=>{let n=e.edge(t);e.removeEdge(t),n.forwardName=t.name,n.reversed=!0,e.setEdge(t.w,t.v,n,R(`rev`))});function n(e){return t=>e.edge(t).weight}}function Je(e,t){let n=[],r={},i={};function a(t){Object.hasOwn(i,t)||(i[t]=!0,r[t]=!0,e.outEdges(t).forEach(e=>{Object.hasOwn(r,e.w)?n.push(e):a(e.w)}),delete r[t])}function o(a){var s;Object.hasOwn(i,a)||(i[a]=!0,r[a]=!0,(s=e.outEdges(a))==null||s.forEach(i=>{Object.hasOwn(r,i.w)||t.node(a)?.rank>t.node(i.w)?.rank&&Xe(e,i.w,i)?n.push(i):o(i.w)}),delete r[a])}let s=a;return t&&typeof t.node==`function`&&(s=o),e.sources().forEach(s),e.nodes().forEach(s),n}function Ye(e){e.edges().forEach(t=>{let n=e.edge(t);if(n.reversed){e.removeEdge(t);let r=n.forwardName;delete n.reversed,delete n.forwardName,e.setEdge(t.w,t.v,n,r)}})}function Xe(e,t,n){let r=new Set;function i(t){if(e.sources().includes(t))return!0;r.add(t);for(let a of e.inEdges(t)??[])if((a.v!==n.v||a.w!==n.w)&&!r.has(a.v)&&i(a.v))return!0;return!1}return i(t)}function Ze(e){e.graph().dummyChains=[],e.edges().forEach(t=>Qe(e,t))}function Qe(e,t){let n=t.v,r=e.node(n).rank,i=t.w,a=e.node(i).rank,o=t.name,s=e.edge(t),c=s.labelRank;if(a===r+1)return;e.removeEdge(t);let l,u,d=0;for(++r;r<a;++d,++r)s.points=[],u={width:0,height:0,edgeLabel:s,edgeObj:t,rank:r},l=F(e,`edge`,u,`_d`),r===c&&(u.width=s.width,u.height=s.height,u.dummy=`edge-label`,u.labelpos=s.labelpos),e.setEdge(n,l,{weight:s.weight},o),d===0&&e.graph().dummyChains.push(l),n=l;e.setEdge(n,i,{weight:s.weight},o)}function $e(e){e.graph().dummyChains.forEach(t=>{let n=e.node(t),r=n.edgeLabel,i;for(e.setEdge(n.edgeObj,r);n.dummy;)i=e.successors(t)[0],e.removeNode(t),r.points.push({x:n.x,y:n.y}),n.dummy===`edge-label`&&(r.x=n.x,r.y=n.y,r.width=n.width,r.height=n.height),t=i,n=e.node(t)})}function G(e){let t={};function n(r){let i=e.node(r);if(Object.hasOwn(t,r))return i.rank;t[r]=!0;let a=e.outEdges(r),o=a?a.map(t=>t==null?1/0:n(t.w)-e.edge(t).minlen):[],s=L(Math.min,o);return s===1/0&&(s=0),i.rank=s}e.sources().forEach(n)}function K(e,t){return e.node(t.w).rank-e.node(t.v).rank-e.edge(t).minlen}var et=tt;function tt(e){let t=new P({directed:!1}),n=e.nodes();if(n.length===0)throw Error(`Graph must have at least one node`);let r=n[0],i=e.nodeCount();t.setNode(r,{});let a,o;for(;nt(t,e)<i&&(a=rt(t,e),a);)o=t.hasNode(a.v)?K(e,a):-K(e,a),it(t,e,o);return t}function nt(e,t){function n(r){let i=t.nodeEdges(r);i&&i.forEach(i=>{let a=i.v,o=r===a?i.w:a;!e.hasNode(o)&&!K(t,i)&&(e.setNode(o,{}),e.setEdge(r,o,{}),n(o))})}return e.nodes().forEach(n),e.nodeCount()}function rt(e,t){return t.edges().reduce((n,r)=>{let i=1/0;return e.hasNode(r.v)!==e.hasNode(r.w)&&(i=K(t,r)),i<n[0]?[i,r]:n},[1/0,null])[1]}function it(e,t,n){e.nodes().forEach(e=>t.node(e).rank+=n)}var{preorder:at,postorder:ot}=O,st=q;q.initLowLimValues=Y,q.initCutValues=J,q.calcCutValue=lt,q.leaveEdge=dt,q.enterEdge=ft,q.exchangeEdges=pt;function q(e){e=we(e),G(e);let t=et(e);Y(t),J(t,e);let n,r;for(;n=dt(t);)r=ft(t,e,n),pt(t,e,n,r)}function J(e,t){let n=ot(e,e.nodes());n=n.slice(0,n.length-1),n.forEach(n=>ct(e,t,n))}function ct(e,t,n){let r=e.node(n).parent,i=e.edge(n,r);i.cutvalue=lt(e,t,n)}function lt(e,t,n){let r=e.node(n).parent,i=!0,a=t.edge(n,r),o=0;a||=(i=!1,t.edge(r,n)),o=a.weight;let s=t.nodeEdges(n);return s&&s.forEach(a=>{let s=a.v===n,c=s?a.w:a.v;if(c!==r){let r=s===i,l=t.edge(a).weight;if(o+=r?l:-l,ht(e,n,c)){let t=e.edge(n,c).cutvalue;o+=r?-t:t}}}),o}function Y(e,t){arguments.length<2&&(t=e.nodes()[0]),ut(e,{},1,t)}function ut(e,t,n,r,i){let a=n,o=e.node(r);t[r]=!0;let s=e.neighbors(r);return s&&s.forEach(i=>{Object.hasOwn(t,i)||(n=ut(e,t,n,i,r))}),o.low=a,o.lim=n++,i?o.parent=i:delete o.parent,n}function dt(e){return e.edges().find(t=>e.edge(t).cutvalue<0)}function ft(e,t,n){let r=n.v,i=n.w;t.hasEdge(r,i)||(r=n.w,i=n.v);let a=e.node(r),o=e.node(i),s=a,c=!1;return a.lim>o.lim&&(s=o,c=!0),t.edges().filter(t=>c===gt(e,e.node(t.v),s)&&c!==gt(e,e.node(t.w),s)).reduce((e,n)=>K(t,n)<K(t,e)?n:e)}function pt(e,t,n,r){let i=n.v,a=n.w;e.removeEdge(i,a),e.setEdge(r.v,r.w,{}),Y(e),J(e,t),mt(e,t)}function mt(e,t){let n=e.nodes().find(t=>!e.node(t).parent);if(!n)return;let r=at(e,[n]);r=r.slice(1),r.forEach(n=>{let r=e.node(n).parent,i=t.edge(n,r),a=!1;i||(i=t.edge(r,n),a=!0),t.node(n).rank=t.node(r).rank+(a?i.minlen:-i.minlen)})}function ht(e,t,n){return e.hasEdge(t,n)}function gt(e,t,n){return n.low<=t.lim&&t.lim<=n.lim}var _t=vt;function vt(e){let t=e.graph().ranker;if(typeof t==`function`)return t(e);switch(t){case`network-simplex`:xt(e);break;case`tight-tree`:bt(e);break;case`longest-path`:yt(e);break;case`none`:break;default:xt(e)}}var yt=G;function bt(e){G(e),et(e)}function xt(e){st(e)}var St=Ct;function Ct(e){let t=Tt(e),n=e.graph();Array.isArray(n.dummyChains)&&n.dummyChains.forEach(n=>{let r=e.node(n),i=r.edgeObj,a=wt(e,t,i.v,i.w),o=a.path,s=a.lca,c=0,l=o[c],u=!0;for(;n!==i.w;){if(r=e.node(n),u){for(;(l=o[c])!==s&&e.node(l).maxRank<r.rank;)c++;l===s&&(u=!1)}if(!u){for(;c<o.length-1&&e.node(o[c+1]).minRank<=r.rank;)c++;l=o[c]}l!==void 0&&e.setParent(n,l),n=e.successors(n)[0]}})}function wt(e,t,n,r){let i=[],a=[],o=Math.min(t[n].low,t[r].low),s=Math.max(t[n].lim,t[r].lim),c;c=n;do c=e.parent(c),i.push(c);while(c&&(t[c].low>o||s>t[c].lim));let l=c,u=r;for(;(u=e.parent(u))!==l;)a.push(u);return{path:i.concat(a.reverse()),lca:l}}function Tt(e){let t={},n=0;function r(i){let a=n;e.children(i).forEach(r),t[i]={low:a,lim:n++}}return e.children(H).forEach(r),t}function Et(e){let t=F(e,`root`,{},`_root`),n=Ot(e),r=Object.values(n),i=L(Math.max,r)-1,a=2*i+1;e.graph().nestingRoot=t,e.edges().forEach(t=>e.edge(t).minlen*=a);let o=kt(e)+1;e.children(H).forEach(r=>{Dt(e,t,a,o,i,n,r)}),e.graph().nodeRankFactor=a}function Dt(e,t,n,r,i,a,o){let s=e.children(o);if(!s.length){o!==t&&e.setEdge(t,o,{weight:0,minlen:n});return}let c=ke(e,`_bt`),l=ke(e,`_bb`),u=e.node(o);e.setParent(c,o),u.borderTop=c,e.setParent(l,o),u.borderBottom=l,s.forEach(s=>{Dt(e,t,n,r,i,a,s);let u=e.node(s),d=u.borderTop?u.borderTop:s,f=u.borderBottom?u.borderBottom:s,p=u.borderTop?r:2*r,m=d===f?i-(a[o]??0)+1:1;e.setEdge(c,d,{weight:p,minlen:m,nestingEdge:!0}),e.setEdge(f,l,{weight:p,minlen:m,nestingEdge:!0})}),e.parent(o)||e.setEdge(t,c,{weight:0,minlen:i+(a[o]??0)})}function Ot(e){let t={};function n(r,i){let a=e.children(r);a&&a.length&&a.forEach(e=>n(e,i+1)),t[r]=i}return e.children(H).forEach(e=>n(e,1)),t}function kt(e){return e.edges().reduce((t,n)=>t+e.edge(n).weight,0)}function At(e){let t=e.graph();e.removeNode(t.nestingRoot),delete t.nestingRoot,e.edges().forEach(t=>{e.edge(t).nestingEdge&&e.removeEdge(t)})}var jt=Mt;function Mt(e){function t(n){let r=e.children(n),i=e.node(n);if(r.length&&r.forEach(t),i&&Object.hasOwn(i,`minRank`)){i.borderLeft=[],i.borderRight=[];for(let t=i.minRank,r=i.maxRank+1;t<r;++t)Nt(e,`borderLeft`,`_bl`,n,i,t),Nt(e,`borderRight`,`_br`,n,i,t)}}e.children(H).forEach(t)}function Nt(e,t,n,r,i,a){let o={width:0,height:0,rank:a,borderType:t},s=i[t][a-1],c=F(e,`border`,o,n);i[t][a]=c,e.setParent(c,r),s&&e.setEdge(s,c,{weight:1})}function Pt(e){let t=e.graph().rankdir?.toLowerCase();(t===`lr`||t===`rl`)&&It(e)}function Ft(e){let t=e.graph().rankdir?.toLowerCase();(t===`bt`||t===`rl`)&&Rt(e),(t===`lr`||t===`rl`)&&(zt(e),It(e))}function It(e){e.nodes().forEach(t=>Lt(e.node(t))),e.edges().forEach(t=>Lt(e.edge(t)))}function Lt(e){let t=e.width;e.width=e.height,e.height=t}function Rt(e){e.nodes().forEach(t=>X(e.node(t))),e.edges().forEach(t=>{var n;let r=e.edge(t);(n=r.points)==null||n.forEach(X),Object.hasOwn(r,`y`)&&X(r)})}function X(e){e.y=-e.y}function zt(e){e.nodes().forEach(t=>Z(e.node(t))),e.edges().forEach(t=>{var n;let r=e.edge(t);(n=r.points)==null||n.forEach(Z),Object.hasOwn(r,`x`)&&Z(r)})}function Z(e){let t=e.x;e.x=e.y,e.y=t}function Bt(e,t=null){let n={},r=e.nodes().filter(t=>!e.children(t).length),i=r.map(t=>e.node(t).rank),a=z(L(Math.max,i)+1).map(()=>[]);function o(t){if(n[t])return;n[t]=!0;let r=e.node(t);a[r.rank].push(t);let i=e.successors(t);i&&[...i].sort((e,t)=>s(e,t)).forEach(o)}r.sort((t,n)=>e.node(t).rank-e.node(n).rank).forEach(o);function s(n,r){return Le(t,e.node(n),e.node(r))}return a}function Vt(e,t){let n=0;for(let r=1;r<t.length;++r)n+=Ht(e,t[r-1],t[r]);return n}function Ht(e,t,n){let r=Ie(n,n.map((e,t)=>t)),i=t.flatMap(t=>{let n=e.outEdges(t);return n?n.map(t=>({pos:r[t.w],weight:e.edge(t).weight})).sort((e,t)=>e.pos-t.pos):[]}),a=1;for(;a<n.length;)a<<=1;let o=2*a-1;--a;let s=Array(o).fill(0),c=0;return i.forEach(e=>{let t=e.pos+a;s[t]+=e.weight;let n=0;for(;t>0;)t%2&&(n+=s[t+1]),t=t-1>>1,s[t]+=e.weight;c+=e.weight*n}),c}function Ut(e,t=[]){return t.map(t=>{let n=e.inEdges(t);if(!n||!n.length)return{v:t};{let r=n.reduce((t,n)=>{let r=e.edge(n),i=e.node(n.v);return{sum:t.sum+r.weight*i.order,weight:t.weight+r.weight}},{sum:0,weight:0});return{v:t,barycenter:r.sum/r.weight,weight:r.weight}}})}function Wt(e,t){let n={};return e.forEach((e,t)=>{let r={indegree:0,in:[],out:[],vs:[e.v],i:t};e.barycenter!==void 0&&(r.barycenter=e.barycenter,r.weight=e.weight),n[e.v]=r}),t.edges().forEach(e=>{let t=n[e.v],r=n[e.w];t!==void 0&&r!==void 0&&(r.indegree++,t.out.push(r))}),Gt(Object.values(n).filter(e=>!e.indegree))}function Gt(e){let t=[];function n(e){return t=>{t.merged||(t.barycenter===void 0||e.barycenter===void 0||t.barycenter>=e.barycenter)&&Kt(e,t)}}function r(t){return n=>{n.in.push(t),--n.indegree===0&&e.push(n)}}for(;e.length;){let i=e.pop();t.push(i),i.in.reverse().forEach(n(i)),i.out.forEach(r(i))}return t.filter(e=>!e.merged).map(e=>B(e,[`vs`,`i`,`barycenter`,`weight`]))}function Kt(e,t){let n=0,r=0;e.weight&&(n+=e.barycenter*e.weight,r+=e.weight),t.weight&&(n+=t.barycenter*t.weight,r+=t.weight),e.vs=t.vs.concat(e.vs),e.barycenter=n/r,e.weight=r,e.i=Math.min(t.i,e.i),t.merged=!0}function qt(e,t,n,r,i){let a={},o=null,s=null,c=i;typeof t==`boolean`?(c=t,a={}):t&&(a=t,o=n??null,s=r??null);let l=Ne(e,e=>Object.hasOwn(e,`barycenter`)),u=l.lhs,d=l.rhs.sort((e,t)=>t.i-e.i),f=[],p=0,m=0,h=0;u.sort(Yt(s,o,!!c));for(let[e,t]of Object.entries(a)){let n=u.findIndex(t=>t.vs[0]===e);u.splice(n+1,0,t)}h=Jt(f,d,h),u.forEach(e=>{h+=e.vs.length,f.push(e.vs),p+=e.barycenter*e.weight,m+=e.weight,h=Jt(f,d,h)});let g={vs:f.flat(1)};return m&&(g.barycenter=p/m,g.weight=m),g}function Jt(e,t,n){let r;for(;t.length&&(r=t[t.length-1]).i<=n;)t.pop(),e.push(r.vs),n++;return n}function Yt(e,t,n){return(r,i)=>{if(r.barycenter<i.barycenter)return-1;if(r.barycenter>i.barycenter)return 1;if(e&&(typeof r.vs[0]==`string`||typeof i.vs[0]==`string`)){let n=Le(t,e.node(r.vs[0]),e.node(i.vs[0]));if(n!==0)return n}return n?i.i-r.i:r.i-i.i}}function Xt(e,t,n,r,i){var a,o;let s=null,c=i;typeof r==`boolean`?(c=r,s=null):r!==void 0&&(s=r);let l=e.children(t),u=e.node(t),d=u?u.borderLeft:void 0,f=u?u.borderRight:void 0,p={};d&&(l=l.filter(e=>e!==d&&e!==f));let m=Ut(e,l);m.forEach(t=>{if(e.children(t.v).length){let{result:r}=Xt(e,t.v,n,s,c);p[t.v]=r,Object.hasOwn(r,`barycenter`)&&Qt(t,r)}});let h=Wt(m,n);Zt(h,p);let g={},_=!1;for(let t=0;t<h.length;t++)for(let n=t+1;n<h.length;n++)if(h[t]&&h[n]&&(a=h[t])!=null&&a.barycenter&&(o=h[n])!=null&&o.barycenter&&h[t]?.barycenter===h[n].barycenter){let r=h[t]?.vs[0]??``,i=h[n]?.vs[0]??``,a=e.node(r),o=e.node(i);if(a.dummy===`edge`&&o.dummy===`edge`&&a.edgeObj?.v===o.edgeObj?.v&&a.edgeObj?.w===o.edgeObj?.w){if(a.edgeLabel.reversed){g[i]=h[t],h.splice(t,1),t--;break}g[r]=h[n],h.splice(n,1),n--}else _=!0}let v=qt(h,g,s,e,c);if(d&&f){v.vs=[d,v.vs,f].flat(1);let t=e.predecessors(d);if(t&&t.length){let n=e.node(t[0]),r=e.predecessors(f),i=e.node(r[0]);Object.hasOwn(v,`barycenter`)||(v.barycenter=0,v.weight=0),v.barycenter=(v.barycenter*v.weight+n.order+i.order)/(v.weight+2),v.weight+=2}}return Object.defineProperty(v,"result",{value:v,enumerable:!1,configurable:!0,writable:!0}),Object.defineProperty(v,"usedBias",{value:_,enumerable:!1,configurable:!0,writable:!0}),v}function Zt(e,t){e.forEach(e=>{e.vs=e.vs.flatMap(e=>t[e]?t[e].vs:e)})}function Qt(e,t){e.barycenter===void 0?(e.barycenter=t.barycenter,e.weight=t.weight):(e.barycenter=(e.barycenter*e.weight+t.barycenter*t.weight)/(e.weight+t.weight),e.weight+=t.weight)}function $t(e,t,n,r){r||=e.nodes();let i=en(e),a=new P({compound:!0}).setGraph({root:i}).setDefaultNodeLabel(t=>e.node(t));return r.forEach(r=>{let o=e.node(r),s=e.parent(r);if(o.rank===t||o.minRank<=t&&t<=o.maxRank){a.setNode(r),a.setParent(r,s||i);let c=e[n](r);c&&c.forEach(t=>{let n=t.v===r?t.w:t.v,i=a.edge(n,r),o=i===void 0?0:i.weight;a.setEdge(n,r,{weight:e.edge(t).weight+o})}),Object.hasOwn(o,`minRank`)&&a.setNode(r,{borderLeft:o.borderLeft[t],borderRight:o.borderRight[t]})}}),a}function en(e){let t;for(;e.hasNode(t=R(`_root`)););return t}function tn(e,t,n){let r={},i;n.forEach(n=>{let a=e.parent(n),o,s;for(;a;){if(o=e.parent(a),o?(s=r[o],r[o]=a):(s=i,i=a),s&&s!==a){t.setEdge(s,a);return}a=o}})}function nn(e,t={},n=null){if(typeof t.customOrder==`function`){t.customOrder(e,nn);return}let r=Me(e),i=rn(e,z(1,r+1),`inEdges`),a=rn(e,z(r-1,-1,-1),`outEdges`),o=Bt(e,n);if(on(e,o),t.disableOptimalOrderHeuristic)return;let s=1/0,c,l=t.constraints||[];for(let t=0,r=0;r<4;++t,++r){an(t%2?i:a,t%4>=2,l,n),o=I(e);let u=Vt(e,o);u<s?(r=0,c=Object.assign({},o),s=u):u===s&&(c=structuredClone(o))}on(e,c)}function rn(e,t,n){let r=new Map,i=(e,t)=>{r.has(e)||r.set(e,[]),r.get(e).push(t)};for(let t of e.nodes()){let n=e.node(t);if(typeof n.rank==`number`&&i(n.rank,t),typeof n.minRank==`number`&&typeof n.maxRank==`number`)for(let e=n.minRank;e<=n.maxRank;e++)e!==n.rank&&i(e,t)}return t.map(function(t){return $t(e,t,n,r.get(t)||[])})}function an(e,t,n,r){let i=!0,a=new P;e.forEach(function(e){n.forEach(e=>a.setEdge(e.left,e.right));let o=e.graph().root,{result:s,usedBias:c}=Xt(e,o,a,r,i);t&&c&&(i=!i),s.vs.forEach((t,n)=>e.node(t).order=n),tn(e,a,s.vs)})}function on(e,t){Object.values(t).forEach(t=>t.forEach((t,n)=>e.node(t).order=n))}function sn(e,t){let n={};function r(t,r){let i=0,a=0,o=t.length,s=r[r.length-1];return r.forEach((t,c)=>{let l=ln(e,t),u=l?e.node(l).order:o;(l||t===s)&&(r.slice(a,c+1).forEach(t=>{let r=e.predecessors(t);r&&r.forEach(r=>{let a=e.node(r),o=a.order;(o<i||u<o)&&!(a.dummy&&e.node(t).dummy)&&un(n,r,t)})}),a=c+1,i=u)}),r}return t.length&&t.reduce(r),n}function cn(e,t){let n={};function r(t,r,i,a,o){z(r,i).forEach(r=>{let i=t[r];if(i!==void 0&&e.node(i).dummy){let t=e.predecessors(i);t&&t.forEach(t=>{if(t===void 0)return;let r=e.node(t);r.dummy&&(r.order<a||r.order>o)&&un(n,t,i)})}})}function i(t,n){let i=-1,a=-1,o=0;return n.forEach((s,c)=>{if(e.node(s).dummy===`border`){let t=e.predecessors(s);if(t&&t.length){let s=t[0];if(s===void 0)return;a=e.node(s).order,r(n,o,c,i,a),o=c,i=a}}r(n,o,n.length,a,t.length)}),n}return t.length&&t.reduce(i),n}function ln(e,t){if(e.node(t).dummy){let n=e.predecessors(t);if(n)return n.find(t=>e.node(t).dummy)}}function un(e,t,n){if(t>n){let e=t;t=n,n=e}let r=e[t];r||(e[t]=r={}),r[n]=!0}function dn(e,t,n){if(t>n){let e=t;t=n,n=e}let r=e[t];return r!==void 0&&Object.hasOwn(r,n)}function fn(e,t,n,r,i){let a={},o={},s={};return t.forEach(e=>{e.forEach((e,t)=>{a[e]=e,o[e]=e,s[e]=t})}),t.forEach(t=>{let c=-1,l=-1,u=!1,d=t,f=t.findIndex(t=>i?.includes(t)||xn(t,e,i));f>0&&(d=[t[f],...t.slice(0,f),...t.slice(f+1)],u=!0),d.forEach(t=>{let d=r(t);if(d&&d.length){i!=null&&i.includes(t)&&(d=d.filter(t=>xn(t,e,i)));let r=d.sort((e,t)=>{let n=s[e],r=s[t];return(n===void 0?0:n)-(r===void 0?0:r)}),f=(r.length-1)/2;for(let e=Math.floor(f),i=Math.ceil(f);e<=i;++e){let i=r[e];if(i===void 0)continue;let d=s[i];if(d!==void 0&&o[t]===t&&c<d&&s[i]!==l&&!dn(n,t,i)){let e=a[i];e!==void 0&&(o[i]=t,o[t]=a[t]=e,c=d,u&&=(c=-1,l=s[i]??-1,!1))}}}})}),{root:a,align:o}}function pn(e,t,n,r,i=!1){let a={},o=mn(e,t,n,i),s=i?`borderLeft`:`borderRight`;function c(e,t){let n=o.nodes().slice(),r={},i=n.pop();for(;i;){if(r[i])e(i);else{r[i]=!0,n.push(i);for(let e of t(i))n.push(e)}i=n.pop()}}function l(e){let t=o.inEdges(e);t?a[e]=t.reduce((e,t)=>{let n=a[t.v]??0,r=o.edge(t);return Math.max(e,n+(r===void 0?0:r))},0):a[e]=0}function u(t){let n=o.outEdges(t),r=1/0;n&&(r=n.reduce((e,t)=>{let n=a[t.w],r=o.edge(t);return Math.min(e,(n===void 0?0:n)-(r===void 0?0:r))},1/0));let i=e.node(t);r!==1/0&&i.borderType!==s&&(a[t]=Math.max(a[t]===void 0?0:a[t],r))}function d(e){return o.predecessors(e)||[]}function f(e){return o.successors(e)||[]}return c(l,d),c(u,f),Object.keys(r).forEach(e=>{let t=n[e];t!==void 0&&(a[e]=a[t]??0)}),a}function mn(e,t,n,r){let i=new P,a=e.graph(),o=yn(a.nodesep,a.edgesep,r);return t.forEach(t=>{let r;t.forEach(t=>{let a=n[t];if(a!==void 0){if(i.setNode(a),r!==void 0){let s=n[r];if(s!==void 0){let n=i.edge(s,a);i.setEdge(s,a,Math.max(o(e,t,r),n||0))}}r=t}})}),i}function hn(e,t){return Object.values(t).reduce((t,n)=>{let r=-1/0,i=1/0;Object.entries(n).forEach(([t,n])=>{let a=bn(e,t)/2;r=Math.max(n+a,r),i=Math.min(n-a,i)});let a=r-i;return a<t[0]&&(t=[a,n]),t},[1/0,null])[1]}function gn(e,t){let n=Object.values(t),r=L(Math.min,n),i=L(Math.max,n);[`u`,`d`].forEach(n=>{[`l`,`r`].forEach(a=>{let o=n+a,s=e[o];if(!s||s===t)return;let c=Object.values(s),l=r-L(Math.min,c);a!==`l`&&(l=i-L(Math.max,c)),l&&(e[o]=V(s,e=>e+l))})})}function _n(e,t=void 0){let n=e.ul;return n?V(n,(n,r)=>{if(t){let n=e[t.toLowerCase()];if(n&&n[r]!==void 0)return n[r]}let i=Object.values(e).map(e=>{let t=e[r];return t===void 0?0:t}).sort((e,t)=>e-t);return((i[1]??0)+(i[2]??0))/2}):{}}function vn(e,t){let n=I(e),r=Object.assign(sn(e,n),cn(e,n)),i={},a;return[`u`,`d`].forEach(o=>{a=o===`u`?n:Object.values(n).reverse(),[`l`,`r`].forEach(n=>{n===`r`&&(a=a.map(e=>Object.values(e).reverse()));let s=fn(e,a,r,t=>(o===`u`?e.predecessors(t):e.successors(t))||[],t),c=pn(e,a,s.root,s.align,n===`r`);n===`r`&&(c=V(c,e=>-e)),i[o+n]=c})}),gn(i,hn(e,i)),_n(i,e.graph().align)}function yn(e,t,n){return(r,i,a)=>{let o=r.node(i),s=r.node(a),c=0,l;if(c+=o.width/2,Object.hasOwn(o,`labelpos`))switch(o.labelpos.toLowerCase()){case`l`:l=-o.width/2;break;case`r`:l=o.width/2}if(l&&(c+=n?l:-l),l=void 0,c+=(o.dummy?t:e)/2,c+=(s.dummy?t:e)/2,c+=s.width/2,Object.hasOwn(s,`labelpos`))switch(s.labelpos.toLowerCase()){case`l`:l=s.width/2;break;case`r`:l=-s.width/2}return l&&(c+=n?l:-l),c}}function bn(e,t){return e.node(t).width}function xn(e,t,n){if(!n)return!1;let r=t.node(e)?.edgeObj;if(!r||t.node(e).edgeLabel.reversed)return!1;let i=n.indexOf(r?.v),a=n.indexOf(r?.w);return i!==-1&&a!==-1&&i===(a+1)%n.length||i===(a-1)%n.length}function Sn(e,t){e=Te(e),Cn(e),Object.entries(vn(e,t)).forEach(([t,n])=>e.node(t).x=n)}function Cn(e){let t=I(e),n=e.graph(),r=n.ranksep,i=n.rankalign,a=0;t.forEach(t=>{let n=t.reduce((t,n)=>{let r=e.node(n).height??0;return t>r?t:r},0);t.forEach(t=>{let r=e.node(t);r.y=i===`top`?a+r.height/2:i===`bottom`?a+n-r.height/2:a+n/2}),a+=n+r})}var wn=new WeakMap;function Tn(e,t={}){return Dn(e,Pe,t),e}function En(e,t,n){let r=t;for(;r!==void 0;){let t=e.parent(r);if(t===n)return r;r=t}}function Dn(e,t,n){let r=e.nodes().filter(t=>e.children(t).length),i={};r.forEach(r=>{let a=e.node(r);if(a&&a.rankdir){let o=new P({multigraph:!0,compound:!0});o.setGraph({rankdir:a.rankdir});let s=e.children(r);s.forEach(t=>{let n={...e.node(t)};o.setNode(t,n);let i=e.parent(t);i&&i!==r&&s.includes(i)&&o.setParent(t,i)});let c=new Set;e.edges().forEach(t=>{let n=En(e,t.v,r),i=En(e,t.w,r);if(n&&i&&n!==i){let r=`${n}\0${i}`;c.has(r)||(c.add(r),o.setEdge(n,i,{...e.edge(t)}))}}),Dn(o,t,n);let l=Rn(o);On(l,t,n,null),kn(o,l);let u=1/0,d=1/0,f=-1/0,p=-1/0;o.nodes().forEach(e=>{if(e===r)return;let t=o.node(e);t&&typeof t.x==`number`&&typeof t.y==`number`&&typeof t.width==`number`&&typeof t.height==`number`&&(u=Math.min(u,t.x-t.width/2),f=Math.max(f,t.x+t.width/2),d=Math.min(d,t.y-t.height/2),p=Math.max(p,t.y+t.height/2))}),(!isFinite(u)||!isFinite(d)||!isFinite(f)||!isFinite(p))&&(u=d=0,f=p=0);let m=f-u,h=p-d;i[r]={minX:u,minY:d,maxX:f,maxY:p,width:m,height:h,offsetX:u,offsetY:d},a._dagreClusterSubgraph=o}});let a=[],o=t=>{let n=[],r=(e.children(t)||[]).filter(e=>e!==t);for(;r.length>0;){let t=r.shift();n.push(t),(e.children(t)||[]).filter(e=>e!==t).forEach(e=>r.push(e))}return n},s=new Map;r.forEach(t=>{let n=e.node(t);n&&n.rankdir&&i[t]&&s.set(t,(e.children(t)||[]).filter(e=>e!==t))});let c=new Set([...s.values()].flat()),l=new Map;s.forEach((e,t)=>{c.has(t)||l.set(t,o(t))});let u=new Set([...l.values()].flat()),d=e=>{for(let[t,n]of l)if(n.includes(e))return t;return e},f=[];e.edges().forEach(t=>{(u.has(t.v)||u.has(t.w))&&f.push({edge:t,label:e.edge(t)})});let p=new Map;u.forEach(t=>{let n=e.parent(t);p.set(t,typeof n==`string`?n:void 0)}),l.forEach((t,n)=>{let r=e.node(n),o=[];t.forEach(t=>{let n=e.node(t);n&&(o.push({id:t,node:n,parent:p.get(t)}),e.removeNode(t))});let s=f.filter(({edge:e})=>t.includes(e.v)||t.includes(e.w)),c=i[n];r&&(a.push({clusterId:n,subgraph:r._dagreClusterSubgraph,bounds:c,children:t,removedNodes:o,removedEdges:s}),r.width=c.width,r.height=c.height)});let m=new Set;f.forEach(({edge:t,label:n})=>{let r=d(t.v),i=d(t.w);if(r!==i&&e.hasNode(r)&&e.hasNode(i)){let t=`${r}\0${i}`;m.has(t)||(m.add(t),e.setEdge(r,i,{...n,width:0,height:0}))}});let h=Rn(e),g=On(h,t,n,wn.get(e)??null);wn.set(e,g),kn(e,h),m.forEach(t=>{let n=t.indexOf(`\0`),r=t.slice(0,n),i=t.slice(n+1);e.hasEdge(r,i)&&e.removeEdge(r,i)}),a.forEach(({clusterId:t,subgraph:n,bounds:r,removedNodes:i,removedEdges:a})=>{let o=e.node(t),s=o?.x??0,c=o?.y??0,l=(r.minX+r.maxX)/2,u=(r.minY+r.maxY)/2;i.forEach(({id:t,node:n,parent:r})=>{e.setNode(t,n),r!==void 0&&e.setParent(t,r)}),a.forEach(({edge:t,label:n})=>{e.setEdge(t,n)}),n.nodes().forEach(r=>{if(r===t)return;let i=n.node(r),a=e.node(r);a&&i&&typeof i.x==`number`&&typeof i.y==`number`&&(a.x=s+(i.x-l),a.y=c+(i.y-u))}),delete o._dagreClusterSubgraph}),r.forEach(t=>{let n=e.node(t),r=i[t];if(n&&n.rankdir&&n._dagreClusterSubgraph&&r){let i=n._dagreClusterSubgraph,a=n.x??0,o=n.y??0,s=(r.minX+r.maxX)/2,c=(r.minY+r.maxY)/2;i.nodes().forEach(n=>{if(n===t)return;let r=i.node(n),l=e.node(n);if(l&&r&&typeof r.x==`number`&&typeof r.y==`number`){let e=r.x-s,t=r.y-c;l.x=a+e,l.y=o+t}}),delete n._dagreClusterSubgraph}})}function On(e,t,n,r=null){var i,a;let o=n?.useDynamic!==!1,s=o&&(i=r?.graph)!=null?i:null,c=o&&(a=r?.rawNodes)!=null?a:null;t(` makeSpaceForEdgeLabels`,()=>zn(e)),t(` removeSelfEdges`,()=>Jn(e)),t(` acyclic`,()=>qe(e,s)),t(` nestingGraph.run`,()=>Et(e)),t(` rank`,()=>_t(Te(e))),t(` injectEdgeLabelProxies`,()=>Bn(e)),t(` removeEmptyRanks`,()=>Oe(e)),t(` nestingGraph.cleanup`,()=>At(e)),t(` normalizeRanks`,()=>De(e)),t(` assignRankMinMax`,()=>Vn(e)),t(` removeEdgeLabelProxies`,()=>Hn(e)),t(` normalize.run`,()=>Ze(e)),t(` parentDummyChains`,()=>St(e)),t(` addBorderSegments`,()=>jt(e)),t(` order`,()=>nn(e,n,c)),t(` insertSelfEdges`,()=>Yn(e)),t(` adjustCoordinateSystem`,()=>Pt(e)),t(` position`,()=>Sn(e,n.corePath)),t(` positionSelfEdges`,()=>Xn(e));let l=JSON.parse(JSON.stringify(e._nodes));return t(` removeBorderNodes`,()=>qn(e)),t(` normalize.undo`,()=>$e(e)),t(` fixupEdgeLabelCoords`,()=>Gn(e)),t(` undoCoordinateSystem`,()=>Ft(e)),t(` translateGraph`,()=>Un(e)),t(` assignNodeIntersects`,()=>Wn(e)),t(` reversePoints`,()=>Kn(e)),t(` acyclic.undo`,()=>Ye(e)),{graph:e,rawNodes:l}}function kn(e,t){e.nodes().forEach(n=>{let r=e.node(n),i=t.node(n);r&&(r.x=i.x,r.y=i.y,r.order=i.order,r.rank=i.rank,t.children(n).length&&(r.width=i.width,r.height=i.height))}),e.edges().forEach(n=>{let r=e.edge(n),i=t.edge(n);r.points=i.points,Object.hasOwn(i,`x`)&&(r.x=i.x,r.y=i.y)}),e.graph().width=t.graph().width,e.graph().height=t.graph().height}var An=[`nodesep`,`edgesep`,`ranksep`,`marginx`,`marginy`],jn={ranksep:50,edgesep:20,nodesep:50,rankdir:`TB`,rankalign:`center`},Mn=[`acyclicer`,`ranker`,`rankdir`,`align`,`rankalign`],Nn=[`width`,`height`,`rank`],Pn={width:0,height:0},Fn=[`minlen`,`weight`,`width`,`height`,`labeloffset`],In={minlen:1,weight:1,width:0,height:0,labeloffset:10,labelpos:`r`},Ln=[`labelpos`];function Rn(e){let t=new P({multigraph:!0,compound:!0}),n=Qn(e.graph());return t.setGraph(Object.assign({},jn,Zn(n,An),B(n,Mn))),e.nodes().forEach(n=>{let r=Zn(Qn(e.node(n)),Nn);Object.keys(Pn).forEach(e=>{r[e]===void 0&&(r[e]=Pn[e])}),t.setNode(n,r);let i=e.parent(n);i!==void 0&&t.setParent(n,i)}),e.edges().forEach(n=>{let r=Qn(e.edge(n));t.setEdge(n,Object.assign({},In,Zn(r,Fn),B(r,Ln)))}),t}function zn(e){let t=e.graph();t.ranksep/=2,e.edges().forEach(n=>{let r=e.edge(n);r.minlen*=2,(r.labelpos??`r`).toLowerCase()!==`c`&&(t.rankdir===`TB`||t.rankdir===`BT`?r.width+=r.labeloffset:r.height+=r.labeloffset)})}function Bn(e){e.edges().forEach(t=>{let n=e.edge(t);if(n.width&&n.height){let n=e.node(t.v);F(e,`edge-proxy`,{rank:(e.node(t.w).rank-n.rank)/2+n.rank,e:t},`_ep`)}})}function Vn(e){let t=0;e.nodes().forEach(n=>{let r=e.node(n);r.borderTop&&(r.minRank=e.node(r.borderTop).rank,r.maxRank=e.node(r.borderBottom).rank,t=Math.max(t,r.maxRank))}),e.graph().maxRank=t}function Hn(e){e.nodes().forEach(t=>{let n=e.node(t);if(n.dummy===`edge-proxy`){let r=n;e.edge(r.e).labelRank=n.rank,e.removeNode(t)}})}function Un(e){let t=1/0,n=0,r=1/0,i=0,a=e.graph(),o=a.marginx||0,s=a.marginy||0;function c(e){let a=e.x,o=e.y,s=e.width,c=e.height;t=Math.min(t,a-s/2),n=Math.max(n,a+s/2),r=Math.min(r,o-c/2),i=Math.max(i,o+c/2)}e.nodes().forEach(t=>c(e.node(t))),e.edges().forEach(t=>{let n=e.edge(t);Object.hasOwn(n,`x`)&&c(n)}),t-=o,r-=s,e.nodes().forEach(n=>{let i=e.node(n);i.x-=t,i.y-=r}),e.edges().forEach(n=>{let i=e.edge(n);i.points.forEach(e=>{e.x-=t,e.y-=r}),Object.hasOwn(i,`x`)&&(i.x-=t),Object.hasOwn(i,`y`)&&(i.y-=r)}),a.width=n-t+o,a.height=i-r+s}function Wn(e){e.edges().forEach(t=>{if(t.v===t.w)return;let n=e.edge(t),r=e.node(t.v),i=e.node(t.w),a,o;n.points?(a=n.points[0],o=n.points[n.points.length-1]):(n.points=[],a=i,o=r),n.points.unshift(Ee(r,a)),n.points.push(Ee(i,o))})}function Gn(e){e.edges().forEach(t=>{let n=e.edge(t);if(Object.hasOwn(n,`x`))switch((n.labelpos===`l`||n.labelpos===`r`)&&(n.width-=n.labeloffset),n.labelpos){case`l`:n.x-=n.width/2+n.labeloffset;break;case`r`:n.x+=n.width/2+n.labeloffset}})}function Kn(e){e.edges().forEach(t=>{let n=e.edge(t);n.reversed&&n.points.reverse()})}function qn(e){e.nodes().forEach(t=>{if(e.children(t).length){let n=e.node(t),r=e.node(n.borderTop),i=e.node(n.borderBottom),a=e.node(n.borderLeft[n.borderLeft.length-1]),o=e.node(n.borderRight[n.borderRight.length-1]);n.width=Math.abs(o.x-a.x),n.height=Math.abs(i.y-r.y),n.x=a.x+n.width/2,n.y=r.y+n.height/2}}),e.nodes().forEach(t=>{e.node(t).dummy===`border`&&e.removeNode(t)})}function Jn(e){e.edges().forEach(t=>{if(t.v===t.w){let n=e.node(t.v);n.selfEdges||=[],n.selfEdges.push({e:t,label:e.edge(t)}),e.removeEdge(t)}})}function Yn(e){I(e).forEach(t=>{let n=0;t.forEach((t,r)=>{let i=e.node(t);typeof i.rank!=`number`&&(i.rank=0),i.order=r+n,(i.selfEdges||[]).forEach(t=>{F(e,`selfedge`,{width:t.label.width,height:t.label.height,rank:i.rank,order:r+ ++n,e:t.e,edgeLabel:t.label},`_se`),(!Array.isArray(t.label.points)||t.label.points.length!==7)&&(t.label.points=[{x:0,y:-10},{x:0,y:-10},{x:0,y:0},{x:0,y:10},{x:0,y:10},{x:0,y:0},{x:0,y:0}])}),delete i.selfEdges})})}function Xn(e){e.nodes().forEach(t=>{let n=e.node(t),r=e=>typeof e==`number`&&isFinite(e);if(n.dummy===`selfedge`){let i=n,a=e.node(i.e.v),o=r(a?.x)?a.x:0,s=r(a?.y)?a.y:0,c=r(a?.width)?a.width:0,l=r(a?.height)?a.height:0,u=r(n.x)?n.x:o,d=r(n.y)?n.y:s,f=c/2,p=l/2;i.edgeLabel.points=[{x:u+f,y:d-p},{x:u+f,y:d-p},{x:u,y:d},{x:u-f,y:d+p},{x:u-f,y:d+p},{x:u,y:d},{x:u,y:d}],i.edgeLabel.x=u,i.edgeLabel.y=d,e.setEdge(i.e,i.edgeLabel),e.removeNode(t)}else n&&Array.isArray(n.selfEdges)&&n.selfEdges.forEach(e=>{if(!Array.isArray(e.label.points)||e.label.points.length!==7){let t=r(n.x)?n.x:0,i=r(n.y)?n.y:0,a=r(n.width)?n.width:0,o=r(n.height)?n.height:0,s=a/2,c=o/2;e.label.points=[{x:t+s,y:i-c},{x:t+s,y:i-c},{x:t,y:i},{x:t-s,y:i+c},{x:t-s,y:i+c},{x:t,y:i},{x:t,y:i}]}})})}function Zn(e,t){return V(B(e,t),Number)}function Qn(e){let t={};return e&&Object.entries(e).forEach(([e,n])=>{typeof e==`string`&&(e=e.toLowerCase()),t[e]=n}),t}var $n={class:`dag-panel`},er={class:`dag-header`},tr=[`viewBox`],nr=[`d`],rr=[`x`,`y`],ir=[`onDblclick`],ar=[`x`,`y`,`width`,`fill`,`stroke`],or=[`x`,`y`,`width`,`fill`,`stroke`],sr=[`x`,`y`,`width`,`fill`,`stroke`],cr=[`x`,`y`],lr={key:1},ur=[`x`,`y`],dr=[`x`,`y`],Q=36,fr=6.6,pr=20,$=110,mr=260,hr=l(s({__name:`DagView`,setup(s){let{notebook:l,orderedCells:h,dagEdges:g}=m(),_=Math.floor(240/fr);function v(e){let t=e.length*fr+pr;return Math.max($,Math.min(mr,t))}let y=i(()=>{let e=h.value.filter(e=>e.variantActive!==!1&&e.language!==`markdown`);if(e.length===0)return{nodes:[],edges:[]};let t=new Map;for(let e of l.variantGroups)t.set(e.group,e.members.length);let n=new ee.Graph;n.setGraph({rankdir:`TB`,nodesep:24,ranksep:48,marginx:24,marginy:24}),n.setDefaultEdgeLabel(()=>({}));let r=new Map;for(let t of e){let e=t.annotations?.name,n=t.defines.length?t.defines.join(`, `):null,i=e||n||t.id.slice(0,8);r.set(t.id,v(i))}for(let t of e)n.setNode(t.id,{width:r.get(t.id)??$,height:Q});let i=new Set;for(let e of g.value){let t=`${e.from_cell_id}->${e.to_cell_id}`;i.has(t)||(i.add(t),n.setEdge(e.from_cell_id,e.to_cell_id))}Tn(n);let a=new Map,o=[];for(let i of e){let e=n.node(i.id);if(!e)continue;let s=i.annotations?.name,c=i.defines.length?i.defines.join(`, `):null,l=s||c||i.id.slice(0,8),u=l.length>_?l.slice(0,35)+`…`:l,d=i.variantGroup?t.get(i.variantGroup)??0:0,f={id:i.id,x:e.x,y:e.y,width:r.get(i.id)??$,label:u,fullLabel:l,status:i.status,variantSiblings:d>1?d-1:0,variantGroup:i.variantGroup??null,variantName:i.variantName??null};o.push(f),a.set(i.id,f)}let s=new Map;for(let e of g.value){let t=a.get(e.from_cell_id),n=a.get(e.to_cell_id);if(!t||!n)continue;let r=`${e.from_cell_id}->${e.to_cell_id}`,i=s.get(r);i?i.vars.includes(e.variable)||i.vars.push(e.variable):s.set(r,{from:t,to:n,vars:[e.variable]})}let c=[];for(let[,e]of s){let t=n.edge(e.from.id,e.to.id)?.points??[{x:e.from.x,y:e.from.y+Q/2},{x:e.to.x,y:e.to.y-Q/2}];c.push({from:e.from,to:e.to,variable:e.vars.join(`, `),points:t})}return{nodes:o,edges:c}}),b=i(()=>y.value.nodes),x=i(()=>y.value.edges),S=i(()=>{if(b.value.length===0)return 240;let e=0;for(let t of b.value)e=Math.max(e,t.x+t.width/2);return e+24}),C=i(()=>{if(b.value.length===0)return 100;let e=0;for(let t of b.value)e=Math.max(e,t.y+Q/2);return e+24}),w=a({x:0,y:0}),T=o(1),E=o(!1),D=a({x:0,y:0,panX:0,panY:0}),te=i(()=>{let e=S.value/T.value,t=C.value/T.value;return`${-w.x/T.value} ${-w.y/T.value} ${e} ${t}`});function ne(e){e.preventDefault();let t=e.deltaY>0?.9:1.1,n=Math.max(.3,Math.min(3,T.value*t));T.value=n}function re(e){e.button===0&&(E.value=!0,D.x=e.clientX,D.y=e.clientY,D.panX=w.x,D.panY=w.y)}function O(e){E.value&&(w.x=D.panX+(e.clientX-D.x),w.y=D.panY+(e.clientY-D.y))}function ie(){E.value=!1}function k(){w.x=0,w.y=0,T.value=1}function ae(e){let t=document.querySelector(`[data-testid="notebook-cell"][data-cell-id="${e}"]`);t&&(t.scrollIntoView({behavior:`smooth`,block:`center`}),t.classList.add(`dag-jump-highlight`),setTimeout(()=>t.classList.remove(`dag-jump-highlight`),1500))}function A(e){switch(e){case`ready`:return`var(--accent-success)`;case`running`:return`var(--accent-primary)`;case`stale`:return`var(--accent-warning)`;case`error`:return`var(--accent-danger)`;default:return`var(--text-muted)`}}function j(e){switch(e){case`ready`:return`var(--tint-success)`;case`running`:return`var(--tint-primary)`;case`stale`:return`var(--tint-warning)`;case`error`:return`var(--tint-danger)`;default:return`var(--tint-muted)`}}function oe(e){if(e.length<2)return``;let[t,...n]=e,r=`M ${t.x} ${t.y}`;if(n.length===1)r+=` L ${n[0].x} ${n[0].y}`;else{for(let e=0;e<n.length-1;e+=2){let t=n[e],i=n[e+1]??n[e];r+=` Q ${t.x} ${t.y}, ${i.x} ${i.y}`}n.length%2==1&&(r+=` L ${n[n.length-1].x} ${n[n.length-1].y}`)}return r}return(i,a)=>(p(),e(`div`,$n,[r(`div`,er,[a[0]||=r(`span`,null,`Cell DAG`,-1),r(`button`,{class:`dag-reset`,title:`Reset zoom`,onClick:n(k,[`stop`])},`Reset`)]),r(`div`,{class:`dag-viewport`,onWheel:ne,onMousedown:re,onMousemove:O,onMouseup:ie,onMouseleave:ie},[(p(),e(`svg`,{width:`100%`,height:`100%`,viewBox:te.value,preserveAspectRatio:`xMidYMid meet`,class:`dag-svg`},[a[1]||=r(`defs`,null,[r(`marker`,{id:`arrow`,viewBox:`0 0 10 10`,refX:`10`,refY:`5`,markerWidth:`6`,markerHeight:`6`,orient:`auto-start-reverse`},[r(`path`,{d:`M 0 0 L 10 5 L 0 10 z`,fill:`var(--text-muted)`})])],-1),(p(!0),e(f,null,t(x.value,(t,n)=>(p(),e(`path`,{key:`e`+n,d:oe(t.points),fill:`none`,stroke:`var(--text-muted)`,"stroke-width":`1.5`,"marker-end":`url(#arrow)`},null,8,nr))),128)),(p(!0),e(f,null,t(x.value,(t,n)=>(p(),e(`text`,{key:`el`+n,x:t.points[Math.floor(t.points.length/2)]?.x+6,y:t.points[Math.floor(t.points.length/2)]?.y+3,fill:`var(--cat-surface2)`,"font-size":`9`,"font-family":`JetBrains Mono, Fira Code, monospace`},c(t.variable),9,rr))),128)),(p(!0),e(f,null,t(b.value,t=>(p(),e(`g`,{key:t.id,class:`dag-node`,onDblclick:n(e=>ae(t.id),[`stop`])},[t.variantSiblings>0?(p(),e(f,{key:0},[r(`rect`,{x:t.x-t.width/2+6,y:t.y-Q/2+6,width:t.width,height:Q,rx:`6`,fill:j(t.status),stroke:A(t.status),"stroke-width":`1`,opacity:`0.35`},null,8,ar),r(`rect`,{x:t.x-t.width/2+3,y:t.y-Q/2+3,width:t.width,height:Q,rx:`6`,fill:j(t.status),stroke:A(t.status),"stroke-width":`1`,opacity:`0.65`},null,8,or)],64)):d(``,!0),r(`rect`,{x:t.x-t.width/2,y:t.y-Q/2,width:t.width,height:Q,rx:`6`,fill:j(t.status),stroke:A(t.status),"stroke-width":`1.5`},null,8,sr),r(`text`,{x:t.x,y:t.y+4,"text-anchor":`middle`,fill:`var(--text-primary)`,"font-size":`11`,"font-family":`JetBrains Mono, Fira Code, monospace`},[r(`title`,null,c(t.variantSiblings>0?`${t.fullLabel}\nVariant: ${t.variantName} (${t.variantSiblings+1} options in ${t.variantGroup})`:t.fullLabel),1),u(` `+c(t.label),1)],8,cr),t.variantSiblings>0?(p(),e(`g`,lr,[r(`rect`,{x:t.x+t.width/2-36,y:t.y-Q/2-6,width:`34`,height:`14`,rx:`3`,fill:`var(--accent-primary, #4c8bf5)`,opacity:`0.9`},null,8,ur),r(`text`,{x:t.x+t.width/2-19,y:t.y-Q/2+4,"text-anchor":`middle`,fill:`white`,"font-size":`9`,"font-family":`JetBrains Mono, Fira Code, monospace`,"font-weight":`600`},c(t.variantName),9,dr)])):d(``,!0)],40,ir))),128))],8,tr))],32)]))}}),[[`__scopeId`,`data-v-794f2cfd`]]);export{hr as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.widget-cell[data-v-70af09fa]{flex-direction:column;gap:10px;padding:12px;display:flex}.widget-toolbar[data-v-70af09fa]{justify-content:flex-end;display:flex}.live-toggle[data-v-70af09fa]{background:var(--bg-input);color:var(--text-muted);border:1px solid var(--border);cursor:pointer;border-radius:4px;padding:2px 8px;font-size:12px}.live-toggle.on[data-v-70af09fa]{color:var(--accent-primary);border-color:var(--accent-primary)}.widget-empty[data-v-70af09fa]{color:var(--text-muted);font-size:13px}.widget-empty code[data-v-70af09fa]{background:var(--bg-input);border-radius:4px;padding:1px 5px;font-family:JetBrains Mono,Fira Code,monospace}.widget-control[data-v-70af09fa]{grid-template-columns:140px 1fr auto;align-items:center;gap:12px;display:grid}.widget-label[data-v-70af09fa]{color:var(--accent-primary);text-align:right;text-overflow:ellipsis;font-family:JetBrains Mono,Fira Code,monospace;font-size:13px;overflow:hidden}.widget-control input[type=range][data-v-70af09fa]{width:100%;accent-color:var(--accent-primary)}.widget-control input[type=number][data-v-70af09fa],.widget-control input[type=text][data-v-70af09fa],.widget-control select[data-v-70af09fa]{background:var(--bg-input);color:var(--text-primary);border:1px solid var(--border);font:inherit;border-radius:4px;padding:3px 8px}.widget-value[data-v-70af09fa]{color:var(--text-primary);text-align:right;min-width:48px;font-family:JetBrains Mono,Fira Code,monospace;font-size:13px}.data-table[data-v-60729056]{border:1px solid var(--border);border-radius:6px;font-family:JetBrains Mono,Fira Code,monospace;font-size:12px;overflow:hidden}.data-table-toolbar[data-v-60729056]{background:var(--bg-surface);border-bottom:1px solid var(--border);align-items:center;gap:8px;padding:6px 8px;display:flex}.search-input[data-v-60729056]{background:var(--bg-input);min-width:0;color:var(--text-primary);border:1px solid var(--border);font:inherit;border-radius:4px;flex:1;padding:3px 8px}.toolbar-actions[data-v-60729056]{gap:6px;display:flex}.tool-btn[data-v-60729056]{background:var(--bg-input);color:var(--text-secondary);border:1px solid var(--border);cursor:pointer;font:inherit;border-radius:4px;padding:3px 8px;line-height:1.4;text-decoration:none}.tool-btn[data-v-60729056]:hover{background:var(--bg-hover);color:var(--text-primary)}.tool-btn.on[data-v-60729056]{color:var(--accent-primary);border-color:var(--accent-primary)}.filter-form[data-v-60729056]{background:var(--bg-surface);border-bottom:1px solid var(--border);flex-wrap:wrap;gap:6px;padding:6px 8px;display:flex}.filter-form select[data-v-60729056],.filter-form input[data-v-60729056]{background:var(--bg-input);color:var(--text-primary);border:1px solid var(--border);font:inherit;border-radius:4px;padding:2px 6px}.filter-chips[data-v-60729056]{background:var(--bg-surface);border-bottom:1px solid var(--border);flex-wrap:wrap;gap:6px;padding:6px 8px;display:flex}.chip[data-v-60729056]{background:var(--bg-input);border:1px solid var(--border);color:var(--text-primary);border-radius:10px;align-items:center;gap:4px;padding:1px 4px 1px 8px;display:inline-flex}.chip-x[data-v-60729056]{color:var(--text-muted);cursor:pointer;background:0 0;border:none;padding:0 2px;font-size:10px}.chip-x[data-v-60729056]:hover{color:var(--accent-danger)}.data-table-scroll[data-v-60729056]{max-height:420px;overflow:auto}.data-table table[data-v-60729056]{border-collapse:collapse;width:100%}.data-table th[data-v-60729056],.data-table td[data-v-60729056]{text-align:left;white-space:nowrap;border-bottom:1px solid var(--border-subtle);text-overflow:ellipsis;max-width:320px;padding:4px 12px;overflow:hidden}.data-table td.expanded[data-v-60729056]{white-space:normal;word-break:break-word;max-width:none;overflow:visible}.data-table td.numeric[data-v-60729056]{text-align:right;font-variant-numeric:tabular-nums}.data-table td.null-cell[data-v-60729056]{color:var(--text-muted);font-style:italic}.data-table td.empty[data-v-60729056]{text-align:center;color:var(--text-muted);padding:12px}.data-table thead th[data-v-60729056]{background:var(--bg-elevated);color:var(--accent-primary);-webkit-user-select:none;user-select:none;font-weight:600;position:sticky;top:0}.data-table th.sortable[data-v-60729056]{cursor:pointer}.data-table th.sortable[data-v-60729056]:hover{background:var(--bg-hover)}.data-table th.active[data-v-60729056]{color:var(--accent-primary-hover)}.sort-caret[data-v-60729056]{font-size:10px}.stats-row th[data-v-60729056]{color:var(--text-muted);border-bottom:1px solid var(--border);font-weight:400;top:26px}.stats-row .dtype[data-v-60729056]{color:var(--accent-teal);margin-right:6px}.stats-row .stat[data-v-60729056]{margin-right:6px}.stats-row .range[data-v-60729056]{white-space:nowrap}.data-table td[data-v-60729056]{color:var(--text-primary);cursor:default}.data-table tbody tr:hover td[data-v-60729056]{background:var(--bg-input)}.data-table-footer[data-v-60729056]{background:var(--bg-surface);border-top:1px solid var(--border);color:var(--text-muted);align-items:center;gap:12px;padding:6px 12px;font-size:11px;display:flex}.data-table-footer .range[data-v-60729056]{flex:1}.data-table-error[data-v-60729056]{color:var(--accent-danger)}.pager[data-v-60729056]{align-items:center;gap:8px;display:flex}.pager select[data-v-60729056]{background:var(--bg-input);color:inherit;border:1px solid var(--border);border-radius:4px;padding:1px 4px}.pager button[data-v-60729056]{background:var(--bg-input);color:inherit;border:1px solid var(--border);cursor:pointer;border-radius:4px;padding:2px 8px}.pager button[data-v-60729056]:disabled{opacity:.4;cursor:default}
|