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.
Files changed (287) hide show
  1. strata/.agents/skills/strata-scratchpad/SKILL.md +163 -0
  2. strata/__init__.py +9 -0
  3. strata/__main__.py +6 -0
  4. strata/_frontend/assets/AppView-CfbAQfnj.css +1 -0
  5. strata/_frontend/assets/AppView-DEAuXdCg.js +2 -0
  6. strata/_frontend/assets/ArtifactsPage-BSeZIjwB.css +1 -0
  7. strata/_frontend/assets/ArtifactsPage-Ddzlj2Ug.js +1 -0
  8. strata/_frontend/assets/ConnectionsPanel--ExPjDi_.js +1 -0
  9. strata/_frontend/assets/ConnectionsPanel-ziUNjWNM.css +1 -0
  10. strata/_frontend/assets/DagView-0pJwy5rt.css +1 -0
  11. strata/_frontend/assets/DagView-CWI1mo2i.js +1 -0
  12. strata/_frontend/assets/DataTable-DSpStbJ9.css +1 -0
  13. strata/_frontend/assets/DataTable-Djt8YiVM.js +4 -0
  14. strata/_frontend/assets/EnvironmentPanel-CBzPxucv.js +10 -0
  15. strata/_frontend/assets/EnvironmentPanel-C_rW2Euc.css +1 -0
  16. strata/_frontend/assets/ImpactPreview-CextJi5p.js +1 -0
  17. strata/_frontend/assets/ImpactPreview-D7K4fufy.css +1 -0
  18. strata/_frontend/assets/InspectPanel-BLmhBTuZ.css +1 -0
  19. strata/_frontend/assets/InspectPanel-CiqV9sgV.js +1 -0
  20. strata/_frontend/assets/InspectSwapConfirm-CXY2-3SY.js +1 -0
  21. strata/_frontend/assets/InspectSwapConfirm-qbl06L3k.css +1 -0
  22. strata/_frontend/assets/LineageModal-BePHnwF6.js +1 -0
  23. strata/_frontend/assets/LineageModal-Dc4KaESb.css +1 -0
  24. strata/_frontend/assets/LogsPage-CT4yH6UY.css +1 -0
  25. strata/_frontend/assets/LogsPage-CXDPnOEx.js +1 -0
  26. strata/_frontend/assets/MountsPanel-BlMF6mf9.js +1 -0
  27. strata/_frontend/assets/MountsPanel-DZCbmxNs.css +1 -0
  28. strata/_frontend/assets/NotebookPage-BGceSq9e.js +22 -0
  29. strata/_frontend/assets/NotebookPage-CrbhmtIn.css +1 -0
  30. strata/_frontend/assets/NotesPanel-C8knXflq.js +3 -0
  31. strata/_frontend/assets/NotesPanel-D-d0v7Ap.css +1 -0
  32. strata/_frontend/assets/ProfilingPanel-C4A8X3sf.js +1 -0
  33. strata/_frontend/assets/ProfilingPanel-D5Mo6s1V.css +1 -0
  34. strata/_frontend/assets/ReadConfirm-ChlIAMJK.css +1 -0
  35. strata/_frontend/assets/ReadConfirm-gVY4VVB2.js +1 -0
  36. strata/_frontend/assets/RegistryPanel-BB_qisdn.js +1 -0
  37. strata/_frontend/assets/RegistryPanel-CXVIwXkw.css +1 -0
  38. strata/_frontend/assets/RuntimePanel-CboOb447.js +1 -0
  39. strata/_frontend/assets/RuntimePanel-D_bL2Oue.css +1 -0
  40. strata/_frontend/assets/SchemaPanel-BrMbPzNk.css +1 -0
  41. strata/_frontend/assets/SchemaPanel-CdfqheDK.js +1 -0
  42. strata/_frontend/assets/TestsPanel-BXQG4EN2.js +2 -0
  43. strata/_frontend/assets/TestsPanel-DKFAQ4dK.css +1 -0
  44. strata/_frontend/assets/WorkersPanel-2ib-AojW.js +1 -0
  45. strata/_frontend/assets/WorkersPanel-BV9QJrYn.css +1 -0
  46. strata/_frontend/assets/codemirror-vendor-JCYuYFv4.js +12 -0
  47. strata/_frontend/assets/dist-BYy0f13V.js +28 -0
  48. strata/_frontend/assets/index-C-zgQzKr.js +17 -0
  49. strata/_frontend/assets/index-DK8IHPfU.css +1 -0
  50. strata/_frontend/assets/refusal-Bl6E8RZG.js +1 -0
  51. strata/_frontend/favicon.svg +1 -0
  52. strata/_frontend/index.html +19 -0
  53. strata/_uv_runtime.py +50 -0
  54. strata/adaptive_concurrency.py +508 -0
  55. strata/api/__init__.py +1 -0
  56. strata/api/badge.py +98 -0
  57. strata/api/dependencies.py +426 -0
  58. strata/api/provenance_ld.py +364 -0
  59. strata/api/publication_bundle.py +385 -0
  60. strata/api/publication_page.py +550 -0
  61. strata/api/remote_registry.py +110 -0
  62. strata/api/routers/__init__.py +5 -0
  63. strata/api/routers/admin.py +365 -0
  64. strata/api/routers/artifacts.py +1470 -0
  65. strata/api/routers/builds.py +801 -0
  66. strata/api/routers/cache.py +376 -0
  67. strata/api/routers/debug.py +249 -0
  68. strata/api/routers/logs.py +83 -0
  69. strata/api/routers/materialize.py +751 -0
  70. strata/api/routers/metadata.py +64 -0
  71. strata/api/routers/metrics_health.py +832 -0
  72. strata/api/routers/names.py +471 -0
  73. strata/api/routers/publications.py +677 -0
  74. strata/api/routers/registry.py +217 -0
  75. strata/api/routers/streams.py +272 -0
  76. strata/api/served_bytes.py +33 -0
  77. strata/artifact/__init__.py +2 -0
  78. strata/artifact/blob_store.py +1169 -0
  79. strata/artifact/cli.py +1043 -0
  80. strata/artifact/provenance.py +81 -0
  81. strata/artifact/store.py +5109 -0
  82. strata/artifact/table_export.py +135 -0
  83. strata/artifact/transfer.py +495 -0
  84. strata/artifact/uris.py +46 -0
  85. strata/auth/__init__.py +2 -0
  86. strata/auth/api_key_cli.py +137 -0
  87. strata/auth/api_keys.py +310 -0
  88. strata/auth/principal.py +235 -0
  89. strata/auth/run_tokens.py +134 -0
  90. strata/cache/__init__.py +2 -0
  91. strata/cache/disk.py +720 -0
  92. strata/cache/metadata.py +919 -0
  93. strata/cache/metadata_store.py +569 -0
  94. strata/cache/metrics.py +193 -0
  95. strata/cache/stats.py +289 -0
  96. strata/cache/warmer.py +412 -0
  97. strata/cli.py +839 -0
  98. strata/config.py +1486 -0
  99. strata/executors.py +55 -0
  100. strata/fast_io.py +283 -0
  101. strata/fetcher.py +189 -0
  102. strata/file_modes.py +57 -0
  103. strata/filters.py +158 -0
  104. strata/iceberg/__init__.py +2 -0
  105. strata/iceberg/catalog.py +667 -0
  106. strata/iceberg/deletes.py +103 -0
  107. strata/iceberg/equality.py +363 -0
  108. strata/iceberg/lake_files.py +165 -0
  109. strata/iceberg/schema.py +363 -0
  110. strata/json_types.py +5 -0
  111. strata/migrate.py +291 -0
  112. strata/migrate_cli.py +104 -0
  113. strata/notebook/__init__.py +35 -0
  114. strata/notebook/agent_launch.py +461 -0
  115. strata/notebook/analyzer.py +632 -0
  116. strata/notebook/annotation_validation.py +1072 -0
  117. strata/notebook/annotations.py +691 -0
  118. strata/notebook/artifact_integration.py +397 -0
  119. strata/notebook/authorship.py +49 -0
  120. strata/notebook/cascade.py +132 -0
  121. strata/notebook/causality.py +238 -0
  122. strata/notebook/cell_test_conftest.py +167 -0
  123. strata/notebook/cell_test_runner.py +147 -0
  124. strata/notebook/cli.py +2073 -0
  125. strata/notebook/console_relay.py +193 -0
  126. strata/notebook/credentials.py +247 -0
  127. strata/notebook/dag.py +487 -0
  128. strata/notebook/datasets.py +328 -0
  129. strata/notebook/dependencies.py +1742 -0
  130. strata/notebook/display/__init__.py +9 -0
  131. strata/notebook/display/runtime.py +149 -0
  132. strata/notebook/env.py +364 -0
  133. strata/notebook/env_backend.py +258 -0
  134. strata/notebook/executor.py +8010 -0
  135. strata/notebook/export.py +1001 -0
  136. strata/notebook/fetch.py +455 -0
  137. strata/notebook/hardware.py +101 -0
  138. strata/notebook/harness.py +946 -0
  139. strata/notebook/harness_env.py +114 -0
  140. strata/notebook/harness_user.py +408 -0
  141. strata/notebook/immutability.py +469 -0
  142. strata/notebook/impact.py +115 -0
  143. strata/notebook/inspect_harness.py +209 -0
  144. strata/notebook/inspect_repl.py +228 -0
  145. strata/notebook/jupyter_import.py +1198 -0
  146. strata/notebook/languages/__init__.py +37 -0
  147. strata/notebook/languages/analyzer.py +191 -0
  148. strata/notebook/languages/executor.py +340 -0
  149. strata/notebook/languages/r/__init__.py +10 -0
  150. strata/notebook/languages/r/analyze_cell.R +215 -0
  151. strata/notebook/languages/r/analyzer.py +146 -0
  152. strata/notebook/languages/r/executor.py +57 -0
  153. strata/notebook/languages/r/harness.R +611 -0
  154. strata/notebook/languages/r/pool_worker.R +93 -0
  155. strata/notebook/layout.py +97 -0
  156. strata/notebook/lifeline.py +83 -0
  157. strata/notebook/llm/__init__.py +45 -0
  158. strata/notebook/llm/client.py +373 -0
  159. strata/notebook/llm/config.py +247 -0
  160. strata/notebook/llm/prompts.py +202 -0
  161. strata/notebook/llm/structured.py +170 -0
  162. strata/notebook/llm/usage.py +61 -0
  163. strata/notebook/mcp_server.py +1379 -0
  164. strata/notebook/models.py +1036 -0
  165. strata/notebook/module_export.py +528 -0
  166. strata/notebook/mount_cache.py +365 -0
  167. strata/notebook/mounts.py +939 -0
  168. strata/notebook/notebook_client.py +378 -0
  169. strata/notebook/ops.py +1410 -0
  170. strata/notebook/output_dirs.py +366 -0
  171. strata/notebook/output_file_relay.py +90 -0
  172. strata/notebook/parser.py +311 -0
  173. strata/notebook/pool.py +310 -0
  174. strata/notebook/pool_worker.py +425 -0
  175. strata/notebook/presence.py +122 -0
  176. strata/notebook/prewarm.py +121 -0
  177. strata/notebook/process_tree.py +129 -0
  178. strata/notebook/prompt_analyzer.py +156 -0
  179. strata/notebook/prompt_executor.py +705 -0
  180. strata/notebook/protocol.py +100 -0
  181. strata/notebook/provenance.py +111 -0
  182. strata/notebook/python_versions.py +175 -0
  183. strata/notebook/quiesce.py +135 -0
  184. strata/notebook/read_confirm.py +110 -0
  185. strata/notebook/reads_index.py +70 -0
  186. strata/notebook/remote_bundle.py +388 -0
  187. strata/notebook/remote_executor.py +1766 -0
  188. strata/notebook/remote_worker_supervisor.py +409 -0
  189. strata/notebook/routes.py +3771 -0
  190. strata/notebook/runtime_state.py +378 -0
  191. strata/notebook/scopes.py +221 -0
  192. strata/notebook/secret_manager/__init__.py +28 -0
  193. strata/notebook/secret_manager/infisical.py +151 -0
  194. strata/notebook/secret_manager/provider.py +61 -0
  195. strata/notebook/secret_manager/registry.py +37 -0
  196. strata/notebook/secret_manager/session_integration.py +127 -0
  197. strata/notebook/serializer.py +2007 -0
  198. strata/notebook/session.py +4060 -0
  199. strata/notebook/shared_env.py +594 -0
  200. strata/notebook/snapshot.py +381 -0
  201. strata/notebook/snapshot_import.py +602 -0
  202. strata/notebook/sql/__init__.py +42 -0
  203. strata/notebook/sql/adapter.py +192 -0
  204. strata/notebook/sql/analyzer.py +551 -0
  205. strata/notebook/sql/bind.py +77 -0
  206. strata/notebook/sql/cell_executor.py +1378 -0
  207. strata/notebook/sql/drivers/__init__.py +43 -0
  208. strata/notebook/sql/drivers/bigquery.py +445 -0
  209. strata/notebook/sql/drivers/duckdb.py +633 -0
  210. strata/notebook/sql/drivers/postgresql.py +433 -0
  211. strata/notebook/sql/drivers/snowflake.py +582 -0
  212. strata/notebook/sql/drivers/sqlite.py +407 -0
  213. strata/notebook/sql/lake.py +440 -0
  214. strata/notebook/sql/provenance.py +282 -0
  215. strata/notebook/sql/registry.py +48 -0
  216. strata/notebook/sql/time_travel.py +106 -0
  217. strata/notebook/ssh_worker.py +322 -0
  218. strata/notebook/ssh_worker_service.py +93 -0
  219. strata/notebook/table_index.py +85 -0
  220. strata/notebook/table_writes.py +205 -0
  221. strata/notebook/tables.py +152 -0
  222. strata/notebook/team_store.py +445 -0
  223. strata/notebook/timing.py +49 -0
  224. strata/notebook/tui/__init__.py +5 -0
  225. strata/notebook/tui/__main__.py +6 -0
  226. strata/notebook/tui/app.py +1116 -0
  227. strata/notebook/tui/cli.py +75 -0
  228. strata/notebook/tui/client.py +116 -0
  229. strata/notebook/tui/dag_render.py +405 -0
  230. strata/notebook/tui/viewmodel.py +318 -0
  231. strata/notebook/widget_analyzer.py +251 -0
  232. strata/notebook/widget_executor.py +96 -0
  233. strata/notebook/work_dir.py +47 -0
  234. strata/notebook/worker_connect.py +256 -0
  235. strata/notebook/worker_env.py +399 -0
  236. strata/notebook/worker_secrets.py +31 -0
  237. strata/notebook/workers.py +1197 -0
  238. strata/notebook/writer.py +1411 -0
  239. strata/notebook/ws.py +3721 -0
  240. strata/notebook/ws_payloads.py +564 -0
  241. strata/observability/__init__.py +2 -0
  242. strata/observability/gc_tracker.py +244 -0
  243. strata/observability/health.py +445 -0
  244. strata/observability/log_buffer.py +106 -0
  245. strata/observability/logging.py +467 -0
  246. strata/observability/memory_profiler.py +340 -0
  247. strata/observability/metrics.py +435 -0
  248. strata/observability/pool_metrics.py +267 -0
  249. strata/observability/slow_ops.py +329 -0
  250. strata/observability/tracing.py +218 -0
  251. strata/planner.py +763 -0
  252. strata/py.typed +0 -0
  253. strata/rate_limiter.py +334 -0
  254. strata/server.py +2015 -0
  255. strata/services/__init__.py +5 -0
  256. strata/services/artifact.py +318 -0
  257. strata/services/build.py +134 -0
  258. strata/services/materialize.py +277 -0
  259. strata/services/registry.py +123 -0
  260. strata/sql_backend.py +581 -0
  261. strata/streaming/__init__.py +18 -0
  262. strata/streaming/ownership.py +137 -0
  263. strata/streaming/qos.py +329 -0
  264. strata/streaming/registry.py +150 -0
  265. strata/streaming/scan_builds.py +488 -0
  266. strata/tenancy/__init__.py +2 -0
  267. strata/tenancy/registry.py +271 -0
  268. strata/tenancy/tenant.py +162 -0
  269. strata/timing.py +27 -0
  270. strata/transforms/__init__.py +64 -0
  271. strata/transforms/base.py +141 -0
  272. strata/transforms/build_metrics.py +594 -0
  273. strata/transforms/build_qos.py +516 -0
  274. strata/transforms/build_store.py +927 -0
  275. strata/transforms/duckdb_sql.py +82 -0
  276. strata/transforms/reference_executor.py +325 -0
  277. strata/transforms/registry.py +173 -0
  278. strata/transforms/runner.py +1006 -0
  279. strata/transforms/scan.py +102 -0
  280. strata/transforms/signed_urls.py +481 -0
  281. strata/types.py +931 -0
  282. strata/url_safety.py +281 -0
  283. strata_notebook-0.11.0.dist-info/METADATA +479 -0
  284. strata_notebook-0.11.0.dist-info/RECORD +287 -0
  285. strata_notebook-0.11.0.dist-info/WHEEL +4 -0
  286. strata_notebook-0.11.0.dist-info/entry_points.txt +6 -0
  287. 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,6 @@
1
+ """Entry point for python -m strata."""
2
+
3
+ from strata.server import main
4
+
5
+ if __name__ == "__main__":
6
+ main()
@@ -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}