From 68fd6bd7b851307181ff25b2a10a9d5a0bc1ed86 Mon Sep 17 00:00:00 2001 From: "Shangxiang Fan (from Dev Box)" Date: Wed, 23 Sep 2026 17:32:25 +0800 Subject: [PATCH] feat(notebook): TauGrid runs, logs, loss and submission in JupyterLab Adds the TauGrid notebook integration as a JupyterLab 4 prebuilt extension plus a Jupyter Server extension shipped inside the tau wheel. The researcher stays in JupyterLab: submit the notebook they are working in, then watch status, logs and a loss curve until the run finishes. The browser never talks to Kubernetes; the server extension drives the Python SDK on the Jupyter Server identity, so the notebook needs no cluster credentials and no tau binary. Surfaces, each where it belongs rather than in one panel: - Left sidebar (taugrid-runs): a run table that loads itself and follows the namespace and queue, a filtered namespace picker that prefers Tau-ready destinations, exact lookup and a portal link. - Main-area tab per run (taugrid-detail): lifecycle phases, admission/pods/ execution tiles, diagnostics, pods, identifiers and the loss curve. Reopening a run reuses its tab. - Logs tab (taugrid-logs): one pod and container, a bounded snapshot. - Notebook toolbar and palette: submit the current notebook, review the resolved plan, then confirm in a native dialog. - About: whether submission is enabled on this server, and why. Server: - _payload.py: the CLI's embedded transport - envelope v2, immutable encoding, 64 KiB encoded environment entry and 1 MiB decoded, digest verified by the tau-payload initContainer. - _notebook_pkg.py: validate the saved notebook, strip outputs and execution counts before measuring, drop approved launcher cells, embed the notebook with the runner and a digest context manifest, and stage chosen files into the working directory so relative imports resolve. - _render.py: renderer parity with cli/internal/rayjobrender - Kueue queue label, tau.azure.com/managed-by, K8sJobMode for plugin submissions so driver output is a readable pod log, and longer retention so a finished run can still be read. - submit.py / _notebook_submit.py: plan-first submission behind TAUGRID_SUBMISSION_ENABLED with an explicit confirm bound to the reviewed manifest digest. - runs.py / metrics.py: run discovery for Jobs and RayJobs with lifecycle phases and owner-UID-scoped evidence, namespace discovery, and bounded loss metrics with explicit truncation reasons. - notebook_files.py: choose which files ship, bounded and refused when a path escapes the notebook directory or the payload ceiling. Choosing files: GET /taugrid/api/files lists the flat source files beside the notebook; the review's "Files to ship" selection embeds them and reports them as includedFiles in the plan. Verified end to end on the CPU profile - the submitter log showed "tg-runner: staged 1 file(s) into /data: nb_helpers.py" followed by HELPER_VALUE 41 / HELPER_OK. Demos and packaging: examples/notebook-ray-cpu-demo.ipynb, examples/notebook-loss-curve-demo.ipynb, examples/notebook-files-demo.ipynb with nb_helpers.py, images/notebook-runtime/Dockerfile for the notebook executor (built offline from vendored wheels, selected with TAUGRID_RUNTIME_IMAGE), and wheel packaging that ships the prebuilt labextension and enables the server extension so a clean install registers it. Verified live against a local JupyterLab and a docker-desktop cluster with Kueue and KubeRay: the loss demo reached SUCCEEDED with real observations and a 40-point curve in the browser, and the browser e2e passes all five journeys (runs sidebar, run detail, loss curve, logs, confirmed submit). This is what caught the empty submitterPodTemplate, which left the K8sJobMode submitter with no /script payload and no /data mount while the RayJob still reported success. Removed as dead weight with the rationale recorded in the design: the branch's uncalled Go TensorBoard renderer and Portal proxy route, the conformance scaffold, a stale executed example, committed notebook outputs, and the superseded ipywidgets-era screenshots. Checks: 233 offline notebook tests, 33 node tests, both frontend builds, ruff, license headers and git diff --check pass; the wheel builds and carries the current sources, both asset locations and the server config. The broader SDK and Portal failures are identical on untouched main and were left alone. Design source, API surface, metrics contract and the whole-PR audit record: docs/design/notebook-plugin.md. Task-oriented docs: site/content/en/docs/examples/notebook-plugin.md. --- .gitignore | 17 + docs/design/assets/notebook-logs.png | Bin 0 -> 59684 bytes .../assets/notebook-run-detail-loss.png | Bin 0 -> 168732 bytes docs/design/assets/notebook-runs-sidebar.png | Bin 0 -> 174242 bytes .../design/assets/notebook-submit-confirm.png | Bin 0 -> 364549 bytes docs/design/assets/notebook-submit-review.png | Bin 0 -> 162250 bytes docs/design/notebook-plugin.md | 860 ++- examples/notebook-loss-curve-demo.ipynb | 9 + examples/notebook-ray-cpu-demo.ipynb | 80 + examples/notebook-ray-cpu-demo.md | 98 + images/notebook-runtime/Dockerfile | 33 + images/notebook-runtime/wheels/.gitignore | 2 + images/notebook-runtime/wheels/.gitkeep | 0 scripts/license-header-exclusions.txt | 5 + sdk/python/python/examples/nb_helpers.py | 10 + .../python/examples/notebook-button-e2e.ipynb | 82 + .../python/examples/notebook-embed.ipynb | 70 + .../python/examples/notebook-files-demo.ipynb | 42 + .../python/examples/notebook-load-job.ipynb | 165 + .../python/examples/notebook-panel.ipynb | 81 + sdk/python/python/labextension/.gitignore | 3 + .../python/labextension/package-lock.json | 5913 +++++++++++++++++ sdk/python/python/labextension/package.json | 41 + sdk/python/python/labextension/src/api.ts | 66 + .../python/labextension/src/explorer.tsx | 134 + sdk/python/python/labextension/src/index.ts | 121 + sdk/python/python/labextension/src/loss.tsx | 47 + sdk/python/python/labextension/src/model.ts | 298 + sdk/python/python/labextension/src/monitor.ts | 132 + .../python/labextension/src/snapshot.ts | 42 + .../python/labextension/src/submission.ts | 108 + .../python/labextension/src/submitview.tsx | 149 + sdk/python/python/labextension/src/view.tsx | 113 + sdk/python/python/labextension/src/widget.tsx | 169 + .../python/labextension/style/index.css | 894 +++ sdk/python/python/labextension/style/index.js | 4 + .../labextension/tests/console.test.cjs | 612 ++ .../labextension/tools/build-labextension.cjs | 24 + sdk/python/python/labextension/tsconfig.json | 18 + sdk/python/python/pyproject.toml | 15 + sdk/python/python/setup.py | 62 + sdk/python/python/tau/_backend.py | 102 + sdk/python/python/tau/_kube_io.py | 55 + sdk/python/python/tau/_notebook_context.py | 133 + sdk/python/python/tau/_notebook_pkg.py | 308 + sdk/python/python/tau/_notebook_submit.py | 252 + sdk/python/python/tau/_payload.py | 223 + sdk/python/python/tau/_profile.py | 116 + sdk/python/python/tau/_render.py | 388 ++ sdk/python/python/tau/jupyter/__init__.py | 45 + sdk/python/python/tau/jupyter/metrics.py | 203 + .../python/tau/jupyter/notebook_files.py | 137 + sdk/python/python/tau/jupyter/runs.py | 425 ++ sdk/python/python/tau/jupyter/server.py | 348 + sdk/python/python/tau/jupyter/submit.py | 20 + .../python/tau/labextension/package.json | 56 + .../static/443.0c41012666752ca3dae1.js | 1 + .../static/543.c735f1aed609d1fa4435.js | 1 + .../remoteEntry.8209041bc416b67c1e99.js | 1 + .../python/tau/labextension/static/style.js | 4 + .../static/third-party-licenses.json | 16 + sdk/python/python/tau/widgets/__init__.py | 37 + sdk/python/python/tau/widgets/embed.py | 244 + sdk/python/python/tau/widgets/ipython.py | 121 + sdk/python/python/tau/widgets/kube.py | 60 + sdk/python/python/tau/widgets/metrics.py | 152 + sdk/python/python/tau/widgets/panel.py | 445 ++ sdk/python/python/tau/widgets/render.py | 158 + sdk/python/python/tau/widgets/session.py | 66 + sdk/python/python/tau/widgets/status.py | 378 ++ sdk/python/python/tau/widgets/watcher.py | 133 + .../python/tests/test_jupyter_contract.py | 112 + .../python/tests/test_jupyter_metrics.py | 254 + sdk/python/python/tests/test_jupyter_runs.py | 547 ++ .../python/tests/test_jupyter_submit.py | 320 + .../python/tests/test_notebook_files.py | 132 + .../python/tests/test_notebook_loss_demo.py | 80 + .../python/tests/test_notebook_packaging.py | 24 + .../python/tests/test_widgets_button.py | 111 + sdk/python/python/tests/test_widgets_core.py | 202 + sdk/python/python/tests/test_widgets_embed.py | 336 + sdk/python/python/tests/test_widgets_load.py | 434 ++ .../python/tests/test_widgets_plugin.py | 58 + .../python/tests/test_widgets_submit.py | 145 + .../python/tests/test_widgets_surface.py | 145 + .../python/tests/test_widgets_watcher.py | 210 + sdk/python/python/tools/inspect_nb.py | 17 + .../python/tools/test_plugin_cluster.py | 60 + sdk/python/python/tools/test_plugin_live.py | 176 + site/content/en/docs/examples/_index.md | 1 + .../en/docs/examples/notebook-plugin.md | 130 + site/static/images/notebook/notebook-logs.png | Bin 0 -> 59684 bytes .../notebook/notebook-run-detail-loss.png | Bin 0 -> 168732 bytes .../images/notebook/notebook-runs-sidebar.png | Bin 0 -> 174242 bytes .../notebook/notebook-submit-confirm.png | Bin 0 -> 364549 bytes .../notebook/notebook-submit-review.png | Bin 0 -> 162250 bytes tools/capture-notebook-screenshots.mjs | 100 + tools/run-button-e2e.mjs | 193 + tools/run-cpu-ray-demo.py | 167 + tools/run-embed-e2e.mjs | 133 + tools/run-labextension-e2e.mjs | 203 + tools/run-plugin-e2e.mjs | 272 + tools/show-notebook-ui.mjs | 58 + 103 files changed, 19315 insertions(+), 452 deletions(-) create mode 100644 docs/design/assets/notebook-logs.png create mode 100644 docs/design/assets/notebook-run-detail-loss.png create mode 100644 docs/design/assets/notebook-runs-sidebar.png create mode 100644 docs/design/assets/notebook-submit-confirm.png create mode 100644 docs/design/assets/notebook-submit-review.png create mode 100644 examples/notebook-loss-curve-demo.ipynb create mode 100644 examples/notebook-ray-cpu-demo.ipynb create mode 100644 examples/notebook-ray-cpu-demo.md create mode 100644 images/notebook-runtime/Dockerfile create mode 100644 images/notebook-runtime/wheels/.gitignore create mode 100644 images/notebook-runtime/wheels/.gitkeep create mode 100644 sdk/python/python/examples/nb_helpers.py create mode 100644 sdk/python/python/examples/notebook-button-e2e.ipynb create mode 100644 sdk/python/python/examples/notebook-embed.ipynb create mode 100644 sdk/python/python/examples/notebook-files-demo.ipynb create mode 100644 sdk/python/python/examples/notebook-load-job.ipynb create mode 100644 sdk/python/python/examples/notebook-panel.ipynb create mode 100644 sdk/python/python/labextension/.gitignore create mode 100644 sdk/python/python/labextension/package-lock.json create mode 100644 sdk/python/python/labextension/package.json create mode 100644 sdk/python/python/labextension/src/api.ts create mode 100644 sdk/python/python/labextension/src/explorer.tsx create mode 100644 sdk/python/python/labextension/src/index.ts create mode 100644 sdk/python/python/labextension/src/loss.tsx create mode 100644 sdk/python/python/labextension/src/model.ts create mode 100644 sdk/python/python/labextension/src/monitor.ts create mode 100644 sdk/python/python/labextension/src/snapshot.ts create mode 100644 sdk/python/python/labextension/src/submission.ts create mode 100644 sdk/python/python/labextension/src/submitview.tsx create mode 100644 sdk/python/python/labextension/src/view.tsx create mode 100644 sdk/python/python/labextension/src/widget.tsx create mode 100644 sdk/python/python/labextension/style/index.css create mode 100644 sdk/python/python/labextension/style/index.js create mode 100644 sdk/python/python/labextension/tests/console.test.cjs create mode 100644 sdk/python/python/labextension/tools/build-labextension.cjs create mode 100644 sdk/python/python/labextension/tsconfig.json create mode 100644 sdk/python/python/setup.py create mode 100644 sdk/python/python/tau/_backend.py create mode 100644 sdk/python/python/tau/_kube_io.py create mode 100644 sdk/python/python/tau/_notebook_context.py create mode 100644 sdk/python/python/tau/_notebook_pkg.py create mode 100644 sdk/python/python/tau/_notebook_submit.py create mode 100644 sdk/python/python/tau/_payload.py create mode 100644 sdk/python/python/tau/_profile.py create mode 100644 sdk/python/python/tau/_render.py create mode 100644 sdk/python/python/tau/jupyter/__init__.py create mode 100644 sdk/python/python/tau/jupyter/metrics.py create mode 100644 sdk/python/python/tau/jupyter/notebook_files.py create mode 100644 sdk/python/python/tau/jupyter/runs.py create mode 100644 sdk/python/python/tau/jupyter/server.py create mode 100644 sdk/python/python/tau/jupyter/submit.py create mode 100644 sdk/python/python/tau/labextension/package.json create mode 100644 sdk/python/python/tau/labextension/static/443.0c41012666752ca3dae1.js create mode 100644 sdk/python/python/tau/labextension/static/543.c735f1aed609d1fa4435.js create mode 100644 sdk/python/python/tau/labextension/static/remoteEntry.8209041bc416b67c1e99.js create mode 100644 sdk/python/python/tau/labextension/static/style.js create mode 100644 sdk/python/python/tau/labextension/static/third-party-licenses.json create mode 100644 sdk/python/python/tau/widgets/__init__.py create mode 100644 sdk/python/python/tau/widgets/embed.py create mode 100644 sdk/python/python/tau/widgets/ipython.py create mode 100644 sdk/python/python/tau/widgets/kube.py create mode 100644 sdk/python/python/tau/widgets/metrics.py create mode 100644 sdk/python/python/tau/widgets/panel.py create mode 100644 sdk/python/python/tau/widgets/render.py create mode 100644 sdk/python/python/tau/widgets/session.py create mode 100644 sdk/python/python/tau/widgets/status.py create mode 100644 sdk/python/python/tau/widgets/watcher.py create mode 100644 sdk/python/python/tests/test_jupyter_contract.py create mode 100644 sdk/python/python/tests/test_jupyter_metrics.py create mode 100644 sdk/python/python/tests/test_jupyter_runs.py create mode 100644 sdk/python/python/tests/test_jupyter_submit.py create mode 100644 sdk/python/python/tests/test_notebook_files.py create mode 100644 sdk/python/python/tests/test_notebook_loss_demo.py create mode 100644 sdk/python/python/tests/test_notebook_packaging.py create mode 100644 sdk/python/python/tests/test_widgets_button.py create mode 100644 sdk/python/python/tests/test_widgets_core.py create mode 100644 sdk/python/python/tests/test_widgets_embed.py create mode 100644 sdk/python/python/tests/test_widgets_load.py create mode 100644 sdk/python/python/tests/test_widgets_plugin.py create mode 100644 sdk/python/python/tests/test_widgets_submit.py create mode 100644 sdk/python/python/tests/test_widgets_surface.py create mode 100644 sdk/python/python/tests/test_widgets_watcher.py create mode 100644 sdk/python/python/tools/inspect_nb.py create mode 100644 sdk/python/python/tools/test_plugin_cluster.py create mode 100644 sdk/python/python/tools/test_plugin_live.py create mode 100644 site/content/en/docs/examples/notebook-plugin.md create mode 100644 site/static/images/notebook/notebook-logs.png create mode 100644 site/static/images/notebook/notebook-run-detail-loss.png create mode 100644 site/static/images/notebook/notebook-runs-sidebar.png create mode 100644 site/static/images/notebook/notebook-submit-confirm.png create mode 100644 site/static/images/notebook/notebook-submit-review.png create mode 100644 tools/capture-notebook-screenshots.mjs create mode 100644 tools/run-button-e2e.mjs create mode 100644 tools/run-cpu-ray-demo.py create mode 100644 tools/run-embed-e2e.mjs create mode 100644 tools/run-labextension-e2e.mjs create mode 100644 tools/run-plugin-e2e.mjs create mode 100644 tools/show-notebook-ui.mjs diff --git a/.gitignore b/.gitignore index 634ecc25..5f5db373 100644 --- a/.gitignore +++ b/.gitignore @@ -37,3 +37,20 @@ charts/taugrid/charts # Portal frontend dependencies and local build metadata portal/frontend/node_modules/ portal/frontend/*.tsbuildinfo +# Agent scratch: briefs, reports, throwaway environments. +.codex-review/ +sdk/python/python/share/ +sdk/python/python/build/ +sdk/python/python/tau.egg-info/ + +# Local Jupyter extension build output and e2e artifacts +sdk/python/python/labextension/node_modules/ +sdk/python/python/labextension/lib/ +sdk/python/python/labextension/tsconfig.tsbuildinfo +jupyter-*-e2e*.png +tools/jupyter-*.png +# Python bytecode +__pycache__/ +*.pyc +# Jupyter checkpoints +.ipynb_checkpoints/ diff --git a/docs/design/assets/notebook-logs.png b/docs/design/assets/notebook-logs.png new file mode 100644 index 0000000000000000000000000000000000000000..9a4515c79390572c08062afd9a7df552497c80c2 GIT binary patch literal 59684 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
Z+vg`~7mh`n3xPb+SRMmTXU? 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 literal 0 HcmV?d00001 diff --git a/docs/design/assets/notebook-runs-sidebar.png b/docs/design/assets/notebook-runs-sidebar.png new file mode 100644 index 0000000000000000000000000000000000000000..ae42386fa35d228c5e0b6f283cdd0377dd154ff8 GIT binary patch literal 174242 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

$hsYQF-Yz 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%0A>@K_#Hu!!N#$~C=BY%$ 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 literal 0 HcmV?d00001 diff --git a/docs/design/assets/notebook-submit-confirm.png b/docs/design/assets/notebook-submit-confirm.png new file mode 100644 index 0000000000000000000000000000000000000000..80d5cfe70367168fb7f824151930380f9ecf7982 GIT binary patch literal 364549 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�zj;BU8m49>Wh=JGp0lD)3rPx4H;Qkk9I)|r7pPV zLMTr?ug|cA(}YPJi%#_>0M*YoN?Wc%K-o>eHm*HK!U3Gi2b@a}1pqYjFV?{Tss=XB z5uB}sS-Y~Ue)5~&omodX3s9AGuR&ZCLxkn=`4u9`1w5@{Yt!CjUX_uDf%hpRg|jjn zg8ArvXQahQx2*E#9Wat7ES#K%$3~lePznrdX|u$jMJL!`#oBc_Cf|{qX7)tNHECN? z*yVWqIB7V&6Acw3ZZW?|Gnu`COX+*rb@v*Ez0O!k=}LQCwihP(!Ab2<*PGV1;Lqi* z7HzjjG+3+maCAJtBK# zhR1lcAH&-h`CYTWMpg%W(F;z{aQF|_$IH>gCYWrHVRQ3STdCyY-1bvmpCKLoZ2*I2 z2xJ~aZ5i`z-yCTp{+M#z?8qD051dTZ1?R;)zgoKKWp0yiTc zV}3#D5>u|F&3^h9(X0;P7Zac}+snz-L5)gcAh1n)CJD7q={4BjtI@sH*xemWK{Hha zD4w0(t_-h#Jru38ZJDmbe)tZSFSj5q4Acb}tYnFgzz@s6NKLNrBQ-OQ9?c*v+K}a& z?A&Ukkc2!rj_xbQ0T{_;#?ean-SpN&U-M<0e%vj>ejbY{DhXnUia5s6!2W;31ta)>)3ScQ2zE97p9*My{|RUezeAb-{0Z0|_x{v4{^yl+r9V+sOUW#y zkz7!5`u9ILpK+>#Uq%>zA6?e`>7Q^v4vE~=|Nj)#|K|w*pUmZWVF?53hHWWe=27hhYgym$i_ZT3{Iex#iDrlH)9AKjFpxh zFlYWVz+7g9sK~*Z!1Awkw&cwU88j`BlOch;BQ+y6`Mg3N9K6NR^FYTe`fR{!^f|L6RfUqy(?a`tce|DO0a z9fcpmL3k0wdI4MR-_Le2@ZaFHn}RNdM8LwCCRK)%=2eWzdd z^qYTa7{Okw?v*bnAfU=v#qi+0=3fL^gAbmlF#8e_!#_T0(!W^QS}IT~`XiVyrlNc^ z6faaUV;EdY0|PB4+r$zS^M5cy71*of67q`SV52KU_YyP0gNLr0K#C!gKOD@On*zo> zX%(7L>BbA`lGNmw8&Zh4jGv0CPm{J~gZv9v6o9bMMW2V5|G2uYuY@W3rNe9fsAFNOsSx#}-$%ZMLWJPc7@hh{ZglT(5Gs4+!J~3G#3r+dW~nF!~|=T7bednjytVnndMe2>aNCIYn=omSsg?s6dviL)l<-e9lkv zQ_~ddbH?7!y5qN>#PMqxbA4#k-pV)}G3O$S31py*2)rYgjG?%{4mZ2W{QD}(KpW_n zDHh*pLM69y4jq9cT3_j5fL>qpBUIT&;48?vA_k4l(GWq_SNb6qwBEgjiSgz}yJXfk12V-S1S0D3(;|^n&WCI&Zz4ofrEb3jW+xaT zV%h3mocqT%;Ck~8J;lD=O4(ChiS~E;2Mgfz?+)#e+rY`4k4-#rzjJ~r#EiK122vd6 zE&27a5G_!@B6eYs5xxpYI+K_Jn*9kCdD`Dc20S&CyVZ@v(|Z~04~U`kjW>C3EJ`lr zF5SO*f;x5Q_#l8W@;L6CoB?*s1(b4Odbh3=y%VwE|lz z#Yx=4VZfrXmH!wS!9Q1^gauTU6Q(fr95x!%oOoeyflzkOCv`5+j($b$_g44apHG|5 zjZjft^AT$0Y?dsO_l;=grR90bLr1rm+Z~F7;W9>p3VDM?c5UQSNGM8ShdJT?#ulpe zYjDg|sp4^)H#&%Ueyu2x{hO76z1W$=K=(%$d4%4{1?_^C-`xh;eeus@8mjFy4VEH; z-)3V+vspiK{$}%Cof{`DPjY%>oS*IToxDc2Qjvga6{23#niDu0m@Tw3i;>sf@NGZw zmHf(e-DLf)*byc=s5roe^p|ypM}T&vWeFMA0BBG~R{Vy^0S>aCl$DzIHkRsbYdr6K zkeo}lUG`ki+Bfc*Jxyyc&#NZp>iy*K#e6>YS1q%Wfe+VlnHs(1v1zZEHo`;6Rfx;PO<=e7j%cotmp^g+JDJg1R6hx-*hASsBe zM6(!L*1g-6A~emLBH|ZSw-h(gurI3u00H?mLi#@!f}yHS0NweVyzlAv&0r+oYAeb8 zc9xQDYa{RE#)P?_Ej zCHBY;r#W#KVYs8;tA66I?M@x>%6t=LH7j4nEK#2aZhHxG)-t2V2MHvui^Qxdb2Ia% z1Lo@QK}N3-8Yt66kf^hA^KdcN6DBW0-tc$Pt01sR?*tRsGK9hL zZ!M2s^C@hGjVv@+!QegSfuUcZgVa;~Uy6-i(Hi+={M8&&T>Y{gWg!9KA+0v~P$84} zSC#pE-un2g(`(}4(1^0>a$S+)i73kPjHi(EiSG4u> zwYf?&Ea4>haYW57U8bool1y|@YeX@l3y8$_kajp@{92z(k{e#t6x8f#(K#?Wv=IB) zS8kfP#_lal_`AuCepr%#=EW7QY~1okfh2i9whomn`mI(g&<2`J21*np$bZGrsAoRzo7I}MZ9F+KcF^JxF}Gc34iy!>QqYpRX7$xr=>NLZhue;riH zs+Ybc(mX>j$+>~wqy5CQi+m@XCFk1n=0YV(%2G=w%9srw=j8S6Fw1M4rirH6Lw4Ahyv^RlMLBe0 zJHWBeAkY(Mb+^(4OZe*jbs@f|mI^&oZQfG*;oHpGR7<3YDO=I<`5SlILxs;ZRTWna zzMZ>Bh|ziKy;njImDumP_XuVCZr65Ir=?kICeqSY6RBk;sR+q*yzZBtZ{D1)uc6SJ z*fch(wofzL{Qm2^M}VNCFAzcf^>YhM;y%)+Pv&zH9V+4$R7t{0vwl`qn|n*Se8M2B zX?+dX(Y5k;vsQt-^IrU7B)2%DRZmLNk`={5-gcK{-dMwaS??& z96dv&Q&IG}vl6woi>mO8$%-n;)gk9JW>&0gT8$FK{2ihnAeubA1k{zyp3@I!H;7}Y zj6^ebF_G@SOl|m;8ofSl8^JB4c|t8my1R4zZlCs%nF~Mtq?6!k?NP8@uf_kRu1kKP zsWOv!>}i7{Hf3>BPH^C>;il$v=MOZG!*VwyHVPYy%iT!Ev?aPj64INhn0aO0^>U$dJF@?fS-3ALN~9SUo2P$`CxIZsGcf0p6p zH9xJjx5J|#AgF~I1!e&A@o(6x${ z60P&lw_{|!@DOP|KE3ksCnMmB-31NglQpbD8@~xu7B@X4(LHL=7WH%pfO$Yiqw%y= zDEuY8dKF{Td~S?>cbM5S79^AVVeX;;xAyBICKjtm6Yw zD@Ltuud8zl3%6K?bD%H$Oqh-+wz?WMDKR=~LE+6wf5X__ADx0w zNT5wTS|wFOsx!V4u+KFvR$-8ecFU+2YbhZ#9p|f?0!`>;`sURjzqVqRs2GDI8FC{2p`nU8JkuOkzgkEsKDvf!-jUW^~=`=9H*pg7)hVY{Ac-`Jg>6#>4LAq%h#? z2|%EPW^@mlt6DXQmVV_Vvg`AIuBs0jO>Nlym0T`MM{_PPQw!&R^+8^VF-iQ6t(`4QcrVE=Y59~qFB)ptymn5;M2sU2W7G~eUc&}QBW&K=vz;(3 zh-+o06H$&XNlIDn4C;|oV;(2hDaO)vLby!7c$(i)yLgUnJ(N_@Ci8PxYkhgyJyZ70 zwMIrKysMnJP`w%H7}xlUmrmU28mFV>>?eJ(5()}iuJ=kOa}BK!+C$VW;(IXfC9(bk z5&9Rg(Sk3;g=7#1K?l;Wo;B4ug;DYXt0d>IJltf(cekqMDccw)^Djiabu9)UAe6ds zr`ntO8E>@4=XZ9d9-H(N%4UZ4&d<|b;c9M)7l-NtoKX}<`y5fmVQ;3(`YT}q6B?djJ79Y*foQ+Bn}t^ftMQfxA5;YqnBr6tAq zu1UX^WF(<{1irGEK^0`J-F4B~Dm1`KHVUj(;x5HpXV17S!yQi`UNX%l3=-L(3x|#m zMXrBcHEhG}zZ?cIV~HXl?EXF8oQ42SjmY6#o6vJs$l^n0Zv>-EE+QuJ&Z#-mJ<)zei`w=OZ57(?SH;H1Prk2T6 zb`JD~HolPXa4Uqts`Q(ClNR$*zmV$ml|o7frhVgIs>x=t;SfpT$6Rl=p%zQF(<)Zu ze*HyYK8dSFo;+(%`}LFlG`43ZTjlx_mf9O?!{4I*xkrqzIWN;?S(K`F2{W_vhHC}C z{Y9|Um{j(~e%sN=b*;!JtI70*+^TYdWs+CR?iYKxjZ#VyrrRAv8+{LY^^Je3Ydd+@ zf5D8F?xtt;iZJ?-pZ+=`QlFV=p9PlS@TJyzGhIZ@%0ar$!PHW-ZZP-2tRE3a?`CrR zl-SMAu3Iw;;iFpHJ*+_^-mU1$&>gV(HZ@jU2z4j;xK>9_iwY~kPC&;tnc2v*8AH*c z8PA9=nZIf7D=%*`M6X)F;z}Fv!Ys$hXkk zIO%9;^rM;WMzeGv2$r=W`K1_HZd~O6eia=d`tm-LAbZH?kY?tZs-=T;8w zzbO1pr{_wSC~Vp-NEP|EMkQs`%5js7B5aZ=Nqz*=aHtjG{9m*E)~O^(Qg z*iQsk!SC^;KHn*BHecvJ&9Uvwz3HqRGyRCPJr?pQMR#}1GOMBLu1h5iXNN&D%E?eW z!@|s&w|+@@eO$Zm^{2uVjJfLc<}6TD#eYq?x>%N780OTsLSJzYt1rnEM8)hTl7E>W zy6UlMyvB73FJU8fV^~Den~>yeo>bl8h~e=%PaG|vu{x>2RwfFpVv^&JB5yI?>K53~ z3lLhE%VfzBW54D9)93mkm0sCd2r45cuH1EWawt!|$hG)yqZ7=tVp@b!ZgnMj{xZJzZd>%CBMB{@Fw zHcZc}CEp&OgV)~8mGWTI}t;pU;ui|UiY(2NJkIy~uFn@(!NaFRa z)#iVZD>Zk-l7RGk0>w z{ZgPsK9L7eLG-T4TWcN76D1`)Zh8Xy-zIF#-J`emTUL^W|5C_WT_*liarHVdLptaW zy*%VMx6(ywzEPnW3$xX{HoO^g8dbxmeo;PUC4%-3Qnu%0g^~U;^u@of?J+g?EWV)5 zwZkCBZ-9VplqC-Hm}e4JX_{Z^cWYa>ihZj|pDNEW;>GLL7h5Ao0)lU3kd{2MxNU3q=i|ppCotITT)B4>u;NROwhW%bpEnHBH>~$ zyZO_;c+0wFpv&~g<^G0tQku|zB$0%OhMUd3BOm9)qmN8#5k9R*N^b?WLB>}uaPxlt z26~Q=TQQV)UB#A610{K#`P`ZQYH?<7N>?Z3(8wDzDhM4<6+vy>15cx9#&XWx*1QDE zo|{`)&kOHu9Agg&aHt7ZYIRffOb0j0qB}U#wu!5v)TUv{M+r=7lx%AKwqI%lFtgtE z$iHl1;$oZK+{z}H%5n+mheyGCuw1&OgZBty=5kW_ruRS2m`Le4jy{p7&Iw5?%(SP$ zoedKz6_`W4vKzKB?f$y3z;t@ZJ^PeWTJn~vzuQ3!HDuO@7n6Lk4q`)n|wqP9%a{VN@vDUiLN#yhsvr6SQc06JLKzgRVxNykkHOQIeLyH)cyz{0+~w)_&N{7f zre80lgF;m=Y>Fh^zty)m}PVm(t4I&i{loYs6o*Ut8P1&paEe8Tpp^S*`~9 zLu3T@GQsNLDnk6786R@7YF zC{`yx-$H>2?%_b-M zw$Ge%J?KDRTj6aFJ@XJ;g^sSV@x$8GwS&USQ!R4u{;ydDF3)@Px$#zBlj zmV!%|5B|9_43U)I8OkLf@_?JcZW4{x@$O|xpiGXs*DJEBWL3<&O4iKWBq5-i-fPt5 z(06`-+miiL-|Xrj`8t2%LS&(n8pVvvBT27CLpoj$r@st%d94%R-un7vlDdBaj^N!Q zl)tl<3HKE}PTZ|<+Hcdi1PvYtXNfSVxKiTAfY4BJtg!SIh3Legv5uIZiX^43bhbH^$;YJ87ubaOq} zEq_dpOK7vfCl5wjxpVKKn6m1gU25A}y-UYjo$KPlce^Nb>o2=vXQtSC+xq z5KGKVjZq*zwn=GuI0fHQpEj@b9gZziS}K{pK#srvRdVY;W7MA2_M&GvbJ=)Xzk)?& zBqaGgl*d@jGIa6%g8x|Qe)tZ=$*idnhFML{7jF-$G^~>Z=>KOr=W>U>`5pM@;j8!Q z#gu%HHcorhhtFbV`#F7+(D%EP+(%nR%dcycR<4J&C2=iD?FyUxnTt`F*f>41Tsc_` zuU@^NMAYXDb9uuO7m1UJpX|?Ngouu1u~Et?1_WDD{pHSzFj)+*5KRZH+wi|@DEz*3 zM(G8@p@pFGRRX_(V6u!O<)q8rpQniCmr8>AmN_LqOnfP8=a%_C?m5ULhxjJVE4}S$ z+{fJOW>v?;rpL@IBZaMLBJuWHGA`tbyq0`wgqo9$<~$Xk zu~;~z-VUgFK{UW1pqju}W;B84_D=2I!h+0gh~-c-?5wMgrieU@j>4%qvL0qEO_tE; zC*{ae0SUCf7h=iO2Le8Ne_9s)nfW&|LusLxHoe>Dks9+&Pb`h&pFYOE1`7zgT|re9GMKHWDt$BL@#AmpsVB}1y@FAR z@zEOW70!3_(!-Pp!%v-&dB-iD#hWb;c}zfV2g{#^Vt=1H2|4C%b$|K9d@z&xRu6OO zQCmqk5}zwqtHny@y23r&5@;%IA+`CymuoV~GKNDtObQLGy3PlRk?c9Pqd8UQoux*B zktb=b)PcI+Cpbgb$x38RDCD}HD^Tz|4^Yq%kdf+(Jr)OZnt^BkgssK1U<&NtLy}NQ zo)spisRX-(*vnX1o#lAbXeJA->D*-?As`+g`_wd4RWEqn=n26xoheoXWsRvzcv2ugi&p%n zPbIP*F6&b>0(c_@a$oNc*SFex&psb)_KQ+$YRj6mm0_nz>6U%UFL$ifZGS6w{PF6*Cbqhgve>npV#TOXJi zk--Y=47zI}7xQ|HO6nB!!^<5~rQ1(1Fo=JHuNa}F38DEG zQUPMa`=RaaN2De}#T-4Kt_pix4IJ@dLy#MobGbG;i*80G{}s?U-Eu)?kND2yR~&S+ z`Y!%U(xv?LFN$|JloFg*4qF9nr1VBv=Xq50V~6>oYG45*1I5qzIgaqB}zmDP-$;y0?#hx8FYxJo1hw3#AWA^rchgZ;&G0B`kAAA$dqO)O}( zPaYoPREIQEfw~0{7bZ7)tIWjypUmRl=l%2TZ@$)lUirVk2KsNg1bhxjQEKqrD@4*L zBIBpQGm_w?%aH3ifLId~D3hfQzf@)XkDW6jcSR>te4aI!&oo55hI2hEzBK?_(l4V{ z@qvdWXKJb??k_;;`FkiHU!6+i*1_#Iz|b(!EAW8SSIJWU58W!A^|!LoaQ18hk$D2ZAVNU0jvk$~#R_nc$#q*ie?ZRqU_DfF z;eTV+fRm3rzPijg)rgsN@osm(t|_J?HD=5{Qatl4a*>c&R?&E>5KmY3U)&-N0pO?G zXV=!&Dw>fwNM|W|dEn73uzF-RR;H#dJH#zwa*~Ap$6U!L|HFxCeX{=n@^WcO`g*m@ zuq9V+6y5vCNWf|Pd*oyNe%ssES%U`ju>>}`AcxLENIw^Y+D{<-Y0NdUru~)u zyeX7OoGsd{?^HcKOsmecsgbkCSInrCA9fm&PtIHuihRg}t9#e23)p_&PBRCT>u3H_v?UTx8p2P&B}mY+0aJSN8rR=kberBu}^8)dI9Y2eWw zp$7&A#XwS)F|dr0!fzRsAXK-3A0m*T9jc8HW6Vhw6{+H*UwhKOR1}_P2ESa~|6c6?*9h?m0T~9_I_*I*(yffpQ*JeGk-{lwBwV_fNy_ z^YeF0OyfV$7kMWw1c#m~@>~xe?y%ye=zCujt#AE`b^PyQ90q??BK3xfgjMFreUrFhj z=71jkl_o29W-=IA^g57hPJ}dYv1|vCw%eblze)s~=zQ2Hx?`mG#RVY`h)jw0TjrU@ zWQB(tJX)E?$q_pPa!ED97bE*CeI{D{Z1lB{#^v~33VYtN2ZlctJXjr$<(Hcn>zh8? zhV7c41^Vy4zV)_yyi41-)A)GODb`XH0yH`98UyWF154W))Z>`ZG(LQQurhvj%H- z$Awd27lcM~;oR=*Tw8Ag(*$CZf7uso_8s8vdd<%&s2*9QkGYS$vVAjZHKsxG(%C^* z(9*p%6(_T=_HG)Ui~8|ue(^>e=16{rw^T+)3cTmSV%`p}@fp=}DS$^vXpvwyK+axK z{#xoj?AKo4WQ`S*Fzq7U+=dvorgQaoaRfn8QTzNVug-^m&*uVcUdvCoM3c=r$U60F7VZ``S|WkMagjeK}) zgQz4T9-MSZ+V+@pFaarI>es7G*Puneei7)#O^_2`{wlHqYm;^sw8$H_wIi^sXU*$3 zX1=h|8jWo3x@QLC8po$07~?+h-Dw)kaq0|Bsz&b@5IZ```I4NU3}=4xJB5N7H(?~= zktNyK*q|<4*_`;%-*T@0H6r+&^zH3%{(D@jiyucWVeAn32T3gyuQQYjsA`W(m`;z% zvDe2NJt{5*_T810%g^Hx4R*qRII?7bAN~K2Ms}B;wGU=8*)!x4u(cvyong$xa;~ak zd$3j_{yllPSJzI!DpeMxbLm99rCOemb+K#k=xBXU5zpd%4=-4@y>1t7+q&w3M}|F+C?5i-l^+!e!-D|aP}qfz_B=X}ls7{ct0VwYcFLb1CpB?y$*H_ z{Ui>%YQ81|vV>6bQ()!4D=qDhL7z?jI5@TN@zt~m-=p>xMWDM@&u_xw)fe2MK2lrQa)Im zUgUMO6(`uUzv6@UU?ekp8HINUnB ze0i|37afJnk<23H{4z@rj?Qutm&OIjjApj=Td9?m&Pz+B!Iz&dyD`BU*)j9A6eJqT zXp^>UI&Q%sujyvBoUocHGCS_1sw=hIiMKpTe<ij^PGa_9Cn z4zooF(8&(tx`zYkVeOiGc*_U4Y)z*}Zo=o@9>=R}Wl1A$DbGo;y^h*_g{+RoY#Q#}lU?IntZTCTKEQ96HuZdJRLTd~Fo6&IwQGDTrkFe; zJHs11J1P-+rI|llE_ZZx8llqD8OctwxpEi#=T`i#TWbSC)-yF}HRgDls@bz?yT?1e z%(Jx)@I8V8(ua;E)P@^;8%uLAb9UkeX=E$UB-vTPy{r=Cah}EXjYm;{_HS-6iUiqmng+oJ=Zu ztFel_TGRH6tD#Lt*vAy-VV5yKCPCCDq({%}F&vl7q4-M!?oxqfndep<6h=&ZS;Nk# zC@y|d9A(?MS6@!)+I6~Jq6DR+r zrP}9Z$Pi4PS|=CfVFj(88r#vH&OGZc*+g%9&(Y`@kpv*jqF8U3xbB4N93YfU>Y-`+ zez$cEn>c}mw_Zi=3q2iw>nGJ`l1i}L_yQE*NOtWkHY%Z7+f|Q1=kCBx5|HwZw&z^% z3+)`)25Ap!IA&63?z6m=y5n!YS5^TuTi5kH{>xVDDdP zxIJx3_vq~eQON!9S=*uPrv|>upY3LSE(uIb$p zJ;jJ6e9;9PbLl(VizC+eRH1@j&Uj5D;P74?t*HK)1gH;_-Ls`2c>jj4;8FUy#LL>w z)7&Pr$&oF7w-)p^9a00&(1&V(8=%paN@k@G0(K%X*qxH3_ibOevbDRdMqLh z`Y3H?_D4eLdEY>pScBJ2UE74tOp0C=ZJON%w{7a-=v33$uNVbG4=;tj_K=lMG1J(;F zW~B9>9<4xqG&M_6(|ESBwl!9iTttzK{w&+-6eLm z89cF1%pB>WZ7c8Ld_?!H7up?7S>4!ZIHcF}-aGR0xN2pqD8`HbvJ<*^-z_|>-cdyO zw>ye+_r{YE!c?C^9Z4%8@2_rSZOs)_yN&Qde{PfTiw|#{^e3fjlKK#N!?4@8b*6_r z-%d7`Vk3Omf+I1_b3Bd9$LVmBxDUFU66s0~zN|Own^P|AFZ<<6uzk1eX7}rWr^EYY zroX)218ud`GMO;VW#!ZQJ}A73CTI)1?_7~Lp?yAkhpvfx8uG z=@_(m+Z|X^CdVH;nD;m9*qRf)rsZlL3MtzTd@4q`;ZO)|7at47raURTPM<+mqB=^98~w`X{k`tBIdhOlcYjCQ5A*fpoHZ9E(( zbrVOGB&PYGVCI`HP+xw9BX@>Ch6ZV4o_QCZ>AmB(Vy#ofE?c!lCYM&NZ@;%mg-vQS z8xD`DJq!gfCh8>jY%$SU_LVI!q5+U(MZ(_`RrQpB9m|vl_z( z9c*U4JbSSX<0Xj2oY5Y&MF#DYjYx;_*`t-9(acC?WtAPT-83MS@p1*+B#=M4K9;ti zE@Bbe3H#IGgG8g+O6&>N53G%W91 zeEdV{da#dFzqc4yS>{LA}t?H}{KeAM-OqJ-1Q@$7i1O zr{;*MM%Mhw<1oW*SofTWE1*a@1J*=?NsnN-zy)ZJOTaw-^5|U)C{u+j`BH~s3Bn1m zYd#w^O7(bI>*;YoJMkNB@ogQSd=T}0jf65_nK=F)9<4i7E_ zr~K6Eo_~J!%h+oJQC-)9xq-0e_^Vy>9>?V9^GXm}>gxGql}q~-$I zBHC6Oqi|zl*rGz6utZ+l(^FJbbfT=wEP0g0kW$%5Oy6G%+E*pukt<)<&37T<+NO{! zurE~ACkX>P;iShW_Nts5lHf^cDcL*FEk@w1@ zxf`K8^AedDVO-+HW7;qu(W9C?jqXGS=-_>-Ie)Thn) znP#Ws(5T$*)gjGKi> z@2K#Dl!l`oH0CZ3Y^2BPu`siwp3^W;giHdNwI}aManCvEc-)*fKdfA$*+A9!^4)wZ z+vo;5p2s`a>H>SrWE^`i&suGT?iKE08BSfabjrpv`{KZR;VQNg9^_MJbHY&1Lz@lA zqrA(VrOO%b4QF^e{xY}`h>~GOU#`4I0 zhjuNOA3yJ+Kz%`=gnlDeWPbtY=(<{*ZKB&Y^5a(Kp<4ZW&eR)ph4AJA!@t&0*YmTr zn@b~IoaAF=Z&zxxcvmPK8&r**D{th4ZZ1#`>tfiyiYqtlzLtVvAayj>#cBpD$uLUB z6kpk+7e1$`ahTV!Zk_e~H?+!lj1r+l-eZYRUHyRQXa@2Z8|XnZe7zUW&n3oI}d z`Rtx%ri}~k3EanCN!!f}V{%rpPdjX8YMizv34@KLC!+QyRw`mjsI`he>)QUR-vf1{ zi0zju&+TTzxMJB{`&0M*HgzNP9$b1K`0)B3kE!i7@HC#cayW)mJB2zYe~%a#eaxGR{+T6E%h+2S=$;TK=w|k}p z@j7w`>!&>JzPsaUYBazWjY9t8+0nLKLv4Hou1$`mUm|0ehSl028jWU!yIal;ID^^D z`+M|j$=NQDk%?K3qbd4@MMWJ~+x{02joQ=0DDaN{H=iv^UsT5-G>~&0)MP1PGJ;#h z#&R$0c%!2uEaw`!i{ug$a{MkVeVyldL_M#fkuD9epXX&7#-li|Y@|g4U6=$$_V*q` z3Ja<$B1gSF>+t8YY4eg0eTvYQQ^$3eb&5pv_Xj~pMs!PBglzVQW<~Cc1?hu}fARFP zkq+suuwBn*Yi9m2%PcN>dU-Ej$>V7v1@Qr=bzobR{={eM?y*y!PO$c3iF9?2haB-ORY^mkdE|b%LV#Xb-~@Dr z*S-*-9i7})0Y0TG2}$0`0Qubfqdh;joyk@)4F%0#jX6}7iV-I?FOhB!sn~h-WKvuLI z)qLAUT!k!2;;Cg5wtD57vv5pv&=p=|AQ9y7lG-#fBE#!opIgvk^v_JgA zs8)jnYxTz#={A;b^}5yt`X)z^3Eu0fH0W56{AqT+NaAMpFP)NQ@>p0Z7S3~vUbG%M zG%A1DYABEgVzagrc$V?>8MC^w@d(E?x@tO{;^YTZmBaUekd7fkREEy-qI1yAd9RN9 zsvq_qCXMw_0K@Bjon)|e!x*H0rh^$EY+kv~5U3D%(icm|F3ckJ2yR_!hzRjEaa?Un z1HBc;=A_ymHpQO$0`a+f%BnFXHxloi^ixvp2R$t@=d_LUZSWPCRu~*J%Uv1cR_6$- zH^fvPE{Vy`p7u=PtuePeKg}MEv6%eS(GHaD0EorvAeQ)yz`bN|3sc|zA&$};;}=1X z{my0XbF|=DU3RFY?QQq=YPXG3y>(RLIXm1>ANguLbnh#;M?`I)FeLVV^ca15y^-h* zCuMCtUi#bof$+TPAv)>)`4&Hq*Q3Mdh$LqvJ=D!%`_DrSUr$Ng83#i3NCB%L1UwB+ zaC(>BbE{Tv(#-|Psli{80szQJ+c9>coIF_qO9DJc{l7fr*YL2sRJ)89n_njWa`n3E zNn0Bt)CpjRX>rMo~dO-@@rx z^}pU{p@#qUOrB3x=~d$~p{#EnsPa5sQFceaoARB_;xPO({rfo6wq4vaKGl|i&eRh( zX5{0l;ws+}lhaS@?Q6hS*~2x2f8K1-0<(e9z}s^SE5$VGz3h({6Z3s|aHQCGdEs&!Au7a@l5P^?17DMiJ3>ohnOsLgK z`p=!n%>Qo8!v|o)#EK>U*q$~5n^Zr1+Lr2{H_oFwvjwDsq>ea|AHfM$|l|dl;%8 zvs)o6dAikoVSYC>qA69vn0_%rZ`&gVd4tr5TgAt*pnH3*EiLcgYxoJdEC4^_u2}hP zi&*hqwOfI3T~l}?mkmrMZ$-iImx>p;(Clm;>vrcA?@1uu7~g&cA~#`N;JJkBz>F3; za+FnP4j``Jj+o$=3T8`ru zdpS8dlVVW3kyotbIZ{z!gJz+r-T_k%gkYo-8a@pgNhpFQH(a1pfnZI2~UuUh13F15fkGezY74R|BCq5VS!LAZp5PA#n@oGfue34JpX}vQ<}I@ik8LP zA`{uj&!&pD3KM@sH!St0Y#0wrS<*lGamyck?FaG5exKTC>lf&w&9U}c2Su+4sp~Uy zh3RRib6bh#Q|g@OaRI=4cHyv2d@I$&XFq+S20(tWKw&(DOiD*o8NQ!F^a{Lr%^2XM z*IWD0cfUOyyTXzaR5hI1&+IRntnrE(ajhv z3R7yIPCBV^EgwZ_<8bETo{y+#G579Kb0^(waOVh-LI?b>N1CMk02Kk=$nNRc;&Cv| z+Xhju0*T|U!*t*%iiIMLjV`8t;i^jrC}TMLIs^{i$^h3%0RhaYgES#6$<)R0#uR^D zO$&vSvl~Tc);a80hxQ6DoC^9z0MK@_acHPQbuNO%kl$iFIWjWhqa#2oHQB3XX8!U* zJEp80U7WaKXY0IPGi`3uvfNzn^(TL2Z_p2zDK#Zq@os8kY;=Mpr+X>TxFL`WO3WWS zTYkUkh>`*wp6?igjGCG46cmQ!5j!PqG5A9%RXWLpS3Kyxk)`Tg9lpZpA6oWsIW3pZ zJ0YBz*T-iPX4t6X2z8Bm&NX-S<+XE%ei%pK?)U`RYJjJQ!{GfUfKoQc|3P;Ke>gGsUNETu zx7&rD=+>Vu@iQiJ_;+ z{RVQF!pRzmL9e};Y869o#;ly-=8ejj12y0Z<-fjwjM)^J16(A!x$PRtBQAl(^>2l2 ze44D098v6xsyqQ(RI>$#oT!i9Y#AX;c>X0ca=V@vC^=3dQi2RF&uTXui`F@TKt$JG zJFHX(*IV^nx0Syem$ip?%m1HSR%0KZVAH+9NmiOEaaSSepR>auW>0VR0N|q46YR_$ z=@kE{Hrkzf&v;39%OU0uj3~!g4G226w5E~DHu`gHIMK)Gh`{*0Uq9jR-NL@gy!il70m}BA0_twS z@Cr-SXk_VACtPiN7;^oopqWkGEj;!b?`7>m<6j$2ofEVVd^2j}65;_Zui>!o!9&uN z03mBWzNsly4)-m!h+qwgF$NiI(ZX2;>P4hwBx))L_ zfrydXZYyWQ8yxnbkfJ4KUhRXUsD>rkag}gJyAQzaqmgr-R`VWqQ{UpMVw>e?+s ztvZ%L+1UADH-V6BA68RParaZLHSc~cx0{q0paE`m`E#CfQNyK8*TEe;b;FDSGoKbB zN|vi@buODr7!y|@DH1pKaQ$_{h2B5;^@Ym^P&~T+iShG_fG@IoxVQ#dA!yYS7aMMqn5}}a`}s54g#=6 zRz**DS9%-kNuEU=5M)PUGub1|a|lw|<7YWu1F|<0x5!U`Sv5}~6hW_4x)1{KLTX90 z$mos5r?%=u@A2<`v`cpb4@IE9?CprOT#t(U5_H(iPD_=%e2QFku8JD@rE6y_& zW`L~43Wx~oe)H7Ncvac=P!s6=179Y|3%8I@+9^v;g_E>T`o*^O%Mvrb8fMzmC7g}# z-*9M6Xye#|ykOaq3lY<4wCnIxYBjF~Xq1ie_z!T6zoJ>Hmfl*~cuJ1B!G{=M>&S$f zpTaZsVoEu^w8D;_zeu=Qgbx>XOp*=S@=d^KSl~=nDXBA~Ge*%I2yb4+{Gc^o22p$; z!b`Iv+7P3ILc-B)cZFeZjGfNrYc}QLl0(&i6!?$0qzrfK=PJG}4l3VnVx%Sg;SxcO z9))fDHwxR|Zod1TpQGE_+HlubME|X-u_*1}SE6dI>t_B(-s_%>>|(LMh%2Ag#o-WXwlRde$)qURmz<47 zWoVV&xkBlQ+x-plCwNI0m!QAF*yA85PQ;tgPHiB;^;)^REc&VBd^@1;93P)6Ckkdu znq!38h_F{@S2vqYmU!jBz~F@W&9KzfVdzLkAetfqwwOvE0hj^?R$}9%jsPm!Z3nI> zGS#vpdqENVjCZS*G0?c(4fPclknCpxp5JdMj@JWbuxAQcXF4)F-bm7}!S5Yjl9UMO zVrsFs*a7rk`nNvwPe8dpX+7u9XA0!%+aB$esO)TQwMZpE0o5!8;yom35OFymSqKmV zI^YGD-B15os^O&81|&)a9=b!T-pwrJ)%1>$t3R<_!YXt;-ar$EL<&P?BzfPWM*z0j ztbv(p=zJ6GdYR=T1B4N_$flgrH91qiu25HZO+pPfR}$PG3gpRgLCwqt_|&SZT(s#w zDMiLC@i-GQ+W>buK+_`Wc7gn$4k<0-_xwWL4!0qz_o?Cub`tE&16B0(_z+=;0rXl0 z?LqMp4$dSA&taSzv`qk z#!#yi?n}&s;b&uO&YCIx@B_KLjBm%r!|$$wHbW~a-F^&bo>zJPeHz9*7rPu0pdAvR z)PfPUHu}w?F~zy(xJ4g`D5PES)zB43BR3VYZ~3ZZ2W+f|h7u^~Mz$4L^mibAtB^Cz zd*R0bp54Y?MkxpHmR5(gNJF2hX1$~nSFfyNe3;rDI*8i?WGLt5dep!~VS!v?vRp*% zr}m7brZ~RUlmzUj>_iqE=JS$})(x~oUFq=KZEP%^yx&3ZoW|5-u~PfQ>s$HKfJ8`4 z;%LcVC-a3rC@2W?PBJ+@uTWRbX(C&qrNL=tvOS?OuPWr*H+C_qI3gfdv8JOzw4UGd zQ;wvkZ2J_v+r)Q%XsI&+^fw*ZNL{SjQV)>JLe3TuTLw$pzFK8h@J&TYvVV6#R-)3X zITXi7vbW(k->wiq2lW@L_e6BdC8!i;YBstZjjscW$g&s~sHw?MiiiZc5dwG^-jtyc z7V}K<&m&s5fZpWN?+Ql8z|KIL+b?E>5UZ;cX9GdlgFE%!ITfg(RSYSEeggwD&G0za28^F>or2V+xP2o%eVyehO;f zmP0RruZp%Y_Xc}2+_FDNXM&RJK=#uVZg!JZnQ0b^Up%A zFoM%(bL9nBT@%?=g3_tQ*A}jN|MYEewaoL9N*n%dvCV#(cRqu_T^e`%K6^^^C`|Qd zKe@2|Qsl;pq6edaied{}gaQjo2I;e1G5cKXxC*5(z35s|3&IN3x&2b?J$mv{0rT6} z|KHRL&OGRZ2gJrGxheS|cT`lNc++yfHQYwuzbtI^rw>gfze4%{reko>uB0F&U7mhU<`_*;DQ2Oir(hKbytxkZb~^W}a3!+2d)Cb2 z%>@g{-%1{XODKrp6TCQAjSgtn35_n|xhm9ENYf>`mksXr_uO@Y{j$~n8T9fv$wn_h zX5;@yH@?&o=)VB(Y`cSAB{n6osLWb@TsOW@-I~Z2g{8lWFk* zKdwfeS*80ks4G|a!Rh@{Bq``5jXL?ZAE!lA%5^YbSXhg@UNMY%_4L$v{Tj>Pn?A3bjf!{_oY7%>#VX;ykN;tB zc4s!(YmEBo^2v)RrrqvO0NK6V3oK%bd^wHJC?GKpWbnIl)`70vH3Er8B+zi^P>P?UtgjiqmvF*t3f<~`|+I+Z#42T7vr6S>D-IYt>mb} z<@_$L5W|lhGta#n^Ti$DE1sK$ty#(OI^!c`Y|KYRqUX?^JPxZ2(C0u)G>F z+MloaKq;iTsbh#**B;$I(6Kgsy8@wxu~sR_1(j6_<>?Xl;UqrmH_{dgz{hy9BH%v7oP z1|oZRd~|ESp~PRw_Wlo&Ys-HM%1=4;!a$$^?$Oi#@{ICBIlhtGZ%Yu%5l)*(({|8 zn$v@=vSg>O#<-Z3M!vvlrPtcbJEDMXPgtL%g<^Ke-OQflaQDYS1@=DFt98c(9ElPv zw&IT|zJ7|L5Y{gR#_p=`zkUg09x|O|nLY~&aOu$RC+`RnTP~+W4g*DZx|=J6GT9@= z9>&t}&hy#*kX>r~Fsv-Ra(RT+VC)Fm@75svm~K$z$tKp6(fT~&-^`fF`^`jy&wnUVos;<;v_i^vR|W9=xliyQSn6w2NcsUMXAH@p zhTwUmhqIw=L3{d<1TC{hiwE0cvV(0U#=WL1?6(o}_Y~5H+|~6V`oLP|QPa7j+6(I) zS)FfScULmzyq?u>Td80^WnvWj>vM#^+c_q%Cj@d$Mnf)Sk$-At*Q9lQrrrqB=O{e`F{GfhlQw?i+_#R! zpB*eDD{S6`K|>-iF*qQ^-|UITG@aX?$Ni_C)YKl@g^`IRcNT`;`DeybFh!vFpU}Uh z7rUJ7>5b~*OXC#5%)l#z_kCM*Dz@|YZ;CD5n+*dER%n#ALL%hldC~p2_AGgTt;VYg|Hhb{EAb z*X4io?O#UN&|aVIQ+aHU*AJR3BsUZ+CGYX?G@zz;CgJu<@@DqtT>m^^5Rc}wefOX9 ziCbUMM1eG)m9|V5;*d!hv&GJQNvto_hW@zS{^v)M%kjo7ORuCT5oa4!HCmSUx2ZES zMXW2Nz2~j%aevjQE{HX{v#e>#B8NZeRA0#rKlnxHc^9jnQC48^2)ZDXyOR99lzl8l z&5FbwtDn~Sre%Vf^agog>fmz`ZNW5Cj8b%Z2502SK8Y%t+(SIdN?ktz?p5@ZlnzGZXnzc*X_P(q=i&m;BqRcweyl*7y zp{Y>u$iqR)Zr6&2p<2|mL{+OGxyiTx-m`$7ccZTP!`7`aaq#0K}e5 z#aCPSo#1|TPw7s7XlVPHjjqs6lK>l>r(4BQs=x1YfN?p_y!`3R2*JCq`GsWL*+PI* zQS-l`-(PAq&`Jey_(*cj5Kz6Bzk?L|Cf|egod7c>5pkhhc*|R%UQ@f*5CE& zf?N1Ej(>L_fB5y%((3gYt;89!`MF)2h{smX&)|Rs%rxiO*eGOLQ$9?{`Qi+8J-^mR zo1Zf3<*2V#pxL?S?t6Csh?6Z+zpJV~P|G3j5%E6|U+lJ)f&%3SNCzOkSIE+g+tCco zMWqhbQ{BI=?Tc$IjN^E8fja5!sCSwXKLmeH)QUUE!mYS}rMKU+c=sG0YIG<0RX`yY z;XbsUO%SoL2lD^?CLyMZL{PrgmGF$G%7~?lwn{P>IW(V6%X?K?F#D7yo554)3jC&B z)8rLPRIeH8z<49a%A28Eo1p#O=juv&;g|AC(Fa+cix~n=>FPhG(>e!DUpo;!ndL{O$6~W}VsC8Cls@izxcF=W7gQwk`*^l%xXbEJz z%D$hz^`b5yK~GMepp5Qk zrR;4D+mKk=*l91Es46K94Gg^Tu~Jl2jEafcQMW@(pvdDyouX2!(wn}N6%}d0R*hm9 zFJjqEnZSOuIQ{I*8@nZ`R=i=I=^?Hg=+?vSUCY0Y$?9iMpp~Xd{_t00rlB_9{2mJ9 z(Z_I&`8~lDvD`*4gq~yeK9o^P7cyV!o4Eph(-m)>1|K-$Rt(<%H%6fIK8eIo(my{! zpC6OyPY^f8-uUJiYy*=(ojYGXyNxcG(rw$S6tulR9P`+%ctG#?k@(#>HD0FP*K;Ya zO&>FgEe5RVKcn__KXttTS2`du;o-cjpCFTZt$OXAzmqOTDc=GP|MFZc;uh%l7GLvf z_iXh1PYnZM2c2`#I?E<}_0)^>ae;&S&+VqDN&-cRt0xj5(kLqe`i5|qAtQ&R;^3*p zf($UbLihuek-y-Scy&NlQtp(-S5HS}h4*@KLXI3jd(d}g;&-n3ebIrCRt*AOGxfJIggXQW&NQIQ! z?c|vS_wtLU=tU>XAqvozY&GlCa~EPu!90TUcrgJ0WVwS;i_@)-#R5*fcJsRRm^k*( zosR=~HWXZDf2YdKgh)5ndM$R}q9=P>U?e%cE!P_9Z!lLE+vTMZX2?DFEU&;!M$YL| z`t{@Zcrpe)*#g47@!$T-26kTxUVk`nbeu~U5}IuknyuE4@hurM9FMKYWfERH^F81y zvM4a#pMx^Yb8K1dGMzsz5!?}?zEH~pVTO{~_jh9Yj|eXgjpmr_MKqg&E^Up!Y164P zcno0<@z{zfE{))cyy;q*sY=es-jcD*o!9`;)6fVx7dFJ47QF3^e*`%tdF$R`(7Y}7 zJ2w^mieVFXec$%TGXzhBIOT% zmbpL*O7cMAjlivtp9W2PRTak8GNMW?bo~1qu_e~@LzG#p-1lMQ)t$*%9240sA{P)WAYaHDj%hfxpI^>nJw0 z4Ptc%>%v^RN~kdBJ@I(6(^sVvqi(&Q)=Ndj`!nPJp^lUP_M^>y=A-4s;Yp=$AE_|5 zX6Q||^Yy4BW|<6S4pv0J+Kn|a&h;zeSovaw^kFu8@aQZ0U2pbgxH3(=VD1wpc~Q@` z=@4YM!pYirmr?2_IkTIVH@|j@*99d9LJp$WDl}}ztr^#ThFlM56qziqH3(at;~aPv z_iU$9^ZKZl`QX)#*S**p>fvhankrpUvjdH+`m9Iu;Asq1w5Y9fsFcgt5JNMx*JShsB1U4KZ!RnB?V3db zPdJq?8y%eTFj(Ow77}HLg%*t<{$^?Wg*LW^oPCg==n-h3N=%gBIU*eIeR)^e16SzS zE|n|%1cgS4p$ki_KL_Gg0$i>~Aap;Am^LD1pvc4Z0 znYr|iefq&ww>QkCqImX7E67n`d$-u_V6lh*eF31@fyph@9BPN*o!p-!)7VvPJrFKFK;l;6+D4a#9S7hgFS7P&bHa2kkSHjAszl61!{ z#$;$dtKZ5A(yI(wEkFtC^7(r^Y`k=^;r~#bSy*#aHX*;Pw(vCyIRTLrSGv zA2ovxZi2RaI``_ROZA`eKgcReH7{2iNiW@?j$@GWT;E6*Z7{N*Eggk7zYiF@3=MUs z=9c*=S!x2SbA$i5XP{OL*Ao>I^pOkdaD6-iues@UWqEf6v)zbf4ZY z$a$%#&hB8biXLNOr`e=@I&{UN7OqSMMC7QS zEPMxv>f=t5d-uEUI9D-8NX!`NIwZ`VhG|;1f9UF$)UrX(W>Mq~7+dHW$Hy2OzmZK+ zdaMyARP@5%bWQlvjopG2r3PU*EgIDGert~PdSxPHLu~OqSMf9l6she3A9;$hmQSdN zBM#^eKI{vCM{WdO+^_vy1q;#!-#A?p++pRdwDUq}EyZS~^e~FiB%d##tc6GW%CBu| z%6Y#afAYwkF$(4ed?3i`iL&$8vW$aG&(FUZ`J)(nE)GQ$C%qD%5^w`l6MG65IYfm8 z3Z^;qYFVbIxbnb-WN|K4n61TB;8ySVbOS&%9rj9h+dXoH#X?GF()7Rc_m)Q)D(u_a zdFRQ(*_@a+{U_Bi(NLQ-U}pV} zIaYe1>FLVAd!`{vuSijRfax9@s&%uRLCu)pG8QfgW$De2v1cN}&S8AbNlJ`>Yb-X) z-#KEn%4Dt}_)2H9lA}ww^k?rAc@HH{+ETSTs|N0@MSGq+>p1R_48h{!R5f!JI&qI^ zdnv_FK36NM?rhGQ$j$zkS;i+}+E@&AqAdogQ>r_f)v+avGtk$J+Fo@88SsUDE>B9X zm?bOrJ`|hoY^{pWfu^}rZDBS18@WFF$KnPQkWaM?uU`&LASm+mBobkGlcGpwV z>gaq zc6QA;hnNf9pV^Ji zfjqU1*;biWQet6q2mtz`D17Lgnl%O47NO-onm&x-4 ze#r#XBBp9W4&}txq`O#|8{{>h^#)bXv>r)(Vl46VOm*6~DQAZ2XsFEB2`6tsuH%{d zRX)ip^V&uO?u^I9X7^tfO7J;MUm{*KHB0A0H)aqoq(-j*XJR(R7tCr5t$K3%KNNH> z?BfIPcLA7G_e|L7i`8p!@AZ?A2sM&@f4exKk-Y68w$*(Or^8mJ{7mTg_>X4-wlXrU z{V~?gCQg%gXXL-Cm?ReCdhS6cf?dvf*e<@k%{5Uyd`;5Op;hlqf4hW$MJaoi>HoTjsS+I*U?b$K8Z$xZmPm#=yigGnkZS}xB3lO!t%w1MF zsh_gGdD9#OV>nA@o3es0fr+_NxYIp?x4i@$p%+=#HV_ipX)c4=Sl+BM;n3)ojfrOa zQJyF^X0eE&{ft4W@e6fFIx#y|?-b)ESK66wr4e{|ifWO^-jLv;OZll%FvVKR@M@l+ zo|ssU*5B>UPQr1R`KdF;g`ndrJ0<`)Twb!AZU$72p*M)EO)q(0oK@%Q@Ube&a{HC$*1RZ3HkgRumL4+0 zqZDH^N1&w}{YvOkQxizx`lw{5KT8JbrLjGW{EXW^o>3&E)hM5?cBTwSj_sd|8?}yU z)y!)byM7?X%z2cS7-z4SC(evSrd9UOMJxOIUzqQ(Q~t8?^j|{!?hdBBx-9L}OkkFw z`%`HfS_jTulAA`z-F~5U?I-fU(%CFT<-T34eLwrI(xX*EJN94LDS=e>QK&XfCZ_9* z2XdB3qH#ZJt0K@S&SVGs)^~rn)17)jWzW&EQbWBi@E@hB0K*}M6)}{A%dcmL9oc6D zf}y{nK2Ar!k9i~&C~P~@GP3+uF0-+nOW0vSh2+KbS7ok$?&N*xPPfd?_GHDw0J*F9)ePSGmTeno zvI^E|dg<`4NCqnu1hgF%m0Ain-6h(_%>#YJsI(-=dQL!#&jNdhN#4yh_$uJUn;-U6 z!sTgG^$97Qp?^PiXab`au@{c|BU#vhRfxv;o&Fel*JHOMg7e%j78lE~@@7p}Z*TLHj}7+lLm;rk zB*8$0`YG)?nw>dJ|J}J%QMc&`V}~sx>Ah7kQPH5uz|qP>Vk+t^_{*1dc$!5{DpE8ZoD@B05HxTZT>Ol&wWz* zYx@-|*_CG_St?~;tVb?|VC_oLazuEq6CKqJ@?9jvqu1mtUz%L;m4|+XUfrTIk(Fw; zP*nB3lxLrOZ@g+nKY)`pA?x8(jf2&wTrYds0F`Z(MirIV#P$pGM|roPVB?h{ zEvQvQTy`PMy5hQ2KxG+iuk+?c7J7w`hvQyO8L*je+rcD zEVSvF5A|JS`8VtLI6*hUr0h+yUowj8x1Fha>9<<6=Um0;U|aq(d!u7>Nl^xPh$D+p zk509|+;zRtlD46+?Uu?V1Xx?P-&8t0M$G;_!MJrx^5cUfHf}A@-PL$t#Kt}0AspB( z%IXy32!Ho1UywaOw$MSTFnIMNA!*&djrFA2DU<0pFm%sym*1G&>qYV<$x{)u%h~Sj zK{eUGPf=>6$feH^N49RpEnH*17W?V)Q%h}Y7Plh26|Y3Ex08j{^0;Og%USuWj#68* z?}EC|^pOo8jGw+fYe6m{7WT5-9Y6CU=4Aqp8SgDoB|Tv>p?sOK%`5**$QdZl-d7dtr6dk*?$C;vy)~J?_xOsz{}a~CAjQ~)NpZFf6gmJ~M2)t+$@Q>DBoxKF50-(aT&tM}?1>)>qn6-%1b zC`i}ZQ%A~8o4v1EV^O_d4f~B!nKw#HH_~g}UX2M4xUdcJV^CU8;?TK>8jDcPklYz= z&g~>hwIL`Y+3pBf!T~HO@K&qmUhKS$^$V0ZIHi{7aW{CdR6x-1esL+)ex*F@LM|!D z&MYq`AMRnZbhR|NX;iK`YjP)f{-OiFA(ZGSR8U+7u!TX3;8aiUs=3D5*@_gN<%XTL z#dCukme;i=G-7r(sVbDIX*w4>t z%YPsR8cqezxgF{gNjW&6_fD-ql5V@Rc$9d6&~9^!1uKE($kiEAfin47i$}Y3PAr2+ zp*nMk6n?QYEZU~v5uMLTXNNy2Qq1QS-^t^pFS4lb)q?gOhgb4r2U*11q1yEaVEFBl zJ7ogdJIx`xZ?XH(i2#4kl^S~~!8G?8L9I*;okalucoGkK@c>4 z5P(;EUsIy7Xd=<-%^+m)73Zq7kH z4RDPNi|CG(Ycgk8O@>19P|oD^c`3iy{JZiueTE3zsCkS(ladaGRk z=&A*B#F8Fcce7sX^(b<mi7G zp8kQdOs8oSSpNC$ch8ZtYB6%R&=2%HZ`wFAp> zi_8W(gLmK<&PbvpUcVa5ANS`0GSTaCApbNncT+}Hjwj#vtc~ZC*A{*_dm88M1tbf* zeq%Pcl7GJ^W%ER=}W>7IZG7OrD}tgFeyj6yL%0#*CeHm^L}RQGC{Ps5o74^7wS zMNgJ8I4+*)lQN|s=eddA2y8c4)exQ*e|noLqJfypCb)0l;qfy~7fkW+#Rl_EU4-3` zSud@YQ8Sw+3+=NqGkj2OcVoS8li+Cuv`CdSvMe46dVRazBI@8( zl21rc>vWY}BY2nW)|-Q?m~+~nE!y0;S4VVFfgl?MNVeBOspkfEc9^BL4r#IdZ|P6^ zqcet8g7^c8Ay02z{#qs_VH7pX3=6|tbj;0Gs>J|ht1P7mym2k4!Fw~@UWbbf1opXg zRGm~SP~Q5d$?9}_BwDmM<_H6l1u_m)e%DKFtkw?Jr*@C*y!P0xnI}F~ z;M^x3(2L8S8m^5FsT+IKp?2<=CjBXjbg@bJ$iauARhNIsZdJlRaJH)sG)f4eV@^qZ zE#-*jzYzBFjaubD=r@m)Y1h5gu+b_@A?q_w&!jP1t`+4QbcxyXN{3qKUcS{;x-t}~ zx;HkGz8*MeW;ObD@s!X@h&GLqA#ZqqCq3_7)QDU%;SFi>FE{<5d-M9dB;xl@`wW0= zzNhB{lG{XLN6P|1NQ0Dh5)^a#Rx-Y-Dh=Xt^(NRkt&&dtVtM}oRbVwG^Qq8-eJ^Td z=dKD|HE!PZcdqpAmmH%9t6ZU{k_|4ST##m)an@7cEX=B=Q+n1rSh;cJT%8j`MP4|30U7gka&4W(`E%p9Nub+TC-Z1%3?5%czO%44DL|~@S{`#l{CR zajagvrv6PkP;8@r^P4OtJ`-8NAgQLHL1(l0R>}s>Vfs zQ(XPmwelAw22F8%?{@cWuh~x`epYL z*KY=ZOC=``>{=c;x3g}LHD8Y_rcBc7SF@rg3HaQUI^*}@^mO3sz$j?^pB1-JM-jU_ zEIRKG0`9<5gw;BD^8-b!DRYhWM0R(ysnRpC#hF>gHd*79)nt%g;*_Nc1WCjSMYXr2 zKx|8uV@XzoQfx*+oxiU{wl!@9a}_wM(C}8W46~z(jnXAGy~i#>P7Mvx2b>k2NQ_`2 zW1gcUOx5n1ug`j^RR{lQ;ohpk>O4~TnX}t!CQ$=0Q8e|D~yK)erUf8 zk1u5IH6eSew#G~N7mZ7yXEvYOf|ey3i1C6C@U1q3xToiBNfjNAHZ_*tO5`C~VrRR$ z6a=q|G8cXvSlp7d_&53Wr9`XT#k9;Cg4?B5UE(nyhNDBaGClzGJ;f+Vs1tFgTDqKjcXz8uH=FK`O-VN!q&MB& zz3Favmj2H<_kEt{%lq|RANYXmF9)M3?8R2m63hsoG*J81Xe>1c$>7W@s_e(TMvovs?S-Bc0}T{DU|kAW@-D z)h*Rh|7QbX5#{Am8^OIA{wHH65+tu@eo=j4p;Vj@blAFdT>Y&glDk(_LkJrF^ejiP z`$@fEa{uhD*OJD)!#=aMa6T$(S{<0cS;GB#IdLT|6;_bfOkO<4`zii)BBP7XBsvry zb^ov*Q)4#Qs_1|jNICw{?+d;t#Uf%GoiX3p;kKm9eHZ?LxF{v`U4UM-2aC*dJ%gE0 zm`g=}kqD(mJTZEh1|4De9kSr$fX_hE1i*G{klB6D<9L-rj)|gq<0_YYCsUF%0mLUY znTM`2d$Rm@`GaC&eEI(K|@z*?vPx z6x%-Y5qAk?qEI7I)G9yR zJ9~;Yce@&=JFE5M%rExR+=Ql_o%I=q)?b;a=IXeTNrYYp+cn>ox3A)pl&3+C$5%Nf z@pAC3_YA~d-ZV!`zTY_vqIGhMd=f2<)w?=NWCGF_lDOw^v0I}&t&gXn#C5f~Nitfz zZIze?AIv1rauHw-hW&k2#Xs^;UA@`eL30pJRU)EamdKjprRi02{C4o5whdk=W{**4 zwiNgzwESd=yG*g_IXgtFI_si#p9YX*sbrwOdr#Q6jzI~2zc)02TST7CHNABegR;Ik z!LsG+o0Z-osZZklGj}f)-*M+!9eL=)|MH7_kH3{A1y}CuE&FFIoDPIm?E|}uMEnORwrmKhT8-n@0A}h$Ue{7{RiX}-mroMQxD>@$nGm2ac(n8! zOuNmk3QoS=0j$r{iMmdZ1l?c#MHw3!3e2H>t=D4Wy*UfBOkO*Mu2k9a--~V!F03?_ zxqpzZ3=^r}4rX>|SR1jYF*fzY{IbwO2s7|aQW>&&c4sp*vWyHjrJxaym`oKvKP`kL zL!a!WQj8qOV3lZD_#^;{DWh|!9tO9wy%!X;H#J2gjz~d}#HKyQ@>)DD4il@&Np!f4 zoS*Labd+YkN^>qwS5{e${Rn^j;}z)RQv@R7yWjW-fvtt58&mBi-j6Wz`=7;AL5zY83ar5Q~^aNf_ z21zkZ&*d_ud*LdU)b|aRH|7hJxK>npyLp5Bm_zGSyryfLzxHZNb-k7{-x|bJX+ErB z?}+xU6CY&ws9XhFIY1u<>yZyhMUBN1r$r7Q^zO1!1<@;RkQ6&xKFskrH4Td40+zJT zDx>i3txcdqY45>OQ%Q4As20cW#LPgxVrAZWBe+)+HlZ8;oNTvW`qlB{8g-*V5gPus zfj$B@LX-Hg^D_j5uL<9}Ij|Fh$P^2uOAT=xSXdlG^-*)9F{H?t6U~Ros0H}Y73%+e za}bEqV9h4dH{%N`q+tsj76*@Yfx$V$ksaQ#(~E*xmv>ogF^YvZPxHN2cGbH=qw;

sr>+Ld~BrBxL6XKZ7b3PJ1 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 R;H`+h1GjatDZAto`)@l%DRuw= literal 0 HcmV?d00001 diff --git a/docs/design/assets/notebook-submit-review.png b/docs/design/assets/notebook-submit-review.png new file mode 100644 index 0000000000000000000000000000000000000000..199813c6e23f078307dca628893cbb0be44084af GIT binary patch literal 162250 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

2*M(h?Y94dOUed9lS?33>hwf%{5+k#`oM20 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 literal 0 HcmV?d00001 diff --git a/docs/design/notebook-plugin.md b/docs/design/notebook-plugin.md index 1548218f..eac116a2 100644 --- a/docs/design/notebook-plugin.md +++ b/docs/design/notebook-plugin.md @@ -1,461 +1,417 @@ -# TauGrid Notebook Plugin - Design - -Status: **proposal, awaiting review.** No implementation code is written yet. - -Scope: a notebook surface for TauGrid that lets a researcher (a) submit the notebook they are working in as a Tau job and (b) watch one integrated dashboard for that run: Ray dashboard, GPU usage, and the training loss curve. - -Primary target editor: **Jupyter Notebook**. -Secondary compatibility targets (best-effort, not promised supported surfaces): JupyterLab, VS Code notebooks, Google Colab. - -This is a **notebook plugin**: an **ipywidgets component** rendered inside notebook outputs. It is not a Codex/DeepSeek/Claude plugin, and it does not add a second web UI. - -## Decisions already made (do not re-litigate) - -| # | Decision | Consequence | -|---|---|---| -| D1 | **No CLI dependency.** No `tau` binary, no `kubectl` at runtime. | Submit is pure Python against Kubernetes APIs. | -| D2 | **The end user imports nothing.** The deliverable is a button/component. | The one `import` lives in a platform-authored template cell, not in the user's code. | -| D3 | **The job is the current notebook.** | Submit packages the `.ipynb` and runs it on the cluster. No `@tau.train` decorator in the user's notebook. | -| D4 | **ipywidgets, not a JupyterLab prebuilt extension.** | Portable across notebook surfaces with caveats ([ipywidgets Installation](https://ipywidgets.readthedocs.io/en/stable/user_install.html), [VS Code Jupyter notebooks](https://code.visualstudio.com/docs/datascience/jupyter-notebooks), [Colab widgets notebook](https://colab.research.google.com/notebooks/widgets.ipynb)). | -| D5 | **Kubernetes Python SDK** is the cluster client. | Submit/read flows use `CoreV1Api` and `CustomObjectsApi` ([Kubernetes Python Client](https://github.com/kubernetes-client/python), [CustomObjectsApi docs](https://github.com/kubernetes-client/python/blob/master/kubernetes/docs/CustomObjectsApi.md)). | - ---- - -## 1. Context loop trace - -What was mined before writing this, and what it settled. - -> Reviewer note: this section was audited to remove chat/session metadata. -> Any repository claim without grep-backed `file:line` confirmation is explicitly marked **ASSUMPTION (UNVERIFIED)**. - -| # | Source | Signal | Verification status | -|---|---|---|---| -| 1 | `AGENTS.md`, repo tree | Repo appears multi-module (`cli/`, `core/`, `controllers/`, `portal/`, `sdk/python/`). | **ASSUMPTION (UNVERIFIED)** - add exact `file:line` citations in follow-up pass. | -| 2 | `cli/go.mod` | Prior note claims Kubernetes Go clients are direct deps; Azure SDK usage is scoped to infra/telemetry helpers. | **ASSUMPTION (UNVERIFIED)**. | -| 3 | `core/kube/kubectl.go` | Prior note claims normal manifest/query path shells out to `kubectl`, with narrow direct REST usage. | **ASSUMPTION (UNVERIFIED)**. | -| 4 | `cli/internal/runhistory/kubernetes.go`, `cli/internal/cli/run_submit.go` | Prior note claims typed `kubernetes.Interface` + `dynamic.Interface` are used in submit/history paths. | **ASSUMPTION (UNVERIFIED)**. | -| 5 | `controllers/tau-core/api/v1alpha1/types.go` | Prior note claims Tau CRDs include `TauCluster`, `TauWorkspace`, `TauQuotaRequest`; profile/queue defaults come from `TauCluster.spec`. | **ASSUMPTION (UNVERIFIED)**. | -| 6 | `cli/internal/rayjobrender/render.go` | Prior note claims renderer handles Kueue labels/suspend, topology, GPU claims, TTL, entrypoint staging. | **ASSUMPTION (UNVERIFIED)**. | -| 7 | `core/status/gpu.go` | Prior note claims GPU metric fields include explicit observed booleans to distinguish zero vs missing. | **ASSUMPTION (UNVERIFIED)**. | -| 8 | `portal/internal/expapi/server.go` | Prior note claims `/api/stellar/series` shape used for loss charting. | **ASSUMPTION (UNVERIFIED)**. | -| 9 | `portal/internal/portalapi/rayproxy.go`, `server.go` | Prior note claims Ray dashboard proxy route and `X-Frame-Options: SAMEORIGIN` behavior. | **ASSUMPTION (UNVERIFIED)**. | -| 10 | `sdk/python/python/tau/workloads.py`, `sdk/python/python/tau/_cluster.py` | Prior note claims current Python submit handle shells through CLI and ships cluster-side wrapper code. | **ASSUMPTION (UNVERIFIED)**. | -| 11 | KubeRay upstream docs | KubeRay includes an optional APIServer; V1/V2 lifecycle and compatibility are documented upstream. | **Externally cited** ([KubeRay APIServer README](https://github.com/ray-project/kuberay/blob/master/apiserver/README.md), [KubeRay repo `apiserver/`](https://github.com/ray-project/kuberay/tree/master/apiserver)). | - -### Corrections applied in this revision - -- Removed non-repository/session-specific claims (for example, “which skills are installed in this chat session”). -- Removed author-internal draft-history language. -- Marked all unverified repo-path assertions as **ASSUMPTION (UNVERIFIED)** pending grep-backed `file:line` citations. -- Added external citations for Kubernetes SDK, KubeRay APIServer docs, ipywidgets portability, notebook execution tooling, and browser framing behavior. - ---- - -## 2. The question this work answers - -> Can a researcher who is already working in a notebook get that notebook onto a GPU cluster, and then answer “is my loss going down, are my GPUs working, what is Ray doing” by clicking, without writing YAML, without opening a terminal, and without importing anything? - -Today that answer typically spans multiple contexts (terminal, portal, notebook output). The plugin collapses that into one panel. - ---- - -## 3. Personas - -| Persona | Goal in this surface | What they will not do | -|---|---|---| -| **Researcher (primary)** - owns a training notebook | Click Submit, then watch loss + GPU until done or broken | Read YAML, open a terminal, learn Kueue, write imports | -| **ML platform engineer (secondary)** - supports researchers | Provide notebook template + RBAC; reproduce a run from a shared notebook | Rebuild a dashboard per incident | -| **Reviewer / collaborator (tertiary)** - reads a shared notebook | See evidence that the run trained and converged | Run anything | - -**Who authors the import?** The platform engineer, once, in the notebook template. The researcher never writes it. This is how D2 and D4 coexist: ipywidgets needs code somewhere, but not user-authored code. - ---- - -## 4. Backbone (user activities) - -Frame: activity flow. Perspective: primary user. Horizon: single run session. -Granularity: 5 activities. Scope: happy path + failure recovery. Aggregation: single role. - -1. **Open a ready notebook** - start from the platform template, which already includes the TauGrid panel cell. -2. **Submit the notebook** - click Submit; plugin packages notebook and applies workload. -3. **Watch it converge** - loss curve, GPU utilization, step progress. -4. **Inspect cluster state** - Ray dashboard link, pods, queue/admission context. -5. **Recover or hand off** - read failure signal, capture next command, export/share evidence. - -Cross-cutting backlog (not backbone): renderer conformance suite, packaging robustness, offline test strategy, docs. - ---- - -## 5. Architecture - -### 5.1 Cluster integration target and client choice - -D1 and D5 drive one runtime shape: direct Kubernetes API access from Python. - -- Use `kubernetes` Python client for cluster I/O ([Kubernetes Python Client](https://github.com/kubernetes-client/python)). -- Use `CoreV1Api` for pods/logs/nodes. -- Use `CustomObjectsApi` for Tau/Kueue/Ray CRDs ([CustomObjectsApi docs](https://github.com/kubernetes-client/python/blob/master/kubernetes/docs/CustomObjectsApi.md)). - -Repository-specific details of current CLI internals are still **ASSUMPTION (UNVERIFIED)** in this draft (see §1). The design remains valid because the widget path is explicitly independent of CLI runtime calls. - -### 5.1.1 KubeRay APIServer note (correction) - -KubeRay does ship an optional APIServer component ([KubeRay APIServer README](https://github.com/ray-project/kuberay/blob/master/apiserver/README.md)). - -| Topic | External evidence | Design implication | -|---|---|---| -| APIServer exists | Upstream `apiserver/` docs are present. | Plugin must not assume APIServer absence. | -| V1/V2 lifecycle | Upstream docs discuss V1/V2; exact deprecation wording should be rechecked before implementation freeze. | Do not build a V1-specific client path in Slice 1. | -| Client shape | Upstream docs describe Kubernetes-oriented API compatibility/proxy behavior for V2 (exact wording to confirm in implementation PR). | Keep API base URL configurable; default direct Kubernetes API server path. | - -TauGrid-repo-specific deployment claims (“TauGrid does/doesn’t deploy KubeRay APIServer”) remain **ASSUMPTION (UNVERIFIED)** until repo grep provides exact `file:line` evidence. - -### 5.2 Submit without CLI, without decorator - -D1 + D3 means the plugin must transform a **notebook** into a runnable workload. - -``` -analysis.ipynb - │ 1) resolve notebook path (Jupyter Sessions API where available) - │ 2) fetch notebook bytes (Jupyter Contents API where available) - ▼ -package ──► staged payload (notebook + thin runner) - │ - │ 3) resolve profile + queue defaults - │ 4) render ray.io/v1 RayJob (Python renderer port) - ▼ -apply via CustomObjectsApi ──► admission ──► notebook executes on cluster -``` - -Notebook/session path resolution references: -- [Jupyter Server REST API: Sessions](https://jupyter-server.readthedocs.io/en/latest/developers/rest-api.html#api-sessions) -- [Jupyter Server REST API: Contents](https://jupyter-server.readthedocs.io/en/latest/developers/rest-api.html#api-contents) - -Runner choices: -- `nbconvert --execute` path ([nbconvert Execute API](https://nbconvert.readthedocs.io/en/latest/execute_api.html)) -- optional `papermill` path if image has it ([Papermill Documentation](https://papermill.readthedocs.io/en/latest/)) - -This introduces a runtime-image requirement (see §9). - -**Renderer parity requirements (ASSUMPTION from prior repo notes; verify against `cli/internal/rayjobrender/render.go` with file:line):** - -| Renderer concern | Why it cannot be skipped | +# TauGrid notebook plugin: architecture and whole-PR audit + +## Whole-PR audit — 2026-09-23 + +Baseline: local `origin/main...eb9221b`, including every changed path. No remote +PR operations, Jupyter startup, browser automation, or cluster writes. Existing +screenshot deletions and their doc note are preserved. Evidence below uses +**pre-reimplementation** lines; Python/frontend paths are relative to +`sdk/python/python/`. + +### Findings and reimplementation decisions + +1. **Review is not bound to the resolved plan.** `tau/jupyter/server.py:234` + rebuilds against current profiles/environment; `labextension/src/submission.ts:62` + pins only name/namespace. Bind native writes to a rendered-plan digest and + reject changes before creation. Validate request and response shapes. +2. **Reviews leak notebook contents into temporary directories.** + `tau/jupyter/submit.py:164` uses `mkdtemp` without cleanup although only embedded + bytes are needed. Package in memory by default, retaining explicit staging. + `tau/widgets/panel.py:237` duplicates package/resolve/render/create logic. + Share that pipeline, keeping legacy HTTPMode and native K8sJobMode/600s. +3. **Cluster discovery is arbitrary and unbounded.** `submit.py:98,108` lists + without limits/timeouts and selects `items[0]`. Reject ambiguity, bound reads. + `_profile.py:72` drops scheduling/memory and coerces zero workers to one. + Preserve supported fields and reject invalid shapes. Kubernetes create + conflicts, not read-then-create at `submit.py:224`, govern collisions. +4. **Native reads lack byte bounds.** `runs.py:85,114,152,179,212,270` preload + object/list responses; count limits are not byte limits. `server.py:185` runs + namespace discovery on the event loop. Centralize bounded transport, offload + Kubernetes calls, and report continuation even on short namespace pages. +5. **Logs race ownership discovery.** `runs.py:354-362` checks membership once, + then reads a named pod without rechecking its UID. Metrics check before + (`metrics.py:106`), not after. Revalidate workload/controller chain/pod/container + before and after bounded reads. This detects observed changes, not atomicity. +6. **Portal fallback bypasses failed/ambiguous discovery.** `metrics.py:202` + retries a prior portal source without its original eligibility conditions. + Apply the same conditions on refresh. Cache keys (`:188`) lack cluster identity; + partition by API host. Preserve TTL, single-flight, four-slot capacity, + terminal attempt, finite samples and strict source non-merging. +7. **Duplicated status mappings misclassify evidence.** `runs.py:134` searches + reason substrings (`Stopping` matches `stop`); `widgets/status.py:106` treats + unrecognized status as running (missing status is a queued compatibility case). Share explicit mappings, preserve old + RunStatus fields, and report unrecognized evidence as unknown. +8. **Frontend contracts/accessibility gaps.** `submission.ts:36,70` and + `widget.tsx:32` cast unchecked JSON. `widget.tsx:86` presents loading as empty. + A namespace label does not prove admission readiness. `view.tsx:81` expects + `warning`, but diagnostics use `warn`. Consolidate predicates, validate + payloads, distinguish loading/error/empty and correct warning tone. +9. **Dead CSS and mismatched states.** `style/index.css:96,128,239-290,528, + 589-608,713` retain unused readonly/guide/family/phase-detail/badge rules. + Actual states include success/done/skipped/unknown/warning. Align selectors + without redesigning verified table/tab/chart placement or Portal colors. +10. **Unwired Go TensorBoard feature.** `cli/internal/tensorboard` has no + production caller. `portal/internal/portalapi/server.go:359` exposes its proxy; + `tensorboardproxy.go:31` checks only nonempty strings; `:121` reads unlimited + HTML. Delete this feature/tests/route, leaving established Portal/Ray proxies. +11. **Legacy widgets are compatibility APIs, not the native plugin.** Keep + panel/embed/magic/session/render/watcher and tests. They use kernel identity, + imports/magic and no server release gate. `embed.py:105` incorrectly calls a + different-port loopback proxy same-origin. Correct and document trusted local + use. Escape unresolved panel text (`panel.py:414`). Remove unused + `_backend.py:67` CLI wrapper; actual SDK CLI execution remains unchanged. + `_conformance.py` is a scaffold, not demonstrated CLI parity. +12. **Tests/docs overstate coverage.** `test_jupyter_submit.py:112` verifies + mounts, not execution; submitters forward remote driver output. Frontend + static/source tests do not prove browser effects. Add negative and race + regressions. Separate CPU demo/screenshots/parent browser verification from + offline evidence and correct misleading runtime/legacy documentation. + +### Additional findings confirmed during reimplementation + +13. **Launcher recognition could delete real user code.** At the audited HEAD, + `tau/_notebook_pkg.py:40` and `:98-111` treated broad line-pattern matches as + approved launchers. Replace this with AST-based recognition of actual Tau + imports/aliases and literal launcher calls, preserving mixed and unrelated + code. Explicit launcher metadata and supported magics remain supported. +14. **Packaging could silently omit the native frontend.** At the audited HEAD, + `setup.py:35-37` conditionally included whatever assets happened to exist. + Fail packaging when the prebuilt manifest or its referenced entrypoint is + missing; rebuild from clean output and inspect both wheel install locations. + +### Whole-PR coverage and baseline + +- All native server modules; shared backend/payload/notebook/context/profile/ + renderer/conformance code; every legacy widget module and its offline tests. +- All eleven frontend source files; CSS/style entry; package/lockfile/tsconfig; + build helper, generated asset metadata and full npm suite. +- Setup/pyproject, extras/entry points/wheel layout, runtime Dockerfile, wheel + ignore rules, root ignores and license exclusions. +- All five TensorBoard Go files plus Portal route (the only Go additions here). +- Both root notebooks, all five SDK notebooks, CPU guide/runner, SDK inspection/ + live/cluster tools and all seven root browser helpers: read only, none run. +- Complete design history/site guide; five current PNGs match their site copies. + Historical captures and deleted superseded screenshots remain unchanged. +- Baseline: twelve pytest files **171 passed in 13.80s** from SDK directory; + `npm test` **31 passed, 0 failed**. Initial pytest from root failed collection + (`tests.test_widgets_submit` import); required SDK cwd resolves it. + +### Reimplementation validation + +Implementation and offline validation are recorded below. Installed JupyterLab/Notebook 7, +completed 40-point CPU run, actual admission/execution and browser confirmation +remain parent-owned live verification. + +## Current architecture + +This is the current implementation contract. It replaces overlapping historical +proposals; earlier live validation does not certify this refactor. + +### Native plugin and legacy compatibility + +The wheel contains a JupyterLab 4 prebuilt extension and Jupyter Server extension +configuration. Notebook 7 is a compatibility target; classic Notebook 6 is out of +scope. Native frontend calls only authenticated, base-URL-aware Jupyter endpoints. +Kubernetes and optional metrics-portal calls use the Jupyter Server identity. +There is no runtime tau/kubectl subprocess and no CLI binary requirement. +A researcher submits the open Python notebook without Tau imports or YAML. + +The tau.widgets panel, magic, embed and watcher remain supported **legacy SDK +APIs**, using kernel identity. They do not inherit the native server release gate. +The opt-in embed proxy is a separate loopback origin, removes upstream frame +restrictions and is suitable only for a trusted local kernel and portal. Remote +kernels require forwarding. It is not same-origin with Jupyter or a security +boundary. The native plugin never uses it. Existing CLI-executed SDK APIs remain +separate and unchanged. + +### One submission pipeline, two explicit policies + +The shared tau/_notebook_submit.py owns package → resolve → render → create. +Native policy is **K8sJobMode/600 seconds**; legacy stays **HTTPMode/15 seconds**. + +1. Review captures notebook bytes and inputs. The server validates field types, + Python notebook structure and the 10 MiB raw-input cap; the payload encoder + applies its smaller encoded transport budget. +2. Native packaging is memory-only. Explicit staging remains available to legacy + callers. Outputs/execution counts are stripped. Only explicit launcher metadata + or statically recognized Tau-only launcher statements are removed; mixed code + and unrelated calls remain intact. +3. Resolve the sole TauCluster with a bounded two-item discovery request; + ambiguity or continuation is a refusal. Preserve profile selectors/memory, + validate resource counts and resolve the selected profile/queue. +4. Render a suspended, Tau-managed, Kueue-labelled RayJob with a control-only head, + worker sizing, payload digest, runtime env and volume contract. Preserve the + verified notebook image and payload/mount wiring on head and submitter. + K8sJobMode submits to Ray and forwards remote driver output: this does **not** + mean the submitter itself executes the notebook driver. +5. Preview returns planDigest, SHA-256 of the complete canonical manifest. + Confirmation sends captured bytes, resolved name/namespace and this digest. + Rebuilding a different image/profile/queue/env/payload plan produces HTTP 409 + before any write. The digest checks consistency; it is not an authorization + credential or a Kubernetes transaction. +6. Native submit additionally requires TAUGRID_SUBMISSION_ENABLED=1 and + confirm=true. Create is the authoritative conflict check, with no pre-read. + Lost/failed responses are uncertain and never auto-retried. Inspect the planned + identity before reviewing again. Namespace discovery, preview and create use + worker threads rather than blocking Tornado's event loop. + +Admission and other resources may change after review. The digest cannot freeze +external cluster state. The unused CLI conformance scaffold was removed because +it did not compare equivalent inputs. Tests establish the supported manifest +contract, **not** full Go/Python runtime parity. + +### Lifecycle, logs and loss evidence + +- Native discovery caps lists at 500 objects per kind; failures/continuation remain + visible as partial evidence. Namespace labels are hints, not proof of a + LocalQueue or admission readiness. +- Admission, cluster creation, readiness, execution and results are separate + phases. Readiness is not training health. Explicit terminal failures dominate; + older job/deployment fields remain supported. New resources without status stay + queued for compatibility; unrecognized status is unknown, not invented running + progress. MultiKueue manager views do not fabricate remote-worker evidence. +- Shared non-preloaded Kubernetes transport caps documents at 4 MiB with a + seven-second per-document deadline and bounded connect/read timeouts. Native + clients disable retries. These limits do not promise one aggregate deadline + across a complete lifecycle query. +- Both logs and stdout metrics revalidate workload UID, controller ownership, + pod UID and container **before and after** a bounded log read. Discard the read + if a checked identity changes. The name-based log API is not atomic: this only + detects observed races, not every possible replacement/recreation interleaving. +- Logs select one pod/container, current or previous, 1–1000 tail lines, 65,536 + bytes plus sentinel. The 10-second read/verification budget excludes preceding + lifecycle discovery. No stream stays open; a tail is always partial. +- Loss accepts only explicit finite step=N loss=V observations, nonnegative safe + integer steps, records at most 4 KiB and at most 512 points in a 64 KiB tail. + Duplicate steps use the last observed value. No smoothing, invented step, + cross-source merging or multi-rank aggregation. A single point stays a point. +- Prefer the owned K8sJobMode submitter stream for RayJob; a batch Job needs one + unambiguous owned source. HTTPMode does not imply a readable remote driver log. + Failed/truncated/ambiguous discovery cannot enable portal fallback. +- Metrics cache partitions by API host, namespace/kind/name/UID and source. + It retains 10-second refresh, four concurrent reads, 128 entries, 600-second + idle eviction, single-flight and one terminal attempt per identity. Collection + errors keep previous timestamps and mark cached observations stale. +- Optional portal series require server enablement, URL and exact + namespace/kind/name/UID mapping to target/run_id. No browser-supplied inference, + redirects or credential forwarding. Refresh applies initial eligibility rules. + Operator-trusted mapping does not prove stdout equivalence or full coverage. + +### Native surfaces and contracts + +| Surface | Preserved contract | |---|---| -| `spec.suspend: true` and Kueue-compatible ownership | Prevents bypassing fair-share admission. | -| Queue labeling | Required for admission/routing. | -| Profile-derived sizing (workers, GPUs, selectors, priority class) | Keeps submitted shape consistent with platform contract. | -| Runtime environment propagation | Prevents missing dependencies on workers. | -| Staged entrypoint + payload wiring | Needed to execute notebook artifact in-cluster. | -| Head resource zeroing where applicable | Avoids wasting quota on control-only head. | -| GPU claim wiring (including modern claim styles) | Determines whether GPUs attach. | -| TTL/shutdown behavior | Prevents completed jobs from lingering. | - -**De-risking plan** - -1. **Backend seam** (`CliBackend` existing, `KubernetesBackend` new): runtime calls avoid CLI. -2. **Conformance suite**: render same logical workload in Go and Python, compare normalized RayJob objects in CI. -3. **Scope guardrails**: Slice 1 supports one notebook -> one run shape; unsupported shapes fail fast with explicit messages. - -### 5.3 Component architecture - -``` -┌────────────────── notebook frontend (Notebook primary; others best-effort) ──────────────────┐ -│ │ -│ ┌────────────────────────────── TauGrid panel (ipywidgets) ───────────────────────────────┐ │ -│ │ [Submit notebook] notebook: analysis.ipynb profile: ▾ queue: ▾ │ │ -│ │ ----------------------------------------------------------------------------------------- │ │ -│ │ loss summary + chart | GPU summary + bars | Ray dashboard link │ │ -│ └────────────────────────────────────────────────────────────────────────────────────────────┘ │ -│ │ widget state (comm) │ -└──────────────────────────────────────┼──────────────────────────────────────────────────────────┘ - ▼ -┌──────────────────────────────────── kernel (Python) ───────────────────────────────────────────┐ -│ tau.widgets ── resolve notebook path / manual override │ -│ ── package .ipynb + runner │ -│ ── KubernetesBackend: resolve profile, render, apply │ -│ ── poll status + metrics; push updates to widget │ -└──────────────────────────────────────┬──────────────────────────────────────────────────────────┘ - │ kubernetes-python SDK - ▼ - ┌──────────────────────────────────────────┐ - │ Kubernetes API server + CRDs │ - │ tau.azure.com, kueue.x-k8s.io, ray.io/v1│ - └──────────────────┬───────────────────────┘ - │ - ▼ - ┌────────────────────────┐ ┌─────────────────────────┐ - │ taugrid-portal (HTTP) │ │ run metrics conventions │ - │ /api/stellar/series │ │ stdout / metrics file │ - │ /api/portal/ray/proxy │ │ │ - └────────────────────────┘ └─────────────────────────┘ -``` - -Runtime dependencies: `kubernetes`, `ipywidgets`, and SDK dependencies already in wheel (for example `PyYAML` if retained). - -### 5.4 Module layout - +| Sidebar | TauGrid: Open runs → left #jp-left-stack; data-testid=taugrid-runs; auto-loading .taugrid-runs-table; filtered input/datalist namespace picker, first Tau-labelled namespace preferred | +| Detail | data-testid=taugrid-detail; identity-scoped tab, lifecycle, admission, pods, diagnostics and loss | +| Loss | taugrid-loss-curve and taugrid-loss-samples; real points/sample table, source, freshness and partial-window notices | +| Logs | Separate data-testid=taugrid-logs tab; selection-specific bounded snapshots | +| Review | Notebook toolbar or TauGrid: Submit current notebook; data-testid=taugrid-review; Review submission → explicit named confirmation → Submit notebook | + +Namespace discovery distinguishes loading/unavailable/empty; queue changes clear +old rows. Runtime JSON validation rejects malformed capabilities, previews and +submission identities. Old RunStatus fields remain accepted; malformed optional +metrics do not destroy valid lifecycle evidence. Both warn and warning render +with warning tone. Removed obsolete CSS; actual success/done/warning states match. +The Portal's fixed light palette is intentional; Jupyter owns surrounding chrome. + +Watch is response-relative and single-flight; it starts for active runs, respects +manual pause and stops on terminal state, missing run, status error, disposal or +a one-hour watch deadline. Metrics-only failure does not stop lifecycle polling. + +### Deliberately removed or left alone + +Removed the uncalled CLI TensorBoard renderer and Portal TensorBoard proxy/route +with their isolated tests. Existing production Portal/Ray proxies remain. +Removed unused CliBackend and the misleading conformance scaffold; the actual +SDK CLI executor remains. Current screenshots/site copies are unchanged historic +evidence. The user's two pre-existing screenshot deletions are preserved. + +## Historical live evidence — not rerun + +The September 22, 2026 record reports CPU profile azure.research.cpu.small, +queue jobqueue, K8sJobMode and completed cpu-loss-demo-2. The parent-owned browser +run reported all five journeys working, including **40 real loss points and one +polyline**, sample disclosure, logs and actual submission. The earlier claim +that the submitter itself executed the notebook driver was too strong; preserve +its verified mounts without repeating that causal inference. + +Examples notebook-ray-cpu-demo.ipynb and notebook-loss-curve-demo.ipynb are +unchanged; the latter generates 40 deterministic CPU loss observations. +tools/run-cpu-ray-demo.py now forwards the preview digest and retains byte bounds, +UID/source checks, CPU-only verification, no retry of submission and no automatic +cancellation. tools/run-labextension-e2e.mjs is unchanged and was not run. + +## Validation and remaining verification + +The exact offline commands/results are recorded below. They do not prove browser layout, Notebook +7 activation, KubeRay admission/execution, RBAC or image availability. Parent-owned +live verification must repeat all five journeys, check 40 points/one polyline, +logs before/after completion and actual driver/submitter placement. Rebuild the +notebook runtime wheel/image before verifying changed executor behavior. +No Jupyter, Playwright, cluster writes, push or PR operations ran in this audit. + +Deferred: durable history/downloads, streaming logs, cancel/resume, remote-worker +hydration, inferred/authenticated portal mappings, multi-rank aggregation and +full Go/Python runtime conformance. + + +## Offline validation ledger — 2026-09-23 + +All commands below were local; no Jupyter server, Playwright, cluster test/write, +push, commit, or PR operation was run. Python commands use the existing SDK venv. +Go builds explicitly used `GOTOOLCHAIN=go1.26.7` and `GOFLAGS=-mod=readonly` +(the default installed Go is 1.27.0). The pinned toolchain was downloaded. + +### Required notebook and frontend gates + +From `sdk/python/python/labextension`, with the venv Scripts directory on PATH: + +```powershell +npm run build:lib +npm run build:labextension +npm test ``` -sdk/python/python/tau/ -├── _backend.py # CliBackend (existing) + KubernetesBackend (new) -├── _render.py # manifest -> ray.io/v1 RayJob / batch/v1 Job -├── _profile.py # profile + queue resolution from cluster state -├── _notebook_pkg.py # .ipynb -> staged payload (+ runner) -└── widgets/ - ├── __init__.py # public: panel(), TauGridPanel - ├── panel.py # ipywidgets layout, buttons, event wiring - ├── kube.py # kubeconfig/in-cluster config -> API clients - ├── status.py # RunStatus/GPUDevice dataclasses; read_run_status() - ├── metrics.py # MetricSeries, read_metrics(), loss selection - ├── render.py # HTML/SVG fragments for panes - └── session.py # notebook path resolution (+ manual override) -``` - -`_render.py`, `_profile.py`, `_notebook_pkg.py` stay outside `widgets/` because they are SDK capability, not only UI code. -### 5.5 How “no import for the end user” works +Before rebuilding, removed only `lib`, `tsconfig.tsbuildinfo`, and the generated +`../tau/labextension` directory, after checking their absolute paths. Both build +commands exited **0**; webpack compiled successfully. Final `npm test`: **33 +passed, 0 failed, 0 skipped**, 2518.9729 ms, exit **0**. A PostCSS parse also +confirmed no empty CSS rules. Rebuilt hashed assets are included in the changes. -ipywidgets still needs executable Python, so platform ships a template notebook with a pre-authored cell: +From `sdk/python/python`: -```python -# Cell 0 - platform-authored template cell -import tau.widgets as tg -tg.panel() +```powershell +.\.venv\Scripts\python.exe -m pytest tests/test_jupyter_submit.py tests/test_jupyter_runs.py tests/test_jupyter_metrics.py tests/test_notebook_loss_demo.py tests/test_widgets_core.py tests/test_widgets_submit.py tests/test_widgets_button.py tests/test_widgets_load.py tests/test_widgets_watcher.py tests/test_widgets_embed.py tests/test_widgets_plugin.py tests/test_widgets_surface.py tests/test_jupyter_contract.py tests/test_notebook_packaging.py -q --tb=short +.\.venv\Scripts\python.exe -m ruff check tau tests setup.py ../../../tools/run-cpu-ray-demo.py +.\.venv\Scripts\python.exe -m build --wheel ``` -Delivery paths (in priority order): - -1. **Template notebook** (recommended). -2. **Copy/paste bootstrap cell** for existing notebooks. -3. **Optional toolbar injection later** (out-of-scope for Slice 1; reintroduces Node/frontend extension complexity). - -Portability references: -- [ipywidgets Installation](https://ipywidgets.readthedocs.io/en/stable/user_install.html) -- [VS Code Jupyter notebooks](https://code.visualstudio.com/docs/datascience/jupyter-notebooks) -- [Colab widgets notebook](https://colab.research.google.com/notebooks/widgets.ipynb) - -### 5.6 Data contracts - -> Reviewer note: these contracts are design targets; endpoint/field exactness must be verified against repo handlers before implementation. - -**a. Run status** (proposed `RunStatus` shape; consumed by widget) - +- Final combined notebook regression suite: **215 passed in 10.21s**, exit **0**. + The twelve requested suites separately passed **199 tests**; the two new + HTTP-contract/packaging suites separately passed **16 tests**. +- Ruff: **All checks passed**, exit **0**. +- Clean wheel build: **tau-0.1.3-py3-none-any.whl**, exit **0**. + ZIP assertions verified 54 entries, six byte-identical frontend assets in + the package and `share/jupyter/labextensions/taugrid-jupyterlab`, exactly one + current remoteEntry in each, matching manifest references, auto-enable config + under `etc/jupyter/jupyter_server_config.d`, new shared Python modules, and + absence of deleted `_conformance.py`/`CliBackend`. Inspection exited **0**. + +Additional builds/checks: + +- `go build ./...` independently in `core`, `cli`, and `portal`: each exit **0**. +- `go test ./internal/portalapi` in `portal`: **ok**, 0.767s, exit **0**. + The subsequent uncached full-suite run also passed this changed package + (**ok**, 1.355s). +- `sdk/python/python/.venv/Scripts/python.exe scripts/check-license-headers.py` + from repository root: **License header check passed for 863 source files**, + exit **0**. +- `git diff --check`: exit **0** (Git prints Windows LF/CRLF conversion warnings, + not whitespace errors). + +### Broader-suite failures, compared against untouched HEAD + +**Do not interpret the scoped green checks as a green whole-repository suite.** + +- SDK `python -m pytest -q --tb=line`: **54 failed, 267 passed, 1 skipped**, + 21.76s, exit **1**. A HEAD snapshot using the same interpreter produced + **54 failed, 223 passed, 1 skipped**, 22.71s, exit **1**. The complete set of + 54 `FAILED` identifiers is identical. Failures include Windows inability to + execute POSIX stub executables, CP1252 fixture scripts read as UTF-8, CRLF + golden differences, and binary-discovery assumptions. No unrelated SDK + behavior/tests were changed to hide these failures. +- Portal `go test -count=1 ./...`: **16 failing tests** across `internal/cli`, + `internal/expapi`, and `internal/expcockpit`, exit **1**. The HEAD snapshot + produced the exact same 16 failing test identifiers in those packages. + Errors include unavailable Python/stub commands, Windows paths/file URI + handling, and frontend source assertions. `internal/portalapi` passes on + both trees. An earlier cached `go test ./...` also exited **1**. + +Baseline verification used a temporary `git archive HEAD` snapshot, not a new +branch or worktree. Unchanged tracked fixture/source bytes were copied from +the checkout to match Windows checkout line endings. Failure identifier sets +were compared mechanically (zero differences). Logs are in the local temporary +`taugrid-notebook-baseline-d575daf77c8e450392466055e308a6e0` directory: +`pytest-complete.log`, `pytest-working.log`, `portal-head.log`, +`portal-working.log`. Initial incomplete snapshot attempts are not the evidence +used for these comparisons. + +### Change inventory and deliberately unchanged behavior + +The full working-tree path inventory follows. The two deleted design screenshots +were already deleted before this task; their deletion and the accompanying user +note were preserved, not newly authored. Three old generated JavaScript chunks +were replaced by three current content-hashed chunks. New shared modules/tests +are included, even though they remain untracked until the user stages changes. + +```text +cli/internal/tensorboard/options.go +cli/internal/tensorboard/render.go +cli/internal/tensorboard/render_test.go +docs/design/assets/notebook-embed-e2e.png +docs/design/assets/notebook-panel-e2e.png +docs/design/notebook-plugin.md +portal/internal/portalapi/server.go +portal/internal/portalapi/tensorboardproxy.go +portal/internal/portalapi/tensorboardproxy_test.go +sdk/python/python/labextension/src/explorer.tsx +sdk/python/python/labextension/src/model.ts +sdk/python/python/labextension/src/submission.ts +sdk/python/python/labextension/src/view.tsx +sdk/python/python/labextension/src/widget.tsx +sdk/python/python/labextension/style/index.css +sdk/python/python/labextension/tests/console.test.cjs +sdk/python/python/setup.py +sdk/python/python/tau/_backend.py +sdk/python/python/tau/_conformance.py +sdk/python/python/tau/_kube_io.py +sdk/python/python/tau/_notebook_pkg.py +sdk/python/python/tau/_notebook_submit.py +sdk/python/python/tau/_profile.py +sdk/python/python/tau/_render.py +sdk/python/python/tau/jupyter/metrics.py +sdk/python/python/tau/jupyter/runs.py +sdk/python/python/tau/jupyter/server.py +sdk/python/python/tau/jupyter/submit.py +sdk/python/python/tau/labextension/package.json +sdk/python/python/tau/labextension/static/443.61bff902d30cd2765dca.js +sdk/python/python/tau/labextension/static/443.d6e72d826e8943f371c1.js +sdk/python/python/tau/labextension/static/543.5d8256a98e0f346f04a5.js +sdk/python/python/tau/labextension/static/543.d9b4f347a16974e8b031.js +sdk/python/python/tau/labextension/static/remoteEntry.348e0d93f291c3406bed.js +sdk/python/python/tau/labextension/static/remoteEntry.a8cb0ad006a83367d44b.js +sdk/python/python/tau/widgets/embed.py +sdk/python/python/tau/widgets/ipython.py +sdk/python/python/tau/widgets/kube.py +sdk/python/python/tau/widgets/panel.py +sdk/python/python/tau/widgets/status.py +sdk/python/python/tests/test_jupyter_contract.py +sdk/python/python/tests/test_jupyter_metrics.py +sdk/python/python/tests/test_jupyter_runs.py +sdk/python/python/tests/test_jupyter_submit.py +sdk/python/python/tests/test_notebook_loss_demo.py +sdk/python/python/tests/test_notebook_packaging.py +sdk/python/python/tests/test_widgets_core.py +sdk/python/python/tests/test_widgets_submit.py +site/content/en/docs/examples/notebook-plugin.md +tools/run-cpu-ray-demo.py ``` -metadata.{name,namespace} -status.{found,workloadKind,state,displayState,startupComplete,startupFailed} -rayJob.{rayClusterName,jobId,jobDeploymentStatus,jobStatus,reason,message} -workloads[].{name,queue,admitted,phase,reason,message} -pods[].{name,phase,node,ready,restarts} -metrics.gpuRuntime.{state,reason,nodesExpected,nodesScraped,devices[].{pod,gpu, - utilizationPercent,utilizationObserved, - framebufferUsedMiB,framebufferUsedObserved}} -diagnostics[].{code,severity,message,suggestion} -actions[].{description,command.shell} -``` - -**b. Loss curve** (proposed portal fetch) - -`GET {portal}/api/stellar/series?target=&metric=train/loss&max_points=N` - -``` -chart.{has_data,metric_name,series[].{run_id,values[].{step,value}}} -``` - -**c. Live loss without user import** - -Two channels, in precedence order: - -- **stdout convention**: parse `loss=` or `step= loss=`. -- **metrics file convention**: JSONL at `TAU_METRICS_PATH` (default `/data/metrics.jsonl`), e.g. `{"step":3,"loss":1.25}`. - -UI must label the active source to avoid ambiguity. - -**d. Ray dashboard URL** - -`{portal}/api/portal/ray/proxy///` (exact route to verify in repo). - -### 5.7 Ray dashboard framing constraints - -If Ray proxy responses include `X-Frame-Options: SAMEORIGIN`, browsers block cross-origin iframe embedding ([MDN: X-Frame-Options](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Frame-Options)). - -Design policy: - -- **Default:** open Ray dashboard in a new tab. -- **Embed only when proven embeddable** (same-origin/local URL explicitly provided). -- **Never render a “known-broken” iframe**. - ---- - -## 6. UI experience - -### 6.1 The panel - -One widget, vertical stack. Loss is the hero; GPU is directly below; lifecycle/Ray are drill-downs. - -``` -┌──────────────────────────────────────────────────────────────────────────────┐ -│ TauGrid │ -│ [Submit notebook] notebook analysis.ipynb profile ▾ queue ▾ │ -├──────────────────────────────────────────────────────────────────────────────┤ -│ analysis-001 / ray [Running] RayJob │ -│ Running - 8/8 pods ready - queue research-gpu - updated 14:22:31 UTC │ -├──────────────────────────────────────────────────────────────────────────────┤ -│ ▾ Loss (train/loss) │ -│ loss down 88.4% 0.9230 -> 0.1040 latest 0.1040 best 0.0982 │ -│ [line chart] │ -│ source: metrics file - 1240 points │ -├──────────────────────────────────────────────────────────────────────────────┤ -│ ▾ GPU usage │ -│ avg util 87.3% gpus observed 8/8 nodes scraped 2/2 │ -│ [per-device bars with numeric percentages] │ -├──────────────────────────────────────────────────────────────────────────────┤ -│ ▾ Ray dashboard │ -│ Open dashboard ↗ │ -│ (optional local port-forward command shown as convenience text) │ -├──────────────────────────────────────────────────────────────────────────────┤ -│ ▸ Queue and pods │ -│ ▸ Diagnostics │ -└──────────────────────────────────────────────────────────────────────────────┘ -``` - -### 6.2 The “loss driven down” signature - -Primary summary line (words + numbers): - -`loss down 88.4% 0.9230 -> 0.1040` - -Rules: - -- `down` / `up` from first vs latest point. -- Warn color when loss increases. -- Fewer than two points: show “waiting for first steps”. - -### 6.3 States - -| State | Header | Loss pane | GPU pane | Default-open panes | -|---|---|---|---|---| -| No notebook resolved | muted badge, `notebook path not resolved` | hidden | hidden | submit controls + manual path override | -| Not submitted | muted badge, `not submitted` | hidden | hidden | submit controls | -| Queued | amber `Pending (not yet admitted)` | “no steps logged yet” | “no pods scheduled” | queue | -| Running | blue `Running` | live curve | live bars | loss, gpu, ray | -| Failed | red `Failed` | frozen last curve | last-known or unavailable | diagnostics | -| Complete | green `Complete` | final curve + delta | completed/no-live-samples message | loss, gpu, ray | - -### 6.4 Interaction model - -- **Submit** (primary): package notebook, resolve profile, render/apply workload. -- **Refresh** (secondary + auto-poll while active): visible/adjustable interval. -- **Stop watching**: stop polling without touching run. -- **Drill-downs**: collapsible panes, state remembered in widget state. -- **Export**: “Save HTML” for reports/PRs. - -### 6.5 Visual system - -- System UI font stack; monospace for ids/commands. -- Functional state colors only (running/ok/warn/error/idle). -- Dense operational layout (small but readable type). -- Accessibility: textual state labels, keyboard navigable panes, numeric labels on bars, SVG `aria-label`. - ---- - -## 7. Concrete API surface - -Template cell (platform-authored, not user-authored): - -```python -import tau.widgets as tg -tg.panel() -``` - -Programmatic usage for platform engineers/CI: - -```python -from tau.widgets import TauGridPanel - -panel = TauGridPanel( - notebook="analysis.ipynb", # optional; resolve from session if omitted - namespace="ray", - profile="training-8gpu", # optional; resolve from cluster defaults if omitted - queue="research-gpu", # optional; fallback to workspace/profile default - portal_url="https://portal.contoso.com", -) -``` - -`TauGridPanel.submit()` uses `KubernetesBackend` (no CLI dependency), renders workload object(s), applies via Kubernetes APIs, and watches status/metrics. - ---- - -## 8. Slicing - -**Slice 1 - walking skeleton (end-to-end demoable)** - -- Panel renders in notebook output. -- Submit packages current notebook and applies workload via Kubernetes client. -- Header + loss (metrics-file convention) + GPU + Ray link render. -- Correct states: not-submitted / queued / running / failed. -- Renderer conformance harness exists (Go vs Python normalized comparison). -- Offline tests run with injected transports. -- **Required gating task:** replace §1 assumptions with grep-backed `file:line` citations. - -**Slice 2 - live and durable** - -- Auto-poll repaint and interval controls. -- Stdout loss parser. -- Portal-series fallback for loss. -- Pod logs integration. -- Save HTML export. -- Pod list/framebuffer summaries. - -**Slice 3 - richer surfaces** - -- Optional toolbar injection path. -- Deeper portal deep-links. -- Broader submit shapes beyond Slice-1 constraints. - ---- - -## 9. Risks and open questions - -**Blocking (decide before Slice 1):** - -1. **Runtime image capability:** does the runtime image include `nbconvert` (or `papermill`)? - References: [nbconvert Execute API](https://nbconvert.readthedocs.io/en/latest/execute_api.html), [Papermill Documentation](https://papermill.readthedocs.io/en/latest/). -2. **Loss intent:** “loss driven down” means a per-step curve (single-run history), not a 2D loss landscape. Confirm expectation. -3. **Packaging:** ship inside `tau` wheel vs separate `tau-notebook` package. -4. **Repository verification debt:** assumptions in §1/§5 must be converted to exact `file:line` evidence before implementation merge. - -**Top risks introduced by the chosen decisions:** - -- **Renderer drift:** Python renderer diverges from Go behavior. - Mitigation: conformance tests in Slice 1. -- **Loss capture convention fragility:** unsupported print format yields empty curve. - Mitigation: explicit docs + visible source label + metrics-file first-class path. -- **Notebook path resolution edge cases:** missing session, renamed file, Colab differences. - Mitigation: manual path override + explicit unresolved state. -- **Cross-surface widget variance:** Notebook/JupyterLab/VS Code/Colab differ in widget/runtime behavior. - Mitigation: primary-support stance (Notebook), compatibility matrix in docs, smoke tests per surface. - -**Deferrable (defaults chosen):** - -- Dark mode (default light). -- Total GPU capacity display (used memory first). -- Multi-run overlay (later slice). - ---- - -## 10. What I need from you - -1. Confirm runtime-image execution path (`nbconvert` vs `papermill`) and base image update plan. -2. Confirm loss interpretation (curve vs landscape). -3. Confirm packaging (`tau` wheel vs separate package). -4. Confirm Ray behavior default (link-first; embed only when embeddable). -5. Assign owner to complete grep-backed `file:line` verification pass for §1 and §5 assumptions. - -Decisions already fixed and not for re-litigation: **no CLI dependency**, **no user-authored import**, **job is current notebook**, **ipywidgets (not native JupyterLab extension)**. - ---- - -## Companion artifacts -- `notebook-plugin-storymap.md` - backbone, tasks, sliced stories -- `notebook-plugin-backlog.md` / `.csv` - WSJF-ranked backlog -- `notebook-plugin-slice-1-acceptance-criteria.md` - Given/When/Then for Slice 1 \ No newline at end of file +Left alone: the production SDK CLI executor, existing Portal/Ray proxies, +notebook demo contents, current screenshots and site copies, browser E2E runner, +runtime image/Docker dependency choices, and unrelated failing Windows suites. +Legacy widgets remain supported rather than being silently removed. Existing +loss evidence bounds/cache/source rules and the table/sidebar/toolbar/tab +contracts are retained, with targeted correctness changes described above. + +### Parent-owned live verification still required + +Offline tests do not re-certify the earlier live results. Repeat all five +journeys: auto-loaded runs table in `#jp-left-stack`, input+datalist namespace +auto-selection, run detail with **40 real points and one polyline**, logs, and +review → confirmation → actual submission. Verify JupyterLab 4 and Notebook 7 +activation, authentication/RBAC, actual queue admission and execution, payload +mounts and remote driver versus submitter placement, final logs/metrics, and +changed-profile rejection followed by a fresh successful review. Rebuild the +runtime wheel/image before live execution. UID pre/post checks narrow observed +races but are not atomic Kubernetes snapshot guarantees. diff --git a/examples/notebook-loss-curve-demo.ipynb b/examples/notebook-loss-curve-demo.ipynb new file mode 100644 index 00000000..89170f62 --- /dev/null +++ b/examples/notebook-loss-curve-demo.ipynb @@ -0,0 +1,9 @@ +{ + "cells": [ + {"cell_type": "markdown", "metadata": {}, "source": ["# Deterministic CPU loss curve\n", "Pure Python gradient descent fits y = 2x + 1. Forty real observations span about forty seconds so the existing status poll can collect multiple windows. No downloads or GPU packages are needed. Submit using an explicitly reviewed CPU profile.\n"]}, + {"cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": ["import time\n", "\n", "inputs = (-2.0, -1.0, 0.0, 1.0, 2.0)\n", "targets = tuple(2.0 * value + 1.0 for value in inputs)\n", "weight, bias = 0.0, 0.0\n", "for step in range(40):\n", " errors = tuple(weight * value + bias - target for value, target in zip(inputs, targets))\n", " loss = sum(error * error for error in errors) / len(inputs)\n", " print(f'step={step} loss={loss:.12g}', flush=True)\n", " weight -= 0.1 * 2.0 * sum(error * value for error, value in zip(errors, inputs)) / len(inputs)\n", " bias -= 0.1 * 2.0 * sum(errors) / len(inputs)\n", " time.sleep(1.0)\n", "print(f'Finished: weight={weight:.6f}, bias={bias:.6f}', flush=True)\n"]} + ], + "metadata": {"kernelspec": {"display_name": "Python 3", "language": "python", "name": "python3"}, "language_info": {"name": "python", "version": "3.11"}}, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/examples/notebook-ray-cpu-demo.ipynb b/examples/notebook-ray-cpu-demo.ipynb new file mode 100644 index 00000000..e85c733d --- /dev/null +++ b/examples/notebook-ray-cpu-demo.ipynb @@ -0,0 +1,80 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "intro", + "metadata": {}, + "source": [ + "# TauGrid CPU Ray demo\n", + "\n", + "Submitted through the TauGrid JupyterLab plugin. It runs on a CPU-only Ray worker\n", + "profile, so it needs no GPU quota.\n" + ] + }, + { + "cell_type": "code", + "id": "connect", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import time\n", + "from math import sqrt\n", + "\n", + "import ray\n", + "\n", + "# On the cluster the RayJob starts the cluster, so connect to it; locally, start one.\n", + "try:\n", + " ray.init(address=\"auto\", ignore_reinit_error=True, logging_level=\"ERROR\")\n", + "except Exception:\n", + " ray.init(ignore_reinit_error=True, logging_level=\"ERROR\")\n", + "\n", + "resources = ray.cluster_resources()\n", + "print(\"ray\", ray.__version__)\n", + "print(\"nodes\", len(ray.nodes()))\n", + "print(\"cpus\", resources.get(\"CPU\"))\n", + "print(\"gpus\", resources.get(\"GPU\", 0))\n" + ] + }, + { + "cell_type": "code", + "id": "workload", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "@ray.remote(num_cpus=1)\n", + "def busy_sum(n: int) -> float:\n", + " return sum(sqrt(i) for i in range(n))\n", + "\n", + "started = time.time()\n", + "results = ray.get([busy_sum.remote(2_000_000) for _ in range(8)])\n", + "elapsed = time.time() - started\n", + "print(f\"CPU_DEMO tasks={len(results)} total={sum(results):.2f} elapsed={elapsed:.2f}s\")\n" + ] + }, + { + "cell_type": "code", + "id": "done", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "print(\"CPU_DEMO_OK\")" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "name": "python", + "version": "3.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/examples/notebook-ray-cpu-demo.md b/examples/notebook-ray-cpu-demo.md new file mode 100644 index 00000000..f5ec88b6 --- /dev/null +++ b/examples/notebook-ray-cpu-demo.md @@ -0,0 +1,98 @@ +# CPU Ray demo for the TauGrid notebook plugin + +Runs a CPU-only Ray job through the TauGrid JupyterLab plugin, so it needs no GPU +quota, and shows the plugin tracking it from admission to completion. + +- Notebook: [notebook-ray-cpu-demo.ipynb](notebook-ray-cpu-demo.ipynb) +- Driver: `tools/run-cpu-ray-demo.py` (drives the same endpoints the panel uses) + +## What the job does + +Connects to the Ray cluster the RayJob starts, then runs eight `@ray.remote` +CPU tasks and prints the Ray version, node and CPU counts, GPU count, and the +result. It finishes with `CPU_DEMO_OK`. + +## Prerequisites + +1. **A notebook runtime image.** The platform's AI runtime image ships Ray but no + notebook executor, and cluster pods cannot reach PyPI on a locked-down + network, so build the executor in: + + ```bash + python -m pip download --dest images/notebook-runtime/wheels \ + --platform manylinux2014_x86_64 --python-version 3.12 --implementation cp --abi cp312 \ + --only-binary=:all: "nbformat>=5.10" "nbconvert>=7.16" "ipykernel>=6.29" \ + "pexpect>4.6" "ptyprocess" + docker build -t taugrid-notebook-runtime:local images/notebook-runtime + ``` + + The extra `pexpect`/`ptyprocess` downloads are required because pip + evaluates `sys_platform` markers against the host, not the target platform. + +2. **Point the server at it** and enable submission: + + ```bash + TAUGRID_RUNTIME_IMAGE=taugrid-notebook-runtime:local \ + TAUGRID_SUBMISSION_ENABLED=1 \ + jupyter server --no-browser --port=8888 --ServerApp.token= + ``` + +3. **A CPU workload profile.** The shipped profiles all request GPUs, so add a + CPU one to the TauCluster: + + ```bash + kubectl patch cluster cluster --type=json -p '[{"op":"add","path":"/spec/workloadProfiles/-","value":{ + "name":"azure.research.cpu.small","description":"CPU-only Ray workers.", + "mode":"fixed","workerCount":1,"gpusPerWorker":0,"defaultLocalQueue":"jobqueue", + "executionTarget":"singleCluster","placement":"independent", + "applicability":{"lanes":["training"],"teams":["research"],"namespaces":["tau-notebook-e2e"]}, + "priorities":{"podPriorityClassName":"taugrid-default","workloadPriorityClassName":"taugrid-default"}}}]' + ``` + +4. **A LocalQueue in the run namespace**, and the namespace label the ClusterQueue + selects on. Without both, the workload stays unadmitted: + + ```bash + kubectl create namespace tau-notebook-e2e --dry-run=client -o yaml | kubectl apply -f - + kubectl label ns tau-notebook-e2e tau.azure.com/workspace=tau-notebook-e2e --overwrite + kubectl apply -f - <<'YAML' + apiVersion: kueue.x-k8s.io/v1beta2 + kind: LocalQueue + metadata: + name: jobqueue + namespace: tau-notebook-e2e + spec: + clusterQueue: jobqueue + YAML + ``` + +## Run it + +```bash +python tools/run-cpu-ray-demo.py --token --name cpu-demo --timeout 900 +``` + +Expected: the plan resolves `azure.research.cpu.small` on queue `jobqueue`, then +`state=queued` -> `state=running` -> `state=complete` with `RESULT: SUCCEEDED`. + +In the JupyterLab panel: open **TauGrid: Open runs**, set the namespace, press +**List runs**, and open the run. The detail tab shows Finished, Admitted, the +queue, and 2/2 pods; **Open logs** shows the bounded pod log snapshot. + +## Notes + +- The RayJob sets `ttlSecondsAfterFinished: 15`, so pods are removed 15 seconds + after the job ends. Patch the RayJob to a larger TTL if you want to read the + executed notebook or the Ray driver log afterwards: + + ```bash + kubectl patch rayjob -n --type=merge -p '{"spec":{"ttlSecondsAfterFinished":900}}' + kubectl exec -n -c ray-head -- \ + cat /tmp/ray/session_latest/logs/job-driver-*.log + kubectl exec -n -c ray-head -- python3 -c \ + "import json; nb=json.load(open('/data/analysis.executed.ipynb')); print(''.join(t for c in nb['cells'] for o in c.get('outputs',[]) for t in o.get('text',[])))" + ``` + +- The entrypoint still runs a `pip install nbconvert ipykernel` preamble. With a + runtime image that already contains them it is a no-op; on an image without + them it fails, because pods have no PyPI access here. diff --git a/images/notebook-runtime/Dockerfile b/images/notebook-runtime/Dockerfile new file mode 100644 index 00000000..795ee589 --- /dev/null +++ b/images/notebook-runtime/Dockerfile @@ -0,0 +1,33 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +# TauGrid notebook runtime: ray plus the notebook executor. +# +# The base AI runtime image ships ray but no notebook execution stack, and both +# pods and image builds can be cut off from PyPI on a locked-down network, so the +# executor is baked in at build time. Populate wheels/ (gitignored) to build +# offline: +# +# python -m pip download --dest images/notebook-runtime/wheels \ +# "nbformat>=5.10" "nbconvert>=7.16" "ipykernel>=6.29" +# docker build -t taugrid-notebook-runtime:local images/notebook-runtime +# +# With an empty wheels/ the build falls back to the package index. Publish the +# image through the normal pipeline; notebook submission stays disabled until a +# runtime image like this is published and recorded. + +FROM mcr.microsoft.com/aks/ai-runtime/ray:py3.12-ray2.56.0-cuda13.0 + +COPY wheels/ /wheels/ + +RUN if ls /wheels/*.whl >/dev/null 2>&1; then \ + python3 -m pip install --no-cache-dir --no-index --find-links=/wheels \ + "nbformat>=5.10" "nbconvert>=7.16" "ipykernel>=6.29"; \ + else \ + python3 -m pip install --no-cache-dir \ + "nbformat>=5.10" "nbconvert>=7.16" "ipykernel>=6.29"; \ + fi + +# Prove the executor is importable at build time, so a bad image fails here +# rather than in a user's job. +RUN python3 -c "import nbformat, nbconvert, ipykernel; print('notebook executor ready')" diff --git a/images/notebook-runtime/wheels/.gitignore b/images/notebook-runtime/wheels/.gitignore new file mode 100644 index 00000000..47c4b208 --- /dev/null +++ b/images/notebook-runtime/wheels/.gitignore @@ -0,0 +1,2 @@ +# Vendored only for local/offline image builds; never committed. +*.whl diff --git a/images/notebook-runtime/wheels/.gitkeep b/images/notebook-runtime/wheels/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/scripts/license-header-exclusions.txt b/scripts/license-header-exclusions.txt index ac89cb2a..1fcbe37a 100644 --- a/scripts/license-header-exclusions.txt +++ b/scripts/license-header-exclusions.txt @@ -17,3 +17,8 @@ charts/adx-mon/charts/ # Generated portal bundles contain third-party JavaScript; licenses are shipped # alongside them in assets/THIRD_PARTY_LICENSES.txt. Check first-party source. portal/internal/portalapi/assets/assets/ + +# Generated JupyterLab extension bundles contain third-party JavaScript; +# licenses are shipped alongside them in static/third-party-licenses.json. +# Check first-party source instead. +sdk/python/python/tau/labextension/static/ diff --git a/sdk/python/python/examples/nb_helpers.py b/sdk/python/python/examples/nb_helpers.py new file mode 100644 index 00000000..0e8b723d --- /dev/null +++ b/sdk/python/python/examples/nb_helpers.py @@ -0,0 +1,10 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +"""A sibling module a notebook can ship with, chosen in the submit review.""" + +VALUE = 41 + + +def total(values): + return sum(values) + VALUE diff --git a/sdk/python/python/examples/notebook-button-e2e.ipynb b/sdk/python/python/examples/notebook-button-e2e.ipynb new file mode 100644 index 00000000..e4c76c54 --- /dev/null +++ b/sdk/python/python/examples/notebook-button-e2e.ipynb @@ -0,0 +1,82 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "b0e2d001", + "metadata": {}, + "source": [ + "# TauGrid plugin button E2E\n", + "\n", + "The panel below carries the real interactive Submit button. Its submit is\n", + "backed by an in-kernel recording fake, so a browser click can be asserted\n", + "end-to-end without a live cluster: the click drives the same handler the\n", + "button registers, and the status line repaints into run view." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "b0e2d002", + "metadata": {}, + "outputs": [], + "source": [ + "%load_ext tau.widgets.ipython" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b0e2d003", + "metadata": {}, + "outputs": [], + "source": [ + "from tau.widgets.panel import TauGridPanel\n", + "from tau._backend import SubmittedRun\n", + "from IPython.display import display\n", + "\n", + "recorded = []\n", + "\n", + "def fake_submit(notebook=None, **kwargs):\n", + " recorded.append(notebook)\n", + " panel.run_name = \"submitted-button-demo\" # status repaint proves the click ran\n", + " return SubmittedRun(name=panel.run_name, namespace=panel.namespace, kind=\"RayJob\")\n", + "\n", + "panel = TauGridPanel(namespace=\"ray\")\n", + "panel.set_notebook_path(\"examples/notebook-button-e2e.ipynb\")\n", + "panel.submit = fake_submit\n", + "display(panel.build())" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b0e2d004", + "metadata": {}, + "outputs": [], + "source": [ + "recorded" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.14.7" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/sdk/python/python/examples/notebook-embed.ipynb b/sdk/python/python/examples/notebook-embed.ipynb new file mode 100644 index 00000000..602c3f2d --- /dev/null +++ b/sdk/python/python/examples/notebook-embed.ipynb @@ -0,0 +1,70 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "embed-intro", + "metadata": {}, + "source": [ + "# TensorBoard-style TauGrid embed\n", + "\n", + "`%taugrid --embed` serves the TauGrid portal run view through a local\n", + "same-origin proxy and frames it in this cell - the same pattern the\n", + "TensorBoard notebook plugin uses. Set `PORTAL` to your portal URL.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "embed-ext", + "metadata": {}, + "outputs": [], + "source": [ + "%load_ext tau.widgets.ipython\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "embed-run", + "metadata": {}, + "outputs": [], + "source": [ + "from IPython.display import display\n", + "\n", + "PORTAL = 'http://127.0.0.1:8090' # your TauGrid portal base URL\n", + "RUN = 'notebook-embed-demo'\n", + "NAMESPACE = 'tau-notebook-e2e'\n", + "\n", + "view = get_ipython().run_line_magic(\n", + " 'taugrid',\n", + " f'--embed --name={RUN} --namespace={NAMESPACE} --portal={PORTAL}',\n", + ")\n", + "print('proxied:', view.proxied)\n", + "print('iframe url:', view.url)\n", + "print('portal link:', view.portal_url + view.path)\n", + "display(view)\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.14.7" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/sdk/python/python/examples/notebook-files-demo.ipynb b/sdk/python/python/examples/notebook-files-demo.ipynb new file mode 100644 index 00000000..56e7ce6c --- /dev/null +++ b/sdk/python/python/examples/notebook-files-demo.ipynb @@ -0,0 +1,42 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "intro", + "metadata": {}, + "source": [ + "# Shipping files with the notebook\n", + "\n", + "This notebook imports a sibling module. Select `nb_helpers.py` under\n", + "**Files to ship** in the submit review, or the import fails on the cluster.\n" + ] + }, + { + "cell_type": "code", + "id": "use", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import nb_helpers\n", + "\n", + "print(\"HELPER_VALUE\", nb_helpers.VALUE)\n", + "print(\"HELPER_TOTAL\", nb_helpers.total([1, 1]))\n", + "print(\"HELPER_OK\")\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "name": "python", + "version": "3.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/sdk/python/python/examples/notebook-load-job.ipynb b/sdk/python/python/examples/notebook-load-job.ipynb new file mode 100644 index 00000000..33d4e032 --- /dev/null +++ b/sdk/python/python/examples/notebook-load-job.ipynb @@ -0,0 +1,165 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "load-job-intro", + "metadata": {}, + "source": [ + "# Load an existing RayJob and check its status\n", + "\n", + "This notebook attaches to a RayJob that already exists in a Kubernetes\n", + "cluster and reads its normalized status. It runs entirely offline: a small\n", + "in-kernel fake cluster client stands in for the Kubernetes API, so the\n", + "example needs no real cluster and no network access.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "load-job-ext", + "metadata": {}, + "outputs": [], + "source": [ + "%load_ext tau.widgets.ipython" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "load-job-fakes", + "metadata": {}, + "outputs": [], + "source": [ + "from tau.widgets.panel import TauGridPanel\n", + "from tau.widgets.kube import ClusterClient\n", + "from tau.widgets.status import list_runs\n", + "\n", + "RAYJOB = {\n", + " \"metadata\": {\n", + " \"name\": \"demo-rayjob\",\n", + " \"labels\": {\"kueue.x-k8s.io/queue-name\": \"research-gpu\"},\n", + " },\n", + " \"status\": {\n", + " \"jobStatus\": \"RUNNING\",\n", + " \"rayClusterName\": \"demo-rayjob-raycluster\",\n", + " \"jobId\": \"raysubmit_123\",\n", + " \"jobDeploymentStatus\": \"Running\",\n", + " \"conditions\": [{\"type\": \"Admitted\", \"status\": \"True\"}],\n", + " },\n", + "}\n", + "\n", + "PODS = {\n", + " \"items\": [\n", + " {\n", + " \"metadata\": {\n", + " \"name\": \"demo-rayjob-head-abc\",\n", + " \"labels\": {\"ray.io/node-type\": \"head\"},\n", + " },\n", + " \"spec\": {\"nodeName\": \"gpu-node-1\"},\n", + " \"status\": {\n", + " \"phase\": \"Running\",\n", + " \"conditions\": [{\"type\": \"Ready\", \"status\": \"True\"}],\n", + " \"containerStatuses\": [{\"restartCount\": 1, \"ready\": True}],\n", + " },\n", + " }\n", + " ]\n", + "}\n", + "\n", + "\n", + "class FakeCustomApi:\n", + " \"\"\"Offline stand-in for the Kubernetes CustomObjectsApi.\"\"\"\n", + "\n", + " def __init__(self, rayjob=RAYJOB):\n", + " self.rayjob = rayjob\n", + "\n", + " def get_namespaced_custom_object(self, **kwargs):\n", + " return self.rayjob\n", + "\n", + " def list_namespaced_custom_object(self, **kwargs):\n", + " return {\"items\": [self.rayjob] if self.rayjob else []}\n", + "\n", + "\n", + "class FakeCoreApi:\n", + " \"\"\"Offline stand-in for the Kubernetes CoreV1Api pod listing.\"\"\"\n", + "\n", + " def __init__(self, pods=PODS[\"items\"]):\n", + " self.pods = pods\n", + "\n", + " def list_namespaced_pod(self, namespace, label_selector=None, **kwargs):\n", + " return {\"items\": self.pods}\n", + "\n", + "\n", + "def build_panel():\n", + " \"\"\"Return a TauGridPanel wired to the in-kernel fake cluster.\"\"\"\n", + " client = ClusterClient(custom=FakeCustomApi(), core=FakeCoreApi())\n", + " return TauGridPanel(namespace=\"ray\", client=client)\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "load-job-load", + "metadata": {}, + "outputs": [], + "source": [ + "panel = build_panel()\n", + "status = panel.load('demo-rayjob', namespace='ray')\n", + "print(status.state, status.ready_pods, status.total_pods, status.queue)\n", + "assert status.existing is True and status.state == 'running' and status.ready_pods == 1 and status.total_pods == 1" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "load-job-check", + "metadata": {}, + "outputs": [], + "source": [ + "status = panel.check_status()\n", + "print([d.code for d in status.diagnostics])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "load-job-render", + "metadata": {}, + "outputs": [], + "source": [ + "panel" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "load-job-list", + "metadata": {}, + "outputs": [], + "source": [ + "runs = list_runs(panel.client, namespace='ray')\n", + "print([run.name for run in runs])" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.14.7" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/sdk/python/python/examples/notebook-panel.ipynb b/sdk/python/python/examples/notebook-panel.ipynb new file mode 100644 index 00000000..5d0fbfb4 --- /dev/null +++ b/sdk/python/python/examples/notebook-panel.ipynb @@ -0,0 +1,81 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "6fb6c9f0", + "metadata": {}, + "source": [ + "# TauGrid notebook panel\n", + "\n", + "Run this notebook to load the TauGrid plugin and render its panel.\n", + "The first cell is the platform-authored bootstrap; the end user writes\n", + "no imports (design D2)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "cc1a60d6", + "metadata": {}, + "outputs": [], + "source": [ + "%load_ext tau.widgets.ipython" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8b81e6c6", + "metadata": {}, + "outputs": [], + "source": [ + "%taugrid" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "0e1b58a7", + "metadata": {}, + "outputs": [], + "source": [ + "# Inspect the panel state without a live cluster (offline demo).\n", + "from tau.widgets.panel import TauGridPanel\n", + "from tau.widgets.metrics import MetricSeries, MetricSample\n", + "\n", + "panel = TauGridPanel(run_name=\"demo\")\n", + "panel.set_loss(MetricSeries([MetricSample(0, 0.9230), MetricSample(10, 0.1040)]))\n", + "panel" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c2cdf7a7-f787-47f9-b394-fed67ad1aa97", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.14.7" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/sdk/python/python/labextension/.gitignore b/sdk/python/python/labextension/.gitignore new file mode 100644 index 00000000..a2d9a5e2 --- /dev/null +++ b/sdk/python/python/labextension/.gitignore @@ -0,0 +1,3 @@ +node_modules/ +lib/ +tsconfig.tsbuildinfo diff --git a/sdk/python/python/labextension/package-lock.json b/sdk/python/python/labextension/package-lock.json new file mode 100644 index 00000000..db76fdb7 --- /dev/null +++ b/sdk/python/python/labextension/package-lock.json @@ -0,0 +1,5913 @@ +{ + "name": "taugrid-jupyterlab", + "version": "0.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "taugrid-jupyterlab", + "version": "0.1.0", + "license": "MIT", + "dependencies": { + "@jupyterlab/application": "^4.0.0", + "@jupyterlab/apputils": "^4.0.0", + "@jupyterlab/coreutils": "^6.0.0", + "@jupyterlab/launcher": "^4.0.0", + "@jupyterlab/notebook": "^4.0.0", + "@jupyterlab/services": "^7.0.0", + "@lumino/widgets": "^2.0.0", + "react": "^18.2.0", + "react-dom": "^18.2.0" + }, + "devDependencies": { + "@jupyterlab/builder": "^4.0.0", + "@types/react": "^18.2.0", + "@types/react-dom": "^18.2.0", + "rimraf": "^5.0.0", + "typescript": "~5.3.0" + } + }, + "node_modules/@antfu/install-pkg": { + "version": "2.0.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@antfu/install-pkg/-/install-pkg-2.0.1.tgz", + "integrity": "sha1-vbw9Io5vZFxYPtk1RfzdX1ovDKI=", + "license": "MIT", + "dependencies": { + "package-manager-detector": "^1.7.0", + "tinyexec": "^1.2.4" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@braintree/sanitize-url": { + "version": "7.1.2", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@braintree/sanitize-url/-/sanitize-url-7.1.2.tgz", + "integrity": "sha1-yiA1sP7+lWqGdv8Maa9z5gX82B8=", + "license": "MIT" + }, + "node_modules/@chevrotain/types": { + "version": "11.1.2", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@chevrotain/types/-/types-11.1.2.tgz", + "integrity": "sha1-6DoaJwTwxeSedZKyFAMaD0o01+U=", + "license": "Apache-2.0" + }, + "node_modules/@codemirror/autocomplete": { + "version": "6.20.3", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@codemirror/autocomplete/-/autocomplete-6.20.3.tgz", + "integrity": "sha1-aWt0AxLGqWLhRWe0mjZhtZJLxa4=", + "license": "MIT", + "dependencies": { + "@codemirror/language": "^6.0.0", + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.17.0", + "@lezer/common": "^1.0.0" + } + }, + "node_modules/@codemirror/commands": { + "version": "6.11.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@codemirror/commands/-/commands-6.11.0.tgz", + "integrity": "sha1-IZTW/K2e14fcxCZn2w4FQ/qy4O8=", + "license": "MIT", + "dependencies": { + "@codemirror/language": "^6.0.0", + "@codemirror/state": "^6.7.0", + "@codemirror/view": "^6.27.0", + "@lezer/common": "^1.1.0" + } + }, + "node_modules/@codemirror/lang-cpp": { + "version": "6.0.3", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@codemirror/lang-cpp/-/lang-cpp-6.0.3.tgz", + "integrity": "sha1-sXW1n83o3W5WO3/u6LvtgZY6lJE=", + "license": "MIT", + "dependencies": { + "@codemirror/language": "^6.0.0", + "@lezer/cpp": "^1.0.0" + } + }, + "node_modules/@codemirror/lang-css": { + "version": "6.3.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@codemirror/lang-css/-/lang-css-6.3.1.tgz", + "integrity": "sha1-djykGu6BuyQxvlXjz8x8yOkUIaM=", + "license": "MIT", + "dependencies": { + "@codemirror/autocomplete": "^6.0.0", + "@codemirror/language": "^6.0.0", + "@codemirror/state": "^6.0.0", + "@lezer/common": "^1.0.2", + "@lezer/css": "^1.1.7" + } + }, + "node_modules/@codemirror/lang-html": { + "version": "6.4.12", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@codemirror/lang-html/-/lang-html-6.4.12.tgz", + "integrity": "sha1-yl3A90HB6BkYK86dA7BzVSFysbc=", + "license": "MIT", + "dependencies": { + "@codemirror/autocomplete": "^6.0.0", + "@codemirror/lang-css": "^6.0.0", + "@codemirror/lang-javascript": "^6.0.0", + "@codemirror/language": "^6.4.0", + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.17.0", + "@lezer/common": "^1.0.0", + "@lezer/css": "^1.1.0", + "@lezer/html": "^1.3.12" + } + }, + "node_modules/@codemirror/lang-java": { + "version": "6.0.2", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@codemirror/lang-java/-/lang-java-6.0.2.tgz", + "integrity": "sha1-YB1bPXdKSpl9EWR8y2wFcCxUvVs=", + "license": "MIT", + "dependencies": { + "@codemirror/language": "^6.0.0", + "@lezer/java": "^1.0.0" + } + }, + "node_modules/@codemirror/lang-javascript": { + "version": "6.2.5", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@codemirror/lang-javascript/-/lang-javascript-6.2.5.tgz", + "integrity": "sha1-ueprLwOD7WiV+ueIjAMiVBU48Qo=", + "license": "MIT", + "dependencies": { + "@codemirror/autocomplete": "^6.0.0", + "@codemirror/language": "^6.6.0", + "@codemirror/lint": "^6.0.0", + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.17.0", + "@lezer/common": "^1.0.0", + "@lezer/javascript": "^1.0.0" + } + }, + "node_modules/@codemirror/lang-json": { + "version": "6.0.2", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@codemirror/lang-json/-/lang-json-6.0.2.tgz", + "integrity": "sha1-BUsWBnEwZmfiXYA4UoYEmEGDYXk=", + "license": "MIT", + "dependencies": { + "@codemirror/language": "^6.0.0", + "@lezer/json": "^1.0.0" + } + }, + "node_modules/@codemirror/lang-markdown": { + "version": "6.5.2", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@codemirror/lang-markdown/-/lang-markdown-6.5.2.tgz", + "integrity": "sha1-UwuRRCwDXKXU6lE1wEmbLBXDmHI=", + "license": "MIT", + "dependencies": { + "@codemirror/autocomplete": "^6.7.1", + "@codemirror/lang-html": "^6.0.0", + "@codemirror/language": "^6.3.0", + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.0.0", + "@lezer/common": "^1.2.1", + "@lezer/markdown": "^1.0.0" + } + }, + "node_modules/@codemirror/lang-php": { + "version": "6.0.2", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@codemirror/lang-php/-/lang-php-6.0.2.tgz", + "integrity": "sha1-vcQ50ZXI5zUTvFuXGpmle1yZ7lU=", + "license": "MIT", + "dependencies": { + "@codemirror/lang-html": "^6.0.0", + "@codemirror/language": "^6.0.0", + "@codemirror/state": "^6.0.0", + "@lezer/common": "^1.0.0", + "@lezer/php": "^1.0.0" + } + }, + "node_modules/@codemirror/lang-python": { + "version": "6.2.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@codemirror/lang-python/-/lang-python-6.2.1.tgz", + "integrity": "sha1-N8mTBxYRAVaGWpXFSKoO71VShjo=", + "license": "MIT", + "dependencies": { + "@codemirror/autocomplete": "^6.3.2", + "@codemirror/language": "^6.8.0", + "@codemirror/state": "^6.0.0", + "@lezer/common": "^1.2.1", + "@lezer/python": "^1.1.4" + } + }, + "node_modules/@codemirror/lang-rust": { + "version": "6.0.2", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@codemirror/lang-rust/-/lang-rust-6.0.2.tgz", + "integrity": "sha1-aRRuaz6Plh7xSQWa7Lnge/17870=", + "license": "MIT", + "dependencies": { + "@codemirror/language": "^6.0.0", + "@lezer/rust": "^1.0.0" + } + }, + "node_modules/@codemirror/lang-sql": { + "version": "6.10.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@codemirror/lang-sql/-/lang-sql-6.10.0.tgz", + "integrity": "sha1-Sb+/bPMVFqmeZ02po5n0QmEBqVo=", + "license": "MIT", + "dependencies": { + "@codemirror/autocomplete": "^6.0.0", + "@codemirror/language": "^6.0.0", + "@codemirror/state": "^6.0.0", + "@lezer/common": "^1.2.0", + "@lezer/highlight": "^1.0.0", + "@lezer/lr": "^1.0.0" + } + }, + "node_modules/@codemirror/lang-wast": { + "version": "6.0.2", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@codemirror/lang-wast/-/lang-wast-6.0.2.tgz", + "integrity": "sha1-0rFBdeXoDXh4y7sp4g7JDcEtOis=", + "license": "MIT", + "dependencies": { + "@codemirror/language": "^6.0.0", + "@lezer/common": "^1.2.0", + "@lezer/highlight": "^1.0.0", + "@lezer/lr": "^1.0.0" + } + }, + "node_modules/@codemirror/lang-xml": { + "version": "6.1.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@codemirror/lang-xml/-/lang-xml-6.1.0.tgz", + "integrity": "sha1-4+eG4aif3JUg7+dcHW094cQOuRw=", + "license": "MIT", + "dependencies": { + "@codemirror/autocomplete": "^6.0.0", + "@codemirror/language": "^6.4.0", + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.0.0", + "@lezer/common": "^1.0.0", + "@lezer/xml": "^1.0.0" + } + }, + "node_modules/@codemirror/language": { + "version": "6.12.4", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@codemirror/language/-/language-6.12.4.tgz", + "integrity": "sha1-AecP1ao6igZ/8d/sddW2OUzfoFg=", + "license": "MIT", + "dependencies": { + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.23.0", + "@lezer/common": "^1.5.0", + "@lezer/highlight": "^1.0.0", + "@lezer/lr": "^1.0.0", + "style-mod": "^4.0.0" + } + }, + "node_modules/@codemirror/legacy-modes": { + "version": "6.5.4", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@codemirror/legacy-modes/-/legacy-modes-6.5.4.tgz", + "integrity": "sha1-SigITMh50prE1/L6N5+lBwKsPmY=", + "license": "MIT", + "dependencies": { + "@codemirror/language": "^6.0.0" + } + }, + "node_modules/@codemirror/lint": { + "version": "6.9.7", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@codemirror/lint/-/lint-6.9.7.tgz", + "integrity": "sha1-hB/HM2dDidkf5JocNAJ607q98QU=", + "license": "MIT", + "dependencies": { + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.42.0", + "crelt": "^1.0.5" + } + }, + "node_modules/@codemirror/search": { + "version": "6.7.2", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@codemirror/search/-/search-6.7.2.tgz", + "integrity": "sha1-k6SeshwCbeRzxPw6BHuP1neEsPA=", + "license": "MIT", + "dependencies": { + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.37.0", + "crelt": "^1.0.5" + } + }, + "node_modules/@codemirror/state": { + "version": "6.7.4", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@codemirror/state/-/state-6.7.4.tgz", + "integrity": "sha1-xA/2bBMu6fj25g46CSz840bj5MY=", + "license": "MIT", + "dependencies": { + "@marijn/find-cluster-break": "^1.0.0" + } + }, + "node_modules/@codemirror/view": { + "version": "6.43.11", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@codemirror/view/-/view-6.43.11.tgz", + "integrity": "sha1-sPq8UZs1fXG0gfDSR89gndBms70=", + "license": "MIT", + "dependencies": { + "@codemirror/state": "^6.7.0", + "crelt": "^1.0.6", + "style-mod": "^4.1.0", + "w3c-keyname": "^2.2.4" + } + }, + "node_modules/@discoveryjs/json-ext": { + "version": "0.5.7", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", + "integrity": "sha1-HVcr+74Ut3BOC6Dzm3SBW4SHDXA=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@fortawesome/fontawesome-free": { + "version": "5.15.4", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@fortawesome/fontawesome-free/-/fontawesome-free-5.15.4.tgz", + "integrity": "sha1-7NpXErYayFLHYNizx5yWrcpVVOU=", + "hasInstallScript": true, + "license": "(CC-BY-4.0 AND OFL-1.1 AND MIT)", + "engines": { + "node": ">=6" + } + }, + "node_modules/@iconify/types": { + "version": "2.0.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@iconify/types/-/types-2.0.0.tgz", + "integrity": "sha1-qw6epoHWyKEhTzDNdB/jogzFf1c=", + "license": "MIT" + }, + "node_modules/@iconify/utils": { + "version": "3.1.7", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@iconify/utils/-/utils-3.1.7.tgz", + "integrity": "sha1-//EcUoSQsRmiUKzjzzWgp44YIxc=", + "license": "MIT", + "dependencies": { + "@antfu/install-pkg": "^2.0.1", + "@iconify/types": "^2.0.0", + "import-meta-resolve": "^4.2.0" + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha1-s3Znt7wYHBaHgiWbq0JHT79StVA=", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha1-Y0Khn0Q0dRjJPkOxrGnes8Rlah8=", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha1-eg7mAfYPmaIMfHxf8MgDiMEYm9Y=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.11", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@jridgewell/source-map/-/source-map-0.3.11.tgz", + "integrity": "sha1-shg1y9Nttla4V8KtAuvUE8wTqbo=", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.6.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.6.0.tgz", + "integrity": "sha1-9MZj6GLwbcmMpNRThixGkCeJoY0=", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha1-2xXWeByTHzolGj2sOVAcmKYIL9A=", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@jupyter/react-components": { + "version": "0.16.7", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@jupyter/react-components/-/react-components-0.16.7.tgz", + "integrity": "sha1-lJJmR6NXhAnGXWnVtEyGywyozqs=", + "license": "BSD-3-Clause", + "dependencies": { + "@jupyter/web-components": "^0.16.7", + "react": ">=17.0.0 <19.0.0" + } + }, + "node_modules/@jupyter/web-components": { + "version": "0.16.7", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@jupyter/web-components/-/web-components-0.16.7.tgz", + "integrity": "sha1-zTR8Sh3NqVl+9AX5Tie/z+kg0bY=", + "license": "BSD-3-Clause", + "dependencies": { + "@microsoft/fast-colors": "^5.3.1", + "@microsoft/fast-element": "^1.12.0", + "@microsoft/fast-foundation": "^2.49.4", + "@microsoft/fast-web-utilities": "^5.4.1" + } + }, + "node_modules/@jupyter/ydoc": { + "version": "4.1.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@jupyter/ydoc/-/ydoc-4.1.1.tgz", + "integrity": "sha1-sRkzzs+Ez8iK9Kv/rgFJTlba5Zw=", + "license": "BSD-3-Clause", + "dependencies": { + "@jupyterlab/nbformat": "^3.0.0 || ^4.0.0-alpha.21 || ^4.0.0", + "@lumino/coreutils": "^1.11.0 || ^2.0.0", + "@lumino/disposable": "^1.10.0 || ^2.0.0", + "@lumino/signaling": "^1.10.0 || ^2.0.0", + "y-protocols": "^1.0.5", + "yjs": "^13.5.40" + } + }, + "node_modules/@jupyterlab/application": { + "version": "4.6.3", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@jupyterlab/application/-/application-4.6.3.tgz", + "integrity": "sha1-/11gE2xAsRALzQuqyato9Barqr0=", + "license": "BSD-3-Clause", + "dependencies": { + "@fortawesome/fontawesome-free": "^5.12.0", + "@jupyterlab/apputils": "^4.7.3", + "@jupyterlab/coreutils": "^6.6.3", + "@jupyterlab/docregistry": "^4.6.3", + "@jupyterlab/rendermime": "^4.6.3", + "@jupyterlab/rendermime-interfaces": "^3.14.3", + "@jupyterlab/services": "^7.6.3", + "@jupyterlab/statedb": "^4.6.3", + "@jupyterlab/translation": "^4.6.3", + "@jupyterlab/ui-components": "^4.6.3", + "@lumino/algorithm": "^2.0.4", + "@lumino/application": "^2.4.9", + "@lumino/commands": "^2.3.3", + "@lumino/coreutils": "^2.2.2", + "@lumino/disposable": "^2.1.5", + "@lumino/messaging": "^2.0.4", + "@lumino/polling": "^2.1.5", + "@lumino/properties": "^2.0.4", + "@lumino/signaling": "^2.1.5", + "@lumino/widgets": "^2.8.0" + } + }, + "node_modules/@jupyterlab/apputils": { + "version": "4.7.3", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@jupyterlab/apputils/-/apputils-4.7.3.tgz", + "integrity": "sha1-ZLCiQf9vP0/q/SgmtEoTJF4Grjk=", + "license": "BSD-3-Clause", + "dependencies": { + "@jupyterlab/coreutils": "^6.6.3", + "@jupyterlab/observables": "^5.6.3", + "@jupyterlab/rendermime-interfaces": "^3.14.3", + "@jupyterlab/services": "^7.6.3", + "@jupyterlab/settingregistry": "^4.6.3", + "@jupyterlab/statedb": "^4.6.3", + "@jupyterlab/statusbar": "^4.6.3", + "@jupyterlab/translation": "^4.6.3", + "@jupyterlab/ui-components": "^4.6.3", + "@lumino/algorithm": "^2.0.4", + "@lumino/commands": "^2.3.3", + "@lumino/coreutils": "^2.2.2", + "@lumino/disposable": "^2.1.5", + "@lumino/domutils": "^2.0.4", + "@lumino/messaging": "^2.0.4", + "@lumino/signaling": "^2.1.5", + "@lumino/virtualdom": "^2.0.4", + "@lumino/widgets": "^2.8.0", + "@types/react": "^18.0.26", + "react": "^18.2.0", + "sanitize-html": "~2.12.1" + } + }, + "node_modules/@jupyterlab/attachments": { + "version": "4.6.3", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@jupyterlab/attachments/-/attachments-4.6.3.tgz", + "integrity": "sha1-cTUZU6SQbUvqFNJUGgNnCizOlO0=", + "license": "BSD-3-Clause", + "dependencies": { + "@jupyterlab/nbformat": "^4.6.3", + "@jupyterlab/observables": "^5.6.3", + "@jupyterlab/rendermime": "^4.6.3", + "@jupyterlab/rendermime-interfaces": "^3.14.3", + "@lumino/disposable": "^2.1.5", + "@lumino/signaling": "^2.1.5" + } + }, + "node_modules/@jupyterlab/builder": { + "version": "4.5.10", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@jupyterlab/builder/-/builder-4.5.10.tgz", + "integrity": "sha1-ss/DwvMLXdeCH9wYCe3RdY30MhM=", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@lumino/algorithm": "^2.0.4", + "@lumino/application": "^2.4.8", + "@lumino/commands": "^2.3.3", + "@lumino/coreutils": "^2.2.2", + "@lumino/disposable": "^2.1.5", + "@lumino/domutils": "^2.0.4", + "@lumino/dragdrop": "^2.1.8", + "@lumino/messaging": "^2.0.4", + "@lumino/properties": "^2.0.4", + "@lumino/signaling": "^2.1.5", + "@lumino/virtualdom": "^2.0.4", + "@lumino/widgets": "^2.7.5", + "ajv": "^8.12.0", + "commander": "^9.4.1", + "css-loader": "^6.7.1", + "duplicate-package-checker-webpack-plugin": "^3.0.0", + "fs-extra": "^10.1.0", + "glob": "~7.1.6", + "license-webpack-plugin": "^4.0.2", + "mini-css-extract-plugin": "^2.7.0", + "mini-svg-data-uri": "^1.4.4", + "path-browserify": "^1.0.0", + "process": "^0.11.10", + "source-map-loader": "~1.0.2", + "style-loader": "~3.3.1", + "supports-color": "^7.2.0", + "terser-webpack-plugin": "^5.3.7", + "webpack": "^5.76.1", + "webpack-cli": "^5.0.1", + "webpack-merge": "^5.8.0", + "webpack-sources": "^3.4.1", + "worker-loader": "^3.0.2" + }, + "bin": { + "build-labextension": "lib/build-labextension.js" + } + }, + "node_modules/@jupyterlab/cells": { + "version": "4.6.3", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@jupyterlab/cells/-/cells-4.6.3.tgz", + "integrity": "sha1-DlK10g9sUEMutjJlU+sgDk4QfGA=", + "license": "BSD-3-Clause", + "dependencies": { + "@codemirror/state": "^6.5.4", + "@codemirror/view": "^6.39.14", + "@jupyter/ydoc": "^4.0.0", + "@jupyterlab/apputils": "^4.7.3", + "@jupyterlab/attachments": "^4.6.3", + "@jupyterlab/codeeditor": "^4.6.3", + "@jupyterlab/codemirror": "^4.6.3", + "@jupyterlab/coreutils": "^6.6.3", + "@jupyterlab/documentsearch": "^4.6.3", + "@jupyterlab/filebrowser": "^4.6.3", + "@jupyterlab/nbformat": "^4.6.3", + "@jupyterlab/observables": "^5.6.3", + "@jupyterlab/outputarea": "^4.6.3", + "@jupyterlab/rendermime": "^4.6.3", + "@jupyterlab/services": "^7.6.3", + "@jupyterlab/toc": "^6.6.3", + "@jupyterlab/translation": "^4.6.3", + "@jupyterlab/ui-components": "^4.6.3", + "@lumino/algorithm": "^2.0.4", + "@lumino/coreutils": "^2.2.2", + "@lumino/domutils": "^2.0.4", + "@lumino/dragdrop": "^2.1.8", + "@lumino/messaging": "^2.0.4", + "@lumino/polling": "^2.1.5", + "@lumino/signaling": "^2.1.5", + "@lumino/virtualdom": "^2.0.4", + "@lumino/widgets": "^2.8.0", + "react": "^18.2.0" + } + }, + "node_modules/@jupyterlab/codeeditor": { + "version": "4.6.3", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@jupyterlab/codeeditor/-/codeeditor-4.6.3.tgz", + "integrity": "sha1-XQuZUzfrr46mLp6fWrKb9/tykPU=", + "license": "BSD-3-Clause", + "dependencies": { + "@codemirror/state": "^6.5.4", + "@jupyter/ydoc": "^4.0.0", + "@jupyterlab/apputils": "^4.7.3", + "@jupyterlab/coreutils": "^6.6.3", + "@jupyterlab/nbformat": "^4.6.3", + "@jupyterlab/observables": "^5.6.3", + "@jupyterlab/statusbar": "^4.6.3", + "@jupyterlab/translation": "^4.6.3", + "@jupyterlab/ui-components": "^4.6.3", + "@lumino/coreutils": "^2.2.2", + "@lumino/disposable": "^2.1.5", + "@lumino/dragdrop": "^2.1.8", + "@lumino/messaging": "^2.0.4", + "@lumino/signaling": "^2.1.5", + "@lumino/widgets": "^2.8.0", + "react": "^18.2.0" + } + }, + "node_modules/@jupyterlab/codemirror": { + "version": "4.6.3", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@jupyterlab/codemirror/-/codemirror-4.6.3.tgz", + "integrity": "sha1-eMco02lzW3wkN3kM73R7A6HPVk0=", + "license": "BSD-3-Clause", + "dependencies": { + "@codemirror/autocomplete": "^6.20.0", + "@codemirror/commands": "^6.10.2", + "@codemirror/lang-cpp": "^6.0.3", + "@codemirror/lang-css": "^6.3.1", + "@codemirror/lang-html": "^6.4.11", + "@codemirror/lang-java": "^6.0.2", + "@codemirror/lang-javascript": "^6.2.4", + "@codemirror/lang-json": "^6.0.2", + "@codemirror/lang-markdown": "^6.5.0", + "@codemirror/lang-php": "^6.0.2", + "@codemirror/lang-python": "^6.2.1", + "@codemirror/lang-rust": "^6.0.2", + "@codemirror/lang-sql": "^6.10.0", + "@codemirror/lang-wast": "^6.0.2", + "@codemirror/lang-xml": "^6.1.0", + "@codemirror/language": "^6.12.1", + "@codemirror/legacy-modes": "^6.5.2", + "@codemirror/search": "^6.6.0", + "@codemirror/state": "^6.5.4", + "@codemirror/view": "^6.39.14", + "@jupyter/ydoc": "^4.0.0", + "@jupyterlab/codeeditor": "^4.6.3", + "@jupyterlab/coreutils": "^6.6.3", + "@jupyterlab/documentsearch": "^4.6.3", + "@jupyterlab/nbformat": "^4.6.3", + "@jupyterlab/translation": "^4.6.3", + "@lezer/common": "^1.2.1", + "@lezer/generator": "^1.7.0", + "@lezer/highlight": "^1.2.0", + "@lezer/markdown": "^1.3.0", + "@lumino/coreutils": "^2.2.2", + "@lumino/disposable": "^2.1.5", + "@lumino/signaling": "^2.1.5", + "yjs": "^13.5.40" + } + }, + "node_modules/@jupyterlab/coreutils": { + "version": "6.6.3", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@jupyterlab/coreutils/-/coreutils-6.6.3.tgz", + "integrity": "sha1-K1uTWfxW8QpgRlEEZNnsD+yQDIo=", + "license": "BSD-3-Clause", + "dependencies": { + "@lumino/coreutils": "^2.2.2", + "@lumino/disposable": "^2.1.5", + "@lumino/signaling": "^2.1.5", + "minimist": "~1.2.0", + "path-browserify": "^1.0.0", + "url-parse": "~1.5.4" + } + }, + "node_modules/@jupyterlab/docmanager": { + "version": "4.6.3", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@jupyterlab/docmanager/-/docmanager-4.6.3.tgz", + "integrity": "sha1-USpN50r4eCKcCINxSCMn8Az9pDE=", + "license": "BSD-3-Clause", + "dependencies": { + "@jupyterlab/apputils": "^4.7.3", + "@jupyterlab/coreutils": "^6.6.3", + "@jupyterlab/docregistry": "^4.6.3", + "@jupyterlab/rendermime": "^4.6.3", + "@jupyterlab/services": "^7.6.3", + "@jupyterlab/statedb": "^4.6.3", + "@jupyterlab/statusbar": "^4.6.3", + "@jupyterlab/translation": "^4.6.3", + "@jupyterlab/ui-components": "^4.6.3", + "@lumino/algorithm": "^2.0.4", + "@lumino/coreutils": "^2.2.2", + "@lumino/disposable": "^2.1.5", + "@lumino/messaging": "^2.0.4", + "@lumino/polling": "^2.1.5", + "@lumino/properties": "^2.0.4", + "@lumino/signaling": "^2.1.5", + "@lumino/widgets": "^2.8.0", + "react": "^18.2.0" + } + }, + "node_modules/@jupyterlab/docregistry": { + "version": "4.6.3", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@jupyterlab/docregistry/-/docregistry-4.6.3.tgz", + "integrity": "sha1-JlxOTqqRH18u18jBMEfzEAKcxzA=", + "license": "BSD-3-Clause", + "dependencies": { + "@jupyter/ydoc": "^4.0.0", + "@jupyterlab/apputils": "^4.7.3", + "@jupyterlab/codeeditor": "^4.6.3", + "@jupyterlab/coreutils": "^6.6.3", + "@jupyterlab/observables": "^5.6.3", + "@jupyterlab/rendermime": "^4.6.3", + "@jupyterlab/rendermime-interfaces": "^3.14.3", + "@jupyterlab/services": "^7.6.3", + "@jupyterlab/translation": "^4.6.3", + "@jupyterlab/ui-components": "^4.6.3", + "@lumino/algorithm": "^2.0.4", + "@lumino/coreutils": "^2.2.2", + "@lumino/disposable": "^2.1.5", + "@lumino/messaging": "^2.0.4", + "@lumino/properties": "^2.0.4", + "@lumino/signaling": "^2.1.5", + "@lumino/widgets": "^2.8.0", + "react": "^18.2.0" + } + }, + "node_modules/@jupyterlab/documentsearch": { + "version": "4.6.3", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@jupyterlab/documentsearch/-/documentsearch-4.6.3.tgz", + "integrity": "sha1-AV+CpUN8oEfOBlHperaAXDEG52k=", + "license": "BSD-3-Clause", + "dependencies": { + "@jupyterlab/apputils": "^4.7.3", + "@jupyterlab/translation": "^4.6.3", + "@jupyterlab/ui-components": "^4.6.3", + "@lumino/commands": "^2.3.3", + "@lumino/coreutils": "^2.2.2", + "@lumino/disposable": "^2.1.5", + "@lumino/messaging": "^2.0.4", + "@lumino/polling": "^2.1.5", + "@lumino/signaling": "^2.1.5", + "@lumino/widgets": "^2.8.0", + "react": "^18.2.0" + } + }, + "node_modules/@jupyterlab/filebrowser": { + "version": "4.6.3", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@jupyterlab/filebrowser/-/filebrowser-4.6.3.tgz", + "integrity": "sha1-+JH69gl1V2kbnP/XCTPy+eiWiY4=", + "license": "BSD-3-Clause", + "dependencies": { + "@jupyterlab/apputils": "^4.7.3", + "@jupyterlab/coreutils": "^6.6.3", + "@jupyterlab/docmanager": "^4.6.3", + "@jupyterlab/docregistry": "^4.6.3", + "@jupyterlab/services": "^7.6.3", + "@jupyterlab/statedb": "^4.6.3", + "@jupyterlab/statusbar": "^4.6.3", + "@jupyterlab/translation": "^4.6.3", + "@jupyterlab/ui-components": "^4.6.3", + "@lumino/algorithm": "^2.0.4", + "@lumino/coreutils": "^2.2.2", + "@lumino/disposable": "^2.1.5", + "@lumino/domutils": "^2.0.4", + "@lumino/dragdrop": "^2.1.8", + "@lumino/messaging": "^2.0.4", + "@lumino/polling": "^2.1.5", + "@lumino/signaling": "^2.1.5", + "@lumino/virtualdom": "^2.0.4", + "@lumino/widgets": "^2.8.0", + "react": "^18.2.0" + } + }, + "node_modules/@jupyterlab/launcher": { + "version": "4.6.3", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@jupyterlab/launcher/-/launcher-4.6.3.tgz", + "integrity": "sha1-X7LkKtDi+QI9MbNNmHMFWvzR4ZM=", + "license": "BSD-3-Clause", + "dependencies": { + "@jupyterlab/apputils": "^4.7.3", + "@jupyterlab/translation": "^4.6.3", + "@jupyterlab/ui-components": "^4.6.3", + "@lumino/algorithm": "^2.0.4", + "@lumino/commands": "^2.3.3", + "@lumino/coreutils": "^2.2.2", + "@lumino/disposable": "^2.1.5", + "@lumino/properties": "^2.0.4", + "@lumino/widgets": "^2.8.0", + "react": "^18.2.0" + } + }, + "node_modules/@jupyterlab/lsp": { + "version": "4.6.3", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@jupyterlab/lsp/-/lsp-4.6.3.tgz", + "integrity": "sha1-EDpMTdS85AJiXWluYMWbQ6Ezjeg=", + "license": "BSD-3-Clause", + "dependencies": { + "@jupyterlab/apputils": "^4.7.3", + "@jupyterlab/codeeditor": "^4.6.3", + "@jupyterlab/codemirror": "^4.6.3", + "@jupyterlab/coreutils": "^6.6.3", + "@jupyterlab/docregistry": "^4.6.3", + "@jupyterlab/services": "^7.6.3", + "@jupyterlab/translation": "^4.6.3", + "@lumino/coreutils": "^2.2.2", + "@lumino/disposable": "^2.1.5", + "@lumino/signaling": "^2.1.5", + "@lumino/widgets": "^2.8.0", + "lodash.mergewith": "^4.6.1", + "vscode-jsonrpc": "^8.2.0", + "vscode-languageserver-protocol": "^3.17.0", + "vscode-ws-jsonrpc": "~1.0.2" + } + }, + "node_modules/@jupyterlab/markedparser-extension": { + "version": "4.6.3", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@jupyterlab/markedparser-extension/-/markedparser-extension-4.6.3.tgz", + "integrity": "sha1-Ab1Xmr13uuZZuXHeuwaW7U+5hls=", + "license": "BSD-3-Clause", + "dependencies": { + "@jupyterlab/application": "^4.6.3", + "@jupyterlab/codemirror": "^4.6.3", + "@jupyterlab/coreutils": "^6.6.3", + "@jupyterlab/mermaid": "^4.6.3", + "@jupyterlab/rendermime": "^4.6.3", + "@lumino/coreutils": "^2.2.2", + "marked": "^17.0.6", + "marked-gfm-heading-id": "^4.1.4", + "marked-mangle": "^1.1.13" + } + }, + "node_modules/@jupyterlab/mermaid": { + "version": "4.6.3", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@jupyterlab/mermaid/-/mermaid-4.6.3.tgz", + "integrity": "sha1-N/yXKoP0hnwDcKWaRNHGLZcgJP8=", + "license": "BSD-3-Clause", + "dependencies": { + "@jupyterlab/apputils": "^4.7.3", + "@jupyterlab/coreutils": "^6.6.3", + "@jupyterlab/rendermime-interfaces": "^3.14.3", + "@lumino/coreutils": "^2.2.2", + "@lumino/widgets": "^2.8.0", + "@mermaid-js/layout-elk": "^0.2.1", + "mermaid": "^11.15.0" + } + }, + "node_modules/@jupyterlab/nbformat": { + "version": "4.6.3", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@jupyterlab/nbformat/-/nbformat-4.6.3.tgz", + "integrity": "sha1-MS6r0mxxHRU8xnQAeB3Jt6bazHs=", + "license": "BSD-3-Clause", + "dependencies": { + "@lumino/coreutils": "^2.2.2" + } + }, + "node_modules/@jupyterlab/notebook": { + "version": "4.6.3", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@jupyterlab/notebook/-/notebook-4.6.3.tgz", + "integrity": "sha1-V3qE8mehE7khSov+vcJvbW4mTO4=", + "license": "BSD-3-Clause", + "dependencies": { + "@jupyter/ydoc": "^4.0.0", + "@jupyterlab/apputils": "^4.7.3", + "@jupyterlab/cells": "^4.6.3", + "@jupyterlab/codeeditor": "^4.6.3", + "@jupyterlab/codemirror": "^4.6.3", + "@jupyterlab/coreutils": "^6.6.3", + "@jupyterlab/docregistry": "^4.6.3", + "@jupyterlab/documentsearch": "^4.6.3", + "@jupyterlab/lsp": "^4.6.3", + "@jupyterlab/markedparser-extension": "^4.6.3", + "@jupyterlab/nbformat": "^4.6.3", + "@jupyterlab/observables": "^5.6.3", + "@jupyterlab/rendermime": "^4.6.3", + "@jupyterlab/services": "^7.6.3", + "@jupyterlab/settingregistry": "^4.6.3", + "@jupyterlab/statusbar": "^4.6.3", + "@jupyterlab/toc": "^6.6.3", + "@jupyterlab/translation": "^4.6.3", + "@jupyterlab/ui-components": "^4.6.3", + "@lumino/algorithm": "^2.0.4", + "@lumino/commands": "^2.3.3", + "@lumino/coreutils": "^2.2.2", + "@lumino/disposable": "^2.1.5", + "@lumino/domutils": "^2.0.4", + "@lumino/dragdrop": "^2.1.8", + "@lumino/messaging": "^2.0.4", + "@lumino/polling": "^2.1.5", + "@lumino/properties": "^2.0.4", + "@lumino/signaling": "^2.1.5", + "@lumino/virtualdom": "^2.0.4", + "@lumino/widgets": "^2.8.0", + "react": "^18.2.0" + } + }, + "node_modules/@jupyterlab/observables": { + "version": "5.6.3", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@jupyterlab/observables/-/observables-5.6.3.tgz", + "integrity": "sha1-CRV+46sW0si3C17kAoqeCtPyd14=", + "license": "BSD-3-Clause", + "dependencies": { + "@lumino/algorithm": "^2.0.4", + "@lumino/coreutils": "^2.2.2", + "@lumino/disposable": "^2.1.5", + "@lumino/messaging": "^2.0.4", + "@lumino/signaling": "^2.1.5" + } + }, + "node_modules/@jupyterlab/outputarea": { + "version": "4.6.3", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@jupyterlab/outputarea/-/outputarea-4.6.3.tgz", + "integrity": "sha1-kNhDrLB5kkFQO/Cbw8m+O/Xl09A=", + "license": "BSD-3-Clause", + "dependencies": { + "@jupyterlab/apputils": "^4.7.3", + "@jupyterlab/nbformat": "^4.6.3", + "@jupyterlab/observables": "^5.6.3", + "@jupyterlab/rendermime": "^4.6.3", + "@jupyterlab/rendermime-interfaces": "^3.14.3", + "@jupyterlab/services": "^7.6.3", + "@jupyterlab/translation": "^4.6.3", + "@lumino/algorithm": "^2.0.4", + "@lumino/coreutils": "^2.2.2", + "@lumino/disposable": "^2.1.5", + "@lumino/messaging": "^2.0.4", + "@lumino/properties": "^2.0.4", + "@lumino/signaling": "^2.1.5", + "@lumino/widgets": "^2.8.0" + } + }, + "node_modules/@jupyterlab/rendermime": { + "version": "4.6.3", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@jupyterlab/rendermime/-/rendermime-4.6.3.tgz", + "integrity": "sha1-b0PSimtg9TjUtR9+Z3OWJ6E2E1s=", + "license": "BSD-3-Clause", + "dependencies": { + "@jupyterlab/apputils": "^4.7.3", + "@jupyterlab/coreutils": "^6.6.3", + "@jupyterlab/nbformat": "^4.6.3", + "@jupyterlab/observables": "^5.6.3", + "@jupyterlab/rendermime-interfaces": "^3.14.3", + "@jupyterlab/services": "^7.6.3", + "@jupyterlab/translation": "^4.6.3", + "@lumino/coreutils": "^2.2.2", + "@lumino/messaging": "^2.0.4", + "@lumino/signaling": "^2.1.5", + "@lumino/widgets": "^2.8.0", + "lodash.escape": "^4.0.1" + } + }, + "node_modules/@jupyterlab/rendermime-interfaces": { + "version": "3.14.3", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@jupyterlab/rendermime-interfaces/-/rendermime-interfaces-3.14.3.tgz", + "integrity": "sha1-IMtFxAtBTwVawH+gWZVzFyWji78=", + "license": "BSD-3-Clause", + "dependencies": { + "@lumino/coreutils": "^1.11.0 || ^2.2.2", + "@lumino/widgets": "^1.37.2 || ^2.8.0" + } + }, + "node_modules/@jupyterlab/services": { + "version": "7.6.3", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@jupyterlab/services/-/services-7.6.3.tgz", + "integrity": "sha1-vpus+jeX2Wi5lbC3XEobU1IoAGM=", + "license": "BSD-3-Clause", + "dependencies": { + "@jupyter/ydoc": "^4.0.0", + "@jupyterlab/coreutils": "^6.6.3", + "@jupyterlab/nbformat": "^4.6.3", + "@jupyterlab/settingregistry": "^4.6.3", + "@jupyterlab/statedb": "^4.6.3", + "@lumino/coreutils": "^2.2.2", + "@lumino/disposable": "^2.1.5", + "@lumino/polling": "^2.1.5", + "@lumino/properties": "^2.0.4", + "@lumino/signaling": "^2.1.5", + "ws": "^8.11.0" + } + }, + "node_modules/@jupyterlab/settingregistry": { + "version": "4.6.3", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@jupyterlab/settingregistry/-/settingregistry-4.6.3.tgz", + "integrity": "sha1-Mu7NldvROTVMoj+VJSJD9fpxSJ8=", + "license": "BSD-3-Clause", + "dependencies": { + "@jupyterlab/nbformat": "^4.6.3", + "@jupyterlab/statedb": "^4.6.3", + "@lumino/commands": "^2.3.3", + "@lumino/coreutils": "^2.2.2", + "@lumino/disposable": "^2.1.5", + "@lumino/signaling": "^2.1.5", + "@rjsf/utils": "^5.13.4", + "ajv": "^8.12.0", + "json5": "^2.2.3" + }, + "peerDependencies": { + "react": ">=16" + } + }, + "node_modules/@jupyterlab/statedb": { + "version": "4.6.3", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@jupyterlab/statedb/-/statedb-4.6.3.tgz", + "integrity": "sha1-1YXafvnlOcFSNkum+q8j+jtebFg=", + "license": "BSD-3-Clause", + "dependencies": { + "@lumino/commands": "^2.3.3", + "@lumino/coreutils": "^2.2.2", + "@lumino/disposable": "^2.1.5", + "@lumino/properties": "^2.0.4", + "@lumino/signaling": "^2.1.5" + } + }, + "node_modules/@jupyterlab/statusbar": { + "version": "4.6.3", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@jupyterlab/statusbar/-/statusbar-4.6.3.tgz", + "integrity": "sha1-QakFSJyVxF5iCFypDF22qPVP5CU=", + "license": "BSD-3-Clause", + "dependencies": { + "@jupyterlab/ui-components": "^4.6.3", + "@lumino/algorithm": "^2.0.4", + "@lumino/coreutils": "^2.2.2", + "@lumino/disposable": "^2.1.5", + "@lumino/messaging": "^2.0.4", + "@lumino/signaling": "^2.1.5", + "@lumino/widgets": "^2.8.0", + "react": "^18.2.0" + } + }, + "node_modules/@jupyterlab/toc": { + "version": "6.6.3", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@jupyterlab/toc/-/toc-6.6.3.tgz", + "integrity": "sha1-sJhRAUp+AxsGF2s7j6PdSzP4KL0=", + "license": "BSD-3-Clause", + "dependencies": { + "@jupyter/react-components": "^0.16.6", + "@jupyterlab/apputils": "^4.7.3", + "@jupyterlab/coreutils": "^6.6.3", + "@jupyterlab/docregistry": "^4.6.3", + "@jupyterlab/observables": "^5.6.3", + "@jupyterlab/rendermime": "^4.6.3", + "@jupyterlab/rendermime-interfaces": "^3.14.3", + "@jupyterlab/translation": "^4.6.3", + "@jupyterlab/ui-components": "^4.6.3", + "@lumino/coreutils": "^2.2.2", + "@lumino/disposable": "^2.1.5", + "@lumino/messaging": "^2.0.4", + "@lumino/signaling": "^2.1.5", + "@lumino/widgets": "^2.8.0", + "react": "^18.2.0" + } + }, + "node_modules/@jupyterlab/translation": { + "version": "4.6.3", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@jupyterlab/translation/-/translation-4.6.3.tgz", + "integrity": "sha1-eUOKaywPvqH1fn4kxgUa8PYB16I=", + "license": "BSD-3-Clause", + "dependencies": { + "@jupyterlab/coreutils": "^6.6.3", + "@jupyterlab/rendermime-interfaces": "^3.14.3", + "@jupyterlab/services": "^7.6.3", + "@jupyterlab/statedb": "^4.6.3", + "@lumino/coreutils": "^2.2.2" + } + }, + "node_modules/@jupyterlab/ui-components": { + "version": "4.6.3", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@jupyterlab/ui-components/-/ui-components-4.6.3.tgz", + "integrity": "sha1-NT5lPK0WU3rO11D1ZddgzE5w748=", + "license": "BSD-3-Clause", + "dependencies": { + "@jupyter/react-components": "^0.16.6", + "@jupyter/web-components": "^0.16.6", + "@jupyterlab/coreutils": "^6.6.3", + "@jupyterlab/observables": "^5.6.3", + "@jupyterlab/rendermime-interfaces": "^3.14.3", + "@jupyterlab/translation": "^4.6.3", + "@lumino/algorithm": "^2.0.4", + "@lumino/commands": "^2.3.3", + "@lumino/coreutils": "^2.2.2", + "@lumino/disposable": "^2.1.5", + "@lumino/messaging": "^2.0.4", + "@lumino/polling": "^2.1.5", + "@lumino/properties": "^2.0.4", + "@lumino/signaling": "^2.1.5", + "@lumino/virtualdom": "^2.0.4", + "@lumino/widgets": "^2.8.0", + "@rjsf/core": "^5.13.4", + "@rjsf/utils": "^5.13.4", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "typestyle": "^2.0.4" + }, + "peerDependencies": { + "react": "^18.2.0" + } + }, + "node_modules/@lezer/common": { + "version": "1.5.2", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@lezer/common/-/common-1.5.2.tgz", + "integrity": "sha1-1oQNsTd54/G0LnDJqXxAhtEvriI=", + "license": "MIT" + }, + "node_modules/@lezer/cpp": { + "version": "1.1.6", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@lezer/cpp/-/cpp-1.1.6.tgz", + "integrity": "sha1-RAjGbwzk+0d1mjuD2/3XgKSTFao=", + "license": "MIT", + "dependencies": { + "@lezer/common": "^1.2.0", + "@lezer/highlight": "^1.0.0", + "@lezer/lr": "^1.0.0" + } + }, + "node_modules/@lezer/css": { + "version": "1.3.6", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@lezer/css/-/css-1.3.6.tgz", + "integrity": "sha1-LNrltTK+qlzx59zLkY2LGQtsbRQ=", + "license": "MIT", + "dependencies": { + "@lezer/common": "^1.2.0", + "@lezer/highlight": "^1.0.0", + "@lezer/lr": "^1.3.0" + } + }, + "node_modules/@lezer/generator": { + "version": "1.8.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@lezer/generator/-/generator-1.8.0.tgz", + "integrity": "sha1-dZN9mlZFIYeWDMgHZQO9uBvKw1c=", + "license": "MIT", + "dependencies": { + "@lezer/common": "^1.1.0", + "@lezer/lr": "^1.3.0" + }, + "bin": { + "lezer-generator": "src/lezer-generator.cjs" + } + }, + "node_modules/@lezer/highlight": { + "version": "1.2.3", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@lezer/highlight/-/highlight-1.2.3.tgz", + "integrity": "sha1-og8yS3EUii6pum/0Lli7+uxwKFc=", + "license": "MIT", + "dependencies": { + "@lezer/common": "^1.3.0" + } + }, + "node_modules/@lezer/html": { + "version": "1.3.13", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@lezer/html/-/html-1.3.13.tgz", + "integrity": "sha1-ahMFrjvSycAfh3+KjcHhXsZS0Bw=", + "license": "MIT", + "dependencies": { + "@lezer/common": "^1.2.0", + "@lezer/highlight": "^1.0.0", + "@lezer/lr": "^1.0.0" + } + }, + "node_modules/@lezer/java": { + "version": "1.1.4", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@lezer/java/-/java-1.1.4.tgz", + "integrity": "sha1-xXCIj6xCgzQf0rCmobi90BteuXw=", + "license": "MIT", + "dependencies": { + "@lezer/common": "^1.2.0", + "@lezer/highlight": "^1.0.0", + "@lezer/lr": "^1.0.0" + } + }, + "node_modules/@lezer/javascript": { + "version": "1.5.4", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@lezer/javascript/-/javascript-1.5.4.tgz", + "integrity": "sha1-EXRpVflX0zwJM/F9dZTbVKi0vuo=", + "license": "MIT", + "dependencies": { + "@lezer/common": "^1.2.0", + "@lezer/highlight": "^1.1.3", + "@lezer/lr": "^1.3.0" + } + }, + "node_modules/@lezer/json": { + "version": "1.0.3", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@lezer/json/-/json-1.0.3.tgz", + "integrity": "sha1-53OgEq0AiPvwfOSc+6h1zJ5bwF8=", + "license": "MIT", + "dependencies": { + "@lezer/common": "^1.2.0", + "@lezer/highlight": "^1.0.0", + "@lezer/lr": "^1.0.0" + } + }, + "node_modules/@lezer/lr": { + "version": "1.4.10", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@lezer/lr/-/lr-1.4.10.tgz", + "integrity": "sha1-s6zDblrQSbdN23cZWU5+dNkWH/U=", + "license": "MIT", + "dependencies": { + "@lezer/common": "^1.0.0" + } + }, + "node_modules/@lezer/markdown": { + "version": "1.7.2", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@lezer/markdown/-/markdown-1.7.2.tgz", + "integrity": "sha1-3+AkmBPcj6pgtGWaTKK42m3K91M=", + "license": "MIT", + "dependencies": { + "@lezer/common": "^1.5.0", + "@lezer/highlight": "^1.0.0" + } + }, + "node_modules/@lezer/php": { + "version": "1.0.6", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@lezer/php/-/php-1.0.6.tgz", + "integrity": "sha1-mltB90Becr7sfLPlEepKuRlt+yA=", + "license": "MIT", + "dependencies": { + "@lezer/common": "^1.2.0", + "@lezer/highlight": "^1.0.0", + "@lezer/lr": "^1.1.0" + } + }, + "node_modules/@lezer/python": { + "version": "1.1.19", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@lezer/python/-/python-1.1.19.tgz", + "integrity": "sha1-eEPUT/J8mAQ5qC6HwYsoFy6FxHg=", + "license": "MIT", + "dependencies": { + "@lezer/common": "^1.2.0", + "@lezer/highlight": "^1.0.0", + "@lezer/lr": "^1.0.0" + } + }, + "node_modules/@lezer/rust": { + "version": "1.0.2", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@lezer/rust/-/rust-1.0.2.tgz", + "integrity": "sha1-zJp1YF1nGCoOeZrECxllph3MbvA=", + "license": "MIT", + "dependencies": { + "@lezer/common": "^1.2.0", + "@lezer/highlight": "^1.0.0", + "@lezer/lr": "^1.0.0" + } + }, + "node_modules/@lezer/xml": { + "version": "1.0.6", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@lezer/xml/-/xml-1.0.6.tgz", + "integrity": "sha1-kIwgOSMoj4VOuOL02bBsQ36GELk=", + "license": "MIT", + "dependencies": { + "@lezer/common": "^1.2.0", + "@lezer/highlight": "^1.0.0", + "@lezer/lr": "^1.0.0" + } + }, + "node_modules/@lumino/algorithm": { + "version": "2.0.5", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@lumino/algorithm/-/algorithm-2.0.5.tgz", + "integrity": "sha1-FHG0iaOjVIOLzwp86CixCypdBdc=", + "license": "BSD-3-Clause" + }, + "node_modules/@lumino/application": { + "version": "2.4.10", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@lumino/application/-/application-2.4.10.tgz", + "integrity": "sha1-Cs22xkPvQ1WqMffQDg098Ztq/fE=", + "license": "BSD-3-Clause", + "dependencies": { + "@lumino/commands": "^2.3.4", + "@lumino/coreutils": "^2.2.3", + "@lumino/widgets": "^2.9.0" + } + }, + "node_modules/@lumino/collections": { + "version": "2.0.5", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@lumino/collections/-/collections-2.0.5.tgz", + "integrity": "sha1-2TnYEL/BgRCAkNwiGDVnMJ0jLfE=", + "license": "BSD-3-Clause", + "dependencies": { + "@lumino/algorithm": "^2.0.5" + } + }, + "node_modules/@lumino/commands": { + "version": "2.3.4", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@lumino/commands/-/commands-2.3.4.tgz", + "integrity": "sha1-YkAVzbQpQnekdNqoRbN294QvHV4=", + "license": "BSD-3-Clause", + "dependencies": { + "@lumino/algorithm": "^2.0.5", + "@lumino/coreutils": "^2.2.3", + "@lumino/disposable": "^2.1.6", + "@lumino/domutils": "^2.0.5", + "@lumino/keyboard": "^2.0.5", + "@lumino/signaling": "^2.1.6", + "@lumino/virtualdom": "^2.0.5" + } + }, + "node_modules/@lumino/coreutils": { + "version": "2.2.3", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@lumino/coreutils/-/coreutils-2.2.3.tgz", + "integrity": "sha1-gWicGzhtVGMPiahXeZWVYOTCK/A=", + "license": "BSD-3-Clause", + "dependencies": { + "@lumino/algorithm": "^2.0.5" + } + }, + "node_modules/@lumino/disposable": { + "version": "2.1.6", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@lumino/disposable/-/disposable-2.1.6.tgz", + "integrity": "sha1-MvPRhK0A0coZlKgKmUk/7nZNQkk=", + "license": "BSD-3-Clause", + "dependencies": { + "@lumino/signaling": "^2.1.6" + } + }, + "node_modules/@lumino/domutils": { + "version": "2.0.5", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@lumino/domutils/-/domutils-2.0.5.tgz", + "integrity": "sha1-xViX/2uXqI5Ach+m53NvazLj39E=", + "license": "BSD-3-Clause" + }, + "node_modules/@lumino/dragdrop": { + "version": "2.1.9", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@lumino/dragdrop/-/dragdrop-2.1.9.tgz", + "integrity": "sha1-iI+/Z3RpjfemraP7y8d/B8xh55I=", + "license": "BSD-3-Clause", + "dependencies": { + "@lumino/coreutils": "^2.2.3", + "@lumino/disposable": "^2.1.6" + } + }, + "node_modules/@lumino/keyboard": { + "version": "2.0.5", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@lumino/keyboard/-/keyboard-2.0.5.tgz", + "integrity": "sha1-xAEPDkF4oUOd51xUcvSpj1O5koU=", + "license": "BSD-3-Clause" + }, + "node_modules/@lumino/messaging": { + "version": "2.0.5", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@lumino/messaging/-/messaging-2.0.5.tgz", + "integrity": "sha1-qVzvffGPScRdavKgiphvR5YS36g=", + "license": "BSD-3-Clause", + "dependencies": { + "@lumino/algorithm": "^2.0.5", + "@lumino/collections": "^2.0.5" + } + }, + "node_modules/@lumino/polling": { + "version": "2.1.6", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@lumino/polling/-/polling-2.1.6.tgz", + "integrity": "sha1-vrxwOvNBAt69U65ukSfloWl7kh0=", + "license": "BSD-3-Clause", + "dependencies": { + "@lumino/coreutils": "^2.2.3", + "@lumino/disposable": "^2.1.6", + "@lumino/signaling": "^2.1.6" + } + }, + "node_modules/@lumino/properties": { + "version": "2.0.5", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@lumino/properties/-/properties-2.0.5.tgz", + "integrity": "sha1-IRyi+6u/gxo35OA88JOMmBEpVKs=", + "license": "BSD-3-Clause" + }, + "node_modules/@lumino/signaling": { + "version": "2.1.6", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@lumino/signaling/-/signaling-2.1.6.tgz", + "integrity": "sha1-vfkJ2fbBplphDbq0h9R9Nl6dTj8=", + "license": "BSD-3-Clause", + "dependencies": { + "@lumino/algorithm": "^2.0.5", + "@lumino/coreutils": "^2.2.3" + } + }, + "node_modules/@lumino/virtualdom": { + "version": "2.0.5", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@lumino/virtualdom/-/virtualdom-2.0.5.tgz", + "integrity": "sha1-jnnF/i8M//en892xxe4kS3ZRsB4=", + "license": "BSD-3-Clause", + "dependencies": { + "@lumino/algorithm": "^2.0.5" + } + }, + "node_modules/@lumino/widgets": { + "version": "2.9.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@lumino/widgets/-/widgets-2.9.0.tgz", + "integrity": "sha1-EKCBA0UKYNRLTxV1Lp7pOK81oZg=", + "license": "BSD-3-Clause", + "dependencies": { + "@lumino/algorithm": "^2.0.5", + "@lumino/commands": "^2.3.4", + "@lumino/coreutils": "^2.2.3", + "@lumino/disposable": "^2.1.6", + "@lumino/domutils": "^2.0.5", + "@lumino/dragdrop": "^2.1.9", + "@lumino/keyboard": "^2.0.5", + "@lumino/messaging": "^2.0.5", + "@lumino/properties": "^2.0.5", + "@lumino/signaling": "^2.1.6", + "@lumino/virtualdom": "^2.0.5" + } + }, + "node_modules/@marijn/find-cluster-break": { + "version": "1.0.4", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@marijn/find-cluster-break/-/find-cluster-break-1.0.4.tgz", + "integrity": "sha1-QsKuphzaMHzbE0dER5JFLXtdv7Q=", + "license": "MIT" + }, + "node_modules/@mermaid-js/layout-elk": { + "version": "0.2.3", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@mermaid-js/layout-elk/-/layout-elk-0.2.3.tgz", + "integrity": "sha1-BlyZsEaCClRlcHDZH60VatEewPc=", + "license": "MIT", + "dependencies": { + "d3": "^7.9.0", + "elkjs": "^0.9.3" + }, + "peerDependencies": { + "mermaid": "^11.0.2" + } + }, + "node_modules/@mermaid-js/parser": { + "version": "1.2.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@mermaid-js/parser/-/parser-1.2.1.tgz", + "integrity": "sha1-lMxAQWE3uxDSvBsKScYj1xbnYjM=", + "license": "MIT", + "dependencies": { + "@chevrotain/types": "~11.1.2" + } + }, + "node_modules/@microsoft/fast-colors": { + "version": "5.3.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@microsoft/fast-colors/-/fast-colors-5.3.1.tgz", + "integrity": "sha1-3vxZh0F25CMWvn5tJMMYherYylY=", + "license": "MIT" + }, + "node_modules/@microsoft/fast-element": { + "version": "1.14.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@microsoft/fast-element/-/fast-element-1.14.0.tgz", + "integrity": "sha1-ZSKxbVV4hkOwRBP6sCBeXpuk1ck=", + "license": "MIT" + }, + "node_modules/@microsoft/fast-foundation": { + "version": "2.50.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@microsoft/fast-foundation/-/fast-foundation-2.50.0.tgz", + "integrity": "sha1-YGdlYd9c6LrQYOS3/refjc6VJDE=", + "license": "MIT", + "dependencies": { + "@microsoft/fast-element": "^1.14.0", + "@microsoft/fast-web-utilities": "^5.4.1", + "tabbable": "^5.2.0", + "tslib": "^1.13.0" + } + }, + "node_modules/@microsoft/fast-web-utilities": { + "version": "5.4.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@microsoft/fast-web-utilities/-/fast-web-utilities-5.4.1.tgz", + "integrity": "sha1-jjCC7i/ytUZ/F+fLH7AbDkkGtx8=", + "license": "MIT", + "dependencies": { + "exenv-es6": "^1.1.1" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha1-p36nQvqyV3UUVDTrHSMoz1ATrDM=", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@rjsf/core": { + "version": "5.24.13", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@rjsf/core/-/core-5.24.13.tgz", + "integrity": "sha1-75jl3GrAZLK+L1bgiHyZ3ysfjUQ=", + "license": "Apache-2.0", + "dependencies": { + "lodash": "^4.17.21", + "lodash-es": "^4.17.21", + "markdown-to-jsx": "^7.4.1", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@rjsf/utils": "^5.24.x", + "react": "^16.14.0 || >=17" + } + }, + "node_modules/@rjsf/utils": { + "version": "5.24.13", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@rjsf/utils/-/utils-5.24.13.tgz", + "integrity": "sha1-sZykNL9RjsPmUsSgUQspP/X6wnk=", + "license": "Apache-2.0", + "dependencies": { + "json-schema-merge-allof": "^0.8.1", + "jsonpointer": "^5.0.1", + "lodash": "^4.17.21", + "lodash-es": "^4.17.21", + "react-is": "^18.2.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "react": "^16.14.0 || >=17" + } + }, + "node_modules/@types/d3": { + "version": "7.4.3", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@types/d3/-/d3-7.4.3.tgz", + "integrity": "sha1-1FUKhdCPSXj68KTDa4SMYeqsB+I=", + "license": "MIT", + "dependencies": { + "@types/d3-array": "*", + "@types/d3-axis": "*", + "@types/d3-brush": "*", + "@types/d3-chord": "*", + "@types/d3-color": "*", + "@types/d3-contour": "*", + "@types/d3-delaunay": "*", + "@types/d3-dispatch": "*", + "@types/d3-drag": "*", + "@types/d3-dsv": "*", + "@types/d3-ease": "*", + "@types/d3-fetch": "*", + "@types/d3-force": "*", + "@types/d3-format": "*", + "@types/d3-geo": "*", + "@types/d3-hierarchy": "*", + "@types/d3-interpolate": "*", + "@types/d3-path": "*", + "@types/d3-polygon": "*", + "@types/d3-quadtree": "*", + "@types/d3-random": "*", + "@types/d3-scale": "*", + "@types/d3-scale-chromatic": "*", + "@types/d3-selection": "*", + "@types/d3-shape": "*", + "@types/d3-time": "*", + "@types/d3-time-format": "*", + "@types/d3-timer": "*", + "@types/d3-transition": "*", + "@types/d3-zoom": "*" + } + }, + "node_modules/@types/d3-array": { + "version": "3.2.2", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@types/d3-array/-/d3-array-3.2.2.tgz", + "integrity": "sha1-4CFRRk0C1KG0RkbQ/NuT+viP3ow=", + "license": "MIT" + }, + "node_modules/@types/d3-axis": { + "version": "3.0.6", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@types/d3-axis/-/d3-axis-3.0.6.tgz", + "integrity": "sha1-52DldluBiLHe+jK8i7YGL4Hkx5U=", + "license": "MIT", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-brush": { + "version": "3.0.6", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@types/d3-brush/-/d3-brush-3.0.6.tgz", + "integrity": "sha1-wvQ2KwRdRy4bGGzb7DKbpSva7mw=", + "license": "MIT", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-chord": { + "version": "3.0.6", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@types/d3-chord/-/d3-chord-3.0.6.tgz", + "integrity": "sha1-FwbKQM9+pZoK3Y9EVu//j4d1eT0=", + "license": "MIT" + }, + "node_modules/@types/d3-color": { + "version": "3.1.3", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@types/d3-color/-/d3-color-3.1.3.tgz", + "integrity": "sha1-NoyWGhjech2oIA6AvzlD+1MTavI=", + "license": "MIT" + }, + "node_modules/@types/d3-contour": { + "version": "3.0.6", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@types/d3-contour/-/d3-contour-3.0.6.tgz", + "integrity": "sha1-mto/qcTQDjpQk/7QNWx6uSlgQjE=", + "license": "MIT", + "dependencies": { + "@types/d3-array": "*", + "@types/geojson": "*" + } + }, + "node_modules/@types/d3-delaunay": { + "version": "6.0.4", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@types/d3-delaunay/-/d3-delaunay-6.0.4.tgz", + "integrity": "sha1-GFwagMyAf92io/6WD3wRxKJ5UuE=", + "license": "MIT" + }, + "node_modules/@types/d3-dispatch": { + "version": "3.0.7", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@types/d3-dispatch/-/d3-dispatch-3.0.7.tgz", + "integrity": "sha1-7wBNihKARs/OQ00XGC+DTkTvlbI=", + "license": "MIT" + }, + "node_modules/@types/d3-drag": { + "version": "3.0.7", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@types/d3-drag/-/d3-drag-3.0.7.tgz", + "integrity": "sha1-sTq6iyRCtAaMmp5tHYL4vOp3/AI=", + "license": "MIT", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-dsv": { + "version": "3.0.7", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@types/d3-dsv/-/d3-dsv-3.0.7.tgz", + "integrity": "sha1-CjUfmW3Jmzf0+li0ksLRwE49rBc=", + "license": "MIT" + }, + "node_modules/@types/d3-ease": { + "version": "3.0.2", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@types/d3-ease/-/d3-ease-3.0.2.tgz", + "integrity": "sha1-4o2xv7+mFwdvd3DdHZpI6qO2xRs=", + "license": "MIT" + }, + "node_modules/@types/d3-fetch": { + "version": "3.0.7", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@types/d3-fetch/-/d3-fetch-3.0.7.tgz", + "integrity": "sha1-wEorTyMYGqN28wrwKD28eztWmYA=", + "license": "MIT", + "dependencies": { + "@types/d3-dsv": "*" + } + }, + "node_modules/@types/d3-force": { + "version": "3.0.10", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@types/d3-force/-/d3-force-3.0.10.tgz", + "integrity": "sha1-bcj8bh81cE87BXCQvu63rGdL/xo=", + "license": "MIT" + }, + "node_modules/@types/d3-format": { + "version": "3.0.4", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@types/d3-format/-/d3-format-3.0.4.tgz", + "integrity": "sha1-seRGVkTds/3zomP+uyQKbNYW3pA=", + "license": "MIT" + }, + "node_modules/@types/d3-geo": { + "version": "3.1.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@types/d3-geo/-/d3-geo-3.1.1.tgz", + "integrity": "sha1-nig68XlgHFSVgWALP+wllBkRMp0=", + "license": "MIT", + "dependencies": { + "@types/geojson": "*" + } + }, + "node_modules/@types/d3-hierarchy": { + "version": "3.1.7", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@types/d3-hierarchy/-/d3-hierarchy-3.1.7.tgz", + "integrity": "sha1-YCP7Oy1GMiny1oD5rEtHRm9x8Xs=", + "license": "MIT" + }, + "node_modules/@types/d3-interpolate": { + "version": "3.0.4", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz", + "integrity": "sha1-QSuQ6EhwKF8v+KhGxutgNE8SpBw=", + "license": "MIT", + "dependencies": { + "@types/d3-color": "*" + } + }, + "node_modules/@types/d3-path": { + "version": "3.1.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@types/d3-path/-/d3-path-3.1.1.tgz", + "integrity": "sha1-9jKzgMOsoduo40qgSbzWpK8j34o=", + "license": "MIT" + }, + "node_modules/@types/d3-polygon": { + "version": "3.0.2", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@types/d3-polygon/-/d3-polygon-3.0.2.tgz", + "integrity": "sha1-365UptNdGedqyVZbyzKo5UaTGJw=", + "license": "MIT" + }, + "node_modules/@types/d3-quadtree": { + "version": "3.0.6", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@types/d3-quadtree/-/d3-quadtree-3.0.6.tgz", + "integrity": "sha1-1HQLD+NbHFi2bhSI9OftApUvVw8=", + "license": "MIT" + }, + "node_modules/@types/d3-random": { + "version": "3.0.4", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@types/d3-random/-/d3-random-3.0.4.tgz", + "integrity": "sha1-a9NoO4My/A8B5wWbdja8XH7eczc=", + "license": "MIT" + }, + "node_modules/@types/d3-scale": { + "version": "4.0.9", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@types/d3-scale/-/d3-scale-4.0.9.tgz", + "integrity": "sha1-V6L3ByQub+Hega17/Myq9gYXmvs=", + "license": "MIT", + "dependencies": { + "@types/d3-time": "*" + } + }, + "node_modules/@types/d3-scale-chromatic": { + "version": "3.1.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz", + "integrity": "sha1-3G1Pmpg3bxjqULrWw5U38bVGPDk=", + "license": "MIT" + }, + "node_modules/@types/d3-selection": { + "version": "3.0.11", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@types/d3-selection/-/d3-selection-3.0.11.tgz", + "integrity": "sha1-vXpF/AqMMWemMWdeYbwsorBY1KM=", + "license": "MIT" + }, + "node_modules/@types/d3-shape": { + "version": "3.2.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@types/d3-shape/-/d3-shape-3.2.0.tgz", + "integrity": "sha1-Zv80IBHcJDxsIOa4mVI9FIrKQS0=", + "license": "MIT", + "dependencies": { + "@types/d3-path": "*" + } + }, + "node_modules/@types/d3-time": { + "version": "3.0.4", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@types/d3-time/-/d3-time-3.0.4.tgz", + "integrity": "sha1-hHL+7NY5aRRQ3YAA6zPt1EThMj8=", + "license": "MIT" + }, + "node_modules/@types/d3-time-format": { + "version": "4.0.3", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@types/d3-time-format/-/d3-time-format-4.0.3.tgz", + "integrity": "sha1-1rwea2p9tpzM+73Uw0twYy2enbI=", + "license": "MIT" + }, + "node_modules/@types/d3-timer": { + "version": "3.0.2", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@types/d3-timer/-/d3-timer-3.0.2.tgz", + "integrity": "sha1-cLvad9wjqnJ0E+IuIUr6Pw6FL3A=", + "license": "MIT" + }, + "node_modules/@types/d3-transition": { + "version": "3.0.9", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@types/d3-transition/-/d3-transition-3.0.9.tgz", + "integrity": "sha1-ETa8V+nds8OQ3MybX/O30rjZRwY=", + "license": "MIT", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-zoom": { + "version": "3.0.8", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@types/d3-zoom/-/d3-zoom-3.0.8.tgz", + "integrity": "sha1-3Msy0cVrHhxuDxGA2ZSJbwOLxAs=", + "license": "MIT", + "dependencies": { + "@types/d3-interpolate": "*", + "@types/d3-selection": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.9", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha1-zz8Oh2177hWpOrkluCv1cKOQSiQ=", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/geojson": { + "version": "7946.0.16", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@types/geojson/-/geojson-7946.0.16.tgz", + "integrity": "sha1-jr5T1p762nBERU4zBcGQF9l87So=", + "license": "MIT" + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha1-WWoXRyM2lNUPatinhp/Lb1bPWEE=", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "26.5.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@types/node/-/node-26.5.1.tgz", + "integrity": "sha1-sZw5DhWBP0AqlLhuOvkEL3khOL4=", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~8.9.0" + } + }, + "node_modules/@types/prop-types": { + "version": "15.7.15", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@types/prop-types/-/prop-types-15.7.15.tgz", + "integrity": "sha1-5uWobWAr6spxzlFj+t9fldcJMcc=", + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "18.3.31", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@types/react/-/react-18.3.31.tgz", + "integrity": "sha1-teleKP/M6rjZgvM/LrB24XZTwqQ=", + "license": "MIT", + "dependencies": { + "@types/prop-types": "*", + "csstype": "^3.2.2" + } + }, + "node_modules/@types/react-dom": { + "version": "18.3.7", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@types/react-dom/-/react-dom-18.3.7.tgz", + "integrity": "sha1-uJ3fLNg7T+r8xOLqQa/fuVoNGU8=", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^18.0.0" + } + }, + "node_modules/@types/trusted-types": { + "version": "2.0.7", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@types/trusted-types/-/trusted-types-2.0.7.tgz", + "integrity": "sha1-usywepcLkXB986PoumiWxX6tLRE=", + "license": "MIT", + "optional": true + }, + "node_modules/@upsetjs/venn.js": { + "version": "2.0.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@upsetjs/venn.js/-/venn.js-2.0.0.tgz", + "integrity": "sha1-O+GSA4zdqSeqT4siq1Gvgqv0fzQ=", + "license": "MIT", + "optionalDependencies": { + "d3-selection": "^3.0.0", + "d3-transition": "^3.0.1" + } + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.14.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@webassemblyjs/ast/-/ast-1.14.1.tgz", + "integrity": "sha1-qfagfysDyVyNOMRTah/ftSH/VbY=", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/helper-numbers": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.13.2", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", + "integrity": "sha1-/Moe7dscxOe27tT8eVbWgTshufs=", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.13.2", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", + "integrity": "sha1-4KFhUiSLw42u523X4h8Vxe86sec=", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.14.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", + "integrity": "sha1-giqbxgMWZTH31d+E5ntb+ZtyuWs=", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.13.2", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", + "integrity": "sha1-29kyVI5xGfS4p4d/1ajSDmNJCy0=", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.13.2", + "@webassemblyjs/helper-api-error": "1.13.2", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.13.2", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", + "integrity": "sha1-5VYQh1j0SKroTIUOWTzhig6zHgs=", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.14.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", + "integrity": "sha1-lindqcRDDqtUtZEFPW3G87oFA0g=", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/wasm-gen": "1.14.1" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.13.2", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", + "integrity": "sha1-HF6qzh1gatosf9cEXqk1bFnuDbo=", + "dev": true, + "license": "MIT", + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.13.2", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", + "integrity": "sha1-V8XD3rAQXQLOJfo/109OvJ/Qu7A=", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.13.2", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", + "integrity": "sha1-kXog6T9xrVYClmwtaFrgxsIfYPE=", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.14.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", + "integrity": "sha1-rGaJ9QIhm1kZjd7ELc1JaxAE1Zc=", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/helper-wasm-section": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-opt": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1", + "@webassemblyjs/wast-printer": "1.14.1" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.14.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", + "integrity": "sha1-mR5/DAkMsLtiu6yIIHbj0hnalXA=", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.14.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", + "integrity": "sha1-5vce18yuRngcIGAX08FMUO+oEGs=", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.14.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", + "integrity": "sha1-s+E/GJNgXKeLUsaOVM9qhl+Qufs=", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-api-error": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.14.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", + "integrity": "sha1-O7PpY4qK5f2vlhDnoGtNn5qm/gc=", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webpack-cli/configtest": { + "version": "2.1.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@webpack-cli/configtest/-/configtest-2.1.1.tgz", + "integrity": "sha1-Oy+FLpHaxuO4X7KjFPuL70bZRkY=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.15.0" + }, + "peerDependencies": { + "webpack": "5.x.x", + "webpack-cli": "5.x.x" + } + }, + "node_modules/@webpack-cli/info": { + "version": "2.0.2", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@webpack-cli/info/-/info-2.0.2.tgz", + "integrity": "sha1-zD+/Iu/riP9iMQz4hcWwn0SuD90=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.15.0" + }, + "peerDependencies": { + "webpack": "5.x.x", + "webpack-cli": "5.x.x" + } + }, + "node_modules/@webpack-cli/serve": { + "version": "2.0.5", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@webpack-cli/serve/-/serve-2.0.5.tgz", + "integrity": "sha1-Ml20I5XNSf5sFAV/mpAOQn34gQ4=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.15.0" + }, + "peerDependencies": { + "webpack": "5.x.x", + "webpack-cli": "5.x.x" + }, + "peerDependenciesMeta": { + "webpack-dev-server": { + "optional": true + } + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha1-7vAUoxRa5Hehy8AM0eVSM23Ot5A=", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha1-0pHGpOl5ibXGHZrPOWrk/hM6cY0=", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/abab": { + "version": "2.0.6", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/abab/-/abab-2.0.6.tgz", + "integrity": "sha1-QbgPLIcdGWhiFrgjCSMc/Tyz0pE=", + "deprecated": "Use your platform's native atob() and btoa() methods instead", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/acorn": { + "version": "8.18.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/acorn/-/acorn-8.18.0.tgz", + "integrity": "sha1-T68BstbTJr/u2XrqH1IiC19MGUA=", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/ajv": { + "version": "8.20.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/ajv/-/ajv-8.20.0.tgz", + "integrity": "sha1-MEs2Nq3Yi6fZNnYN1Q7OAG3qlfk=", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats": { + "version": "3.0.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/ajv-formats/-/ajv-formats-3.0.1.tgz", + "integrity": "sha1-PV3HYryhdnnDwup+kK1rdTIwlXg=", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha1-adTThaRzPNvqtElkoRcKiPh/DhY=", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/ansi-regex": { + "version": "6.3.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/ansi-regex/-/ansi-regex-6.3.0.tgz", + "integrity": "sha1-JHyOe3ChpDsQzhTAIm/L9Y6IFdU=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha1-QfuyAkPlCxK+DwS43tvwdSDOhB0=", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha1-6D46fj8wCzTLnYf2FfoMvzV2kO4=", + "dev": true, + "license": "MIT" + }, + "node_modules/baseline-browser-mapping": { + "version": "2.11.23", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/baseline-browser-mapping/-/baseline-browser-mapping-2.11.23.tgz", + "integrity": "sha512-le521dGVfxM7yRX0EikCoSz+rOK+hHzdDt/E7mG1jOJB/6WAAUuwVroLwaB7ApaUsz5Q0kFlDXLSA9MheUIfRQ==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/big.js": { + "version": "5.2.2", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha1-ZfCvOC9Xi83HQr2cKB6cstd2gyg=", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.18", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/brace-expansion/-/brace-expansion-1.1.18.tgz", + "integrity": "sha1-POdNiYhRNr4VNTQfjD1EJcKaXKs=", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/browserslist": { + "version": "4.28.9", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/browserslist/-/browserslist-4.28.9.tgz", + "integrity": "sha1-B85rRJuQr4gOub+3zTk3LMT3HIw=", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.11.20", + "caniuse-lite": "^1.0.30001810", + "electron-to-chromium": "^1.5.420", + "node-releases": "^2.0.54", + "update-browserslist-db": "^1.3.2" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha1-KxRqb9cugLT1XSVfNe1Zo6mkG9U=", + "dev": true, + "license": "MIT" + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001810", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/caniuse-lite/-/caniuse-lite-1.0.30001810.tgz", + "integrity": "sha1-SXC0d96jJ4N03pvEOqj105/DzaI=", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha1-zUJUFnelQzPPVBpJEIwUMrRMlCQ=", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chalk/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/chalk/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha1-4uaaRKyHcveKHsCzW2id9lMO/I8=", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chrome-trace-event": { + "version": "1.0.4", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", + "integrity": "sha1-Bb/9f/koRlCTMUcIyTvfqb0fD1s=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0" + } + }, + "node_modules/clone-deep": { + "version": "4.0.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha1-wZ/Zvbv4WUK0/ZechNz31fB8I4c=", + "dev": true, + "license": "MIT", + "dependencies": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/clone-deep/node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha1-LBY7P6+xtgbZ0Xko8FwqHDjgdnc=", + "dev": true, + "license": "MIT", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha1-u3GFBpDh8TZWfeYp0tVHHe2kweg=", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true, + "license": "MIT" + }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha1-nreT5oMwZ/cjWQL807CZF6AAqVo=", + "dev": true, + "license": "MIT" + }, + "node_modules/commander": { + "version": "9.5.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/commander/-/commander-9.5.0.tgz", + "integrity": "sha1-vAjR61zt98y3l6lhmdQce8PmDTA=", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || >=14" + } + }, + "node_modules/compute-gcd": { + "version": "1.2.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/compute-gcd/-/compute-gcd-1.2.1.tgz", + "integrity": "sha1-NNY584JWJeE1fOgfDkVqYknYx38=", + "dependencies": { + "validate.io-array": "^1.0.3", + "validate.io-function": "^1.0.2", + "validate.io-integer-array": "^1.0.0" + } + }, + "node_modules/compute-lcm": { + "version": "1.1.2", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/compute-lcm/-/compute-lcm-1.1.2.tgz", + "integrity": "sha1-kQfGa53KKM77IrSrRUXKrEA0ryM=", + "dependencies": { + "compute-gcd": "^1.2.1", + "validate.io-array": "^1.0.3", + "validate.io-function": "^1.0.2", + "validate.io-integer-array": "^1.0.0" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true, + "license": "MIT" + }, + "node_modules/cose-base": { + "version": "1.0.3", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/cose-base/-/cose-base-1.0.3.tgz", + "integrity": "sha1-ZQM0tBuGlXilQzWLgM2n4Kvgpgo=", + "license": "MIT", + "dependencies": { + "layout-base": "^1.0.0" + } + }, + "node_modules/crelt": { + "version": "1.0.7", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/crelt/-/crelt-1.0.7.tgz", + "integrity": "sha1-O0QbLd+nMWHWoncKpM1nf4leryg=", + "license": "MIT" + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha1-ilj+ePANzXDDcEUXWd+/rwPo7p8=", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/css-loader": { + "version": "6.11.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/css-loader/-/css-loader-6.11.0.tgz", + "integrity": "sha1-M7rjv2Nj0KfCz5AxyWx0T/VNhbo=", + "dev": true, + "license": "MIT", + "dependencies": { + "icss-utils": "^5.1.0", + "postcss": "^8.4.33", + "postcss-modules-extract-imports": "^3.1.0", + "postcss-modules-local-by-default": "^4.0.5", + "postcss-modules-scope": "^3.2.0", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha1-N3QZGZA7hoVl4cCep0dEXNGJg+4=", + "dev": true, + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha1-7EjA8+mT5QZIyG2lWeJhCZXPmJo=", + "license": "MIT" + }, + "node_modules/cytoscape": { + "version": "3.34.3", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/cytoscape/-/cytoscape-3.34.3.tgz", + "integrity": "sha1-FQOZa6C1m5AdhjEKH2EuktxGT1E=", + "license": "MIT", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/cytoscape-cose-bilkent": { + "version": "4.1.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/cytoscape-cose-bilkent/-/cytoscape-cose-bilkent-4.1.0.tgz", + "integrity": "sha1-di+hId+ZMP/rUaSV2HkXxXCsIJs=", + "license": "MIT", + "dependencies": { + "cose-base": "^1.0.0" + }, + "peerDependencies": { + "cytoscape": "^3.2.0" + } + }, + "node_modules/cytoscape-fcose": { + "version": "2.2.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/cytoscape-fcose/-/cytoscape-fcose-2.2.0.tgz", + "integrity": "sha1-5Nb2SQ30+rWK6c6p5cOrjXRy9HE=", + "license": "MIT", + "dependencies": { + "cose-base": "^2.2.0" + }, + "peerDependencies": { + "cytoscape": "^3.2.0" + } + }, + "node_modules/cytoscape-fcose/node_modules/cose-base": { + "version": "2.2.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/cose-base/-/cose-base-2.2.0.tgz", + "integrity": "sha1-HDlcNbbhC7g/l2nKi4F9YUrdXAE=", + "license": "MIT", + "dependencies": { + "layout-base": "^2.0.0" + } + }, + "node_modules/cytoscape-fcose/node_modules/layout-base": { + "version": "2.0.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/layout-base/-/layout-base-2.0.1.tgz", + "integrity": "sha1-0DN5E1hskPnCwHUpIGn1wtpd0oU=", + "license": "MIT" + }, + "node_modules/d3": { + "version": "7.9.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/d3/-/d3-7.9.0.tgz", + "integrity": "sha1-V556yz10nK+IYL0XQa6NNxBwzV0=", + "license": "ISC", + "dependencies": { + "d3-array": "3", + "d3-axis": "3", + "d3-brush": "3", + "d3-chord": "3", + "d3-color": "3", + "d3-contour": "4", + "d3-delaunay": "6", + "d3-dispatch": "3", + "d3-drag": "3", + "d3-dsv": "3", + "d3-ease": "3", + "d3-fetch": "3", + "d3-force": "3", + "d3-format": "3", + "d3-geo": "3", + "d3-hierarchy": "3", + "d3-interpolate": "3", + "d3-path": "3", + "d3-polygon": "3", + "d3-quadtree": "3", + "d3-random": "3", + "d3-scale": "4", + "d3-scale-chromatic": "3", + "d3-selection": "3", + "d3-shape": "3", + "d3-time": "3", + "d3-time-format": "4", + "d3-timer": "3", + "d3-transition": "3", + "d3-zoom": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-array": { + "version": "3.2.4", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/d3-array/-/d3-array-3.2.4.tgz", + "integrity": "sha1-Ff7DOyN/l6xdfJhtx32ic6jtC7U=", + "license": "ISC", + "dependencies": { + "internmap": "1 - 2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-axis": { + "version": "3.0.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/d3-axis/-/d3-axis-3.0.0.tgz", + "integrity": "sha1-xCpKE+gTHWN7dF/Clzgkz+r5MyI=", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-brush": { + "version": "3.0.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/d3-brush/-/d3-brush-3.0.0.tgz", + "integrity": "sha1-b3Z8Ttjct53n7ePhwPieY+9k0xw=", + "license": "ISC", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "3", + "d3-transition": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-chord": { + "version": "3.0.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/d3-chord/-/d3-chord-3.0.1.tgz", + "integrity": "sha1-0VbWH0hfzoMn5qvzOctB2Mu6aWY=", + "license": "ISC", + "dependencies": { + "d3-path": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-color": { + "version": "3.1.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/d3-color/-/d3-color-3.1.0.tgz", + "integrity": "sha1-OVsoM9+scVB/EqwvevI7+BneJOI=", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-contour": { + "version": "4.0.2", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/d3-contour/-/d3-contour-4.0.2.tgz", + "integrity": "sha1-u5IGO8jFZjrLJCL5nHPLtsauO8w=", + "license": "ISC", + "dependencies": { + "d3-array": "^3.2.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-delaunay": { + "version": "6.0.4", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/d3-delaunay/-/d3-delaunay-6.0.4.tgz", + "integrity": "sha1-mBaQOHM6ClurvtpVBU95W7nkpYs=", + "license": "ISC", + "dependencies": { + "delaunator": "5" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dispatch": { + "version": "3.0.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/d3-dispatch/-/d3-dispatch-3.0.1.tgz", + "integrity": "sha1-X8dShOnCN1w2yDlBGgz1UMv8TV4=", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-drag": { + "version": "3.0.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/d3-drag/-/d3-drag-3.0.0.tgz", + "integrity": "sha1-mUqunNI8cZ9TteEOOgphCMaWB7o=", + "license": "ISC", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-selection": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dsv": { + "version": "3.0.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/d3-dsv/-/d3-dsv-3.0.1.tgz", + "integrity": "sha1-xjr5ePTWoNCEpSpnOSK+IWB4m3M=", + "license": "ISC", + "dependencies": { + "commander": "7", + "iconv-lite": "0.6", + "rw": "1" + }, + "bin": { + "csv2json": "bin/dsv2json.js", + "csv2tsv": "bin/dsv2dsv.js", + "dsv2dsv": "bin/dsv2dsv.js", + "dsv2json": "bin/dsv2json.js", + "json2csv": "bin/json2dsv.js", + "json2dsv": "bin/json2dsv.js", + "json2tsv": "bin/json2dsv.js", + "tsv2csv": "bin/dsv2dsv.js", + "tsv2json": "bin/dsv2json.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dsv/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/commander/-/commander-7.2.0.tgz", + "integrity": "sha1-o2y1fQtQHOEI5NIFWaFQo5HZerc=", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/d3-ease": { + "version": "3.0.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/d3-ease/-/d3-ease-3.0.1.tgz", + "integrity": "sha1-llisOKIUDVnTRhYPH2ww/aC9EvQ=", + "license": "BSD-3-Clause", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-fetch": { + "version": "3.0.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/d3-fetch/-/d3-fetch-3.0.1.tgz", + "integrity": "sha1-gxQb/5hWoO21443onNz+Y9CmCiI=", + "license": "ISC", + "dependencies": { + "d3-dsv": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-force": { + "version": "3.0.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/d3-force/-/d3-force-3.0.0.tgz", + "integrity": "sha1-Piuhph5wiI/j2RlOMNbRTuzhVcQ=", + "license": "ISC", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-quadtree": "1 - 3", + "d3-timer": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-format": { + "version": "3.1.2", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/d3-format/-/d3-format-3.1.2.tgz", + "integrity": "sha1-Af20a1i+sfVbELQq1wtuNE1esq4=", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-geo": { + "version": "3.1.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/d3-geo/-/d3-geo-3.1.1.tgz", + "integrity": "sha1-YCfPUSRvmy69ZPmeAdx8M2QDOk0=", + "license": "ISC", + "dependencies": { + "d3-array": "2.5.0 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-hierarchy": { + "version": "3.1.2", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz", + "integrity": "sha1-sBzULB7tPUbbd6WWbPcm+MCRYMY=", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-interpolate": { + "version": "3.0.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha1-PEeqWzLFs9+1bvP9Q0IHimMrQA0=", + "license": "ISC", + "dependencies": { + "d3-color": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-path": { + "version": "3.1.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/d3-path/-/d3-path-3.1.0.tgz", + "integrity": "sha1-It+TkDL7WnGuixgA1h3beFHEJSY=", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-polygon": { + "version": "3.0.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/d3-polygon/-/d3-polygon-3.0.1.tgz", + "integrity": "sha1-C0XT3RxIopyOBX5hNWk+yAvxY5g=", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-quadtree": { + "version": "3.0.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/d3-quadtree/-/d3-quadtree-3.0.1.tgz", + "integrity": "sha1-bco+i+Kzk8mp1RTau9gKkt7vGk8=", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-random": { + "version": "3.0.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/d3-random/-/d3-random-3.0.1.tgz", + "integrity": "sha1-1JJjeNMz2cC/0eb6AZTTCuuqIPQ=", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-sankey": { + "version": "0.12.3", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/d3-sankey/-/d3-sankey-0.12.3.tgz", + "integrity": "sha1-s8JoYnvXLl2AM26N5qy/7J0V0B0=", + "license": "BSD-3-Clause", + "dependencies": { + "d3-array": "1 - 2", + "d3-shape": "^1.2.0" + } + }, + "node_modules/d3-sankey/node_modules/d3-array": { + "version": "2.12.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/d3-array/-/d3-array-2.12.1.tgz", + "integrity": "sha1-4gtBqvzf/fXVCSgATs7PgVpGXoE=", + "license": "BSD-3-Clause", + "dependencies": { + "internmap": "^1.0.0" + } + }, + "node_modules/d3-sankey/node_modules/d3-path": { + "version": "1.0.9", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/d3-path/-/d3-path-1.0.9.tgz", + "integrity": "sha1-SMBQux/owmJJOoyvVSTj6VkXAc8=", + "license": "BSD-3-Clause" + }, + "node_modules/d3-sankey/node_modules/d3-shape": { + "version": "1.3.7", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/d3-shape/-/d3-shape-1.3.7.tgz", + "integrity": "sha1-32OAG+B7yYa8VPY3ibT+UCmStdc=", + "license": "BSD-3-Clause", + "dependencies": { + "d3-path": "1" + } + }, + "node_modules/d3-sankey/node_modules/internmap": { + "version": "1.0.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/internmap/-/internmap-1.0.1.tgz", + "integrity": "sha1-ABfMijuZYF8DAvKxmNJy4BXl35U=", + "license": "ISC" + }, + "node_modules/d3-scale": { + "version": "4.0.2", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/d3-scale/-/d3-scale-4.0.2.tgz", + "integrity": "sha1-grOOjo/3CAdk+Nzsd71L45Nok5Y=", + "license": "ISC", + "dependencies": { + "d3-array": "2.10.0 - 3", + "d3-format": "1 - 3", + "d3-interpolate": "1.2.0 - 3", + "d3-time": "2.1.1 - 3", + "d3-time-format": "2 - 4" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-scale-chromatic": { + "version": "3.1.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz", + "integrity": "sha1-NMOdopiyPCDgLxpLI5vQ8i5/ExQ=", + "license": "ISC", + "dependencies": { + "d3-color": "1 - 3", + "d3-interpolate": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-selection": { + "version": "3.0.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/d3-selection/-/d3-selection-3.0.0.tgz", + "integrity": "sha1-wlM4IH76csxbm9FFihpBkB8eGzE=", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-shape": { + "version": "3.2.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/d3-shape/-/d3-shape-3.2.0.tgz", + "integrity": "sha1-oag5y9m6RfKGdMadf4Vbz5HfxqU=", + "license": "ISC", + "dependencies": { + "d3-path": "^3.1.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time": { + "version": "3.1.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/d3-time/-/d3-time-3.1.0.tgz", + "integrity": "sha1-kxDbVumS48AXXh7zheVF5Iqbtcc=", + "license": "ISC", + "dependencies": { + "d3-array": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time-format": { + "version": "4.1.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/d3-time-format/-/d3-time-format-4.1.0.tgz", + "integrity": "sha1-erUlelBB0R7LT+cKXH0WoZW7QIo=", + "license": "ISC", + "dependencies": { + "d3-time": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-timer": { + "version": "3.0.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/d3-timer/-/d3-timer-3.0.1.tgz", + "integrity": "sha1-YoTSonCChbGrt+IB7aQ4CvNeY7A=", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-transition": { + "version": "3.0.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/d3-transition/-/d3-transition-3.0.1.tgz", + "integrity": "sha1-aGn93hRIhoB3/dWYkgDLYbKhZF8=", + "license": "ISC", + "dependencies": { + "d3-color": "1 - 3", + "d3-dispatch": "1 - 3", + "d3-ease": "1 - 3", + "d3-interpolate": "1 - 3", + "d3-timer": "1 - 3" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "d3-selection": "2 - 3" + } + }, + "node_modules/d3-zoom": { + "version": "3.0.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/d3-zoom/-/d3-zoom-3.0.0.tgz", + "integrity": "sha1-0T9BZccyF//qpUKVzWlps+eu6PM=", + "license": "ISC", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "2 - 3", + "d3-transition": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/dagre-d3-es": { + "version": "7.0.14", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/dagre-d3-es/-/dagre-d3-es-7.0.14.tgz", + "integrity": "sha1-EnInbiZFfPO5faxWn48FMewzw3c=", + "license": "MIT", + "dependencies": { + "d3": "^7.9.0", + "lodash-es": "^4.17.21" + } + }, + "node_modules/data-urls": { + "version": "2.0.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/data-urls/-/data-urls-2.0.0.tgz", + "integrity": "sha1-FWSFpyljqXD11YIar2Qr7yvy25s=", + "dev": true, + "license": "MIT", + "dependencies": { + "abab": "^2.0.3", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/dayjs": { + "version": "1.11.23", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/dayjs/-/dayjs-1.11.23.tgz", + "integrity": "sha1-sKNjUG3eXzbPUHXkLr6BFRZajHk=", + "license": "MIT" + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha1-RLXyFHzTsA1LVhN2hZZvJv0l3Uo=", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/delaunator": { + "version": "5.1.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/delaunator/-/delaunator-5.1.0.tgz", + "integrity": "sha1-0TJx+/Ov9nU/nqbiNVV/IJAQRuo=", + "license": "ISC", + "dependencies": { + "robust-predicates": "^3.0.2" + } + }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha1-5BuALh7t+fbK4YPOXmIteJ19jlM=", + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha1-XEXo6GmVJiYzHXqrMm0B2vZdWJ0=", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "BSD-2-Clause" + }, + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha1-zDhff3UfHR/GUMITdIBCVFOMfTE=", + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/dompurify": { + "version": "3.4.15", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/dompurify/-/dompurify-3.4.15.tgz", + "integrity": "sha1-MDUbNFE4lPQowTvdsov/CgJ66AQ=", + "license": "(MPL-2.0 OR Apache-2.0)", + "optionalDependencies": { + "@types/trusted-types": "^2.0.7" + } + }, + "node_modules/domutils": { + "version": "3.2.2", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/domutils/-/domutils-3.2.2.tgz", + "integrity": "sha1-7b/itmiwwdl8JLrw8QYrEyIhvHg=", + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/duplicate-package-checker-webpack-plugin": { + "version": "3.0.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/duplicate-package-checker-webpack-plugin/-/duplicate-package-checker-webpack-plugin-3.0.0.tgz", + "integrity": "sha1-eLuJ5iX6fPjCpZxT9itJX9qbooc=", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^2.3.0", + "find-root": "^1.0.0", + "lodash": "^4.17.4", + "semver": "^5.4.1" + } + }, + "node_modules/duplicate-package-checker-webpack-plugin/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/semver/-/semver-5.7.2.tgz", + "integrity": "sha1-SNVdtzfDKHzUg14X+hP+rOHEHvg=", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha1-aWzi7Aqg5uqTo5f/zySqeEDIJ8s=", + "dev": true, + "license": "MIT" + }, + "node_modules/electron-to-chromium": { + "version": "1.5.427", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/electron-to-chromium/-/electron-to-chromium-1.5.427.tgz", + "integrity": "sha512-n14zb3FdsChZ2BNobqNHAJMcP3ifFv4paox2LvCrfVAQcqGiSURgbJl+PfMpHVCNFkStnNc+RRVtPBTVW5PDgw==", + "dev": true, + "license": "ISC" + }, + "node_modules/elkjs": { + "version": "0.9.3", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/elkjs/-/elkjs-0.9.3.tgz", + "integrity": "sha1-FnEfjOsJ8bErmelxsTioOEpSkWE=", + "license": "EPL-2.0" + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha1-hAyIA7DYBH9P8M+WMXazLU7z7XI=", + "dev": true, + "license": "MIT" + }, + "node_modules/emojis-list": { + "version": "3.0.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha1-VXBmIEatKeLpFucariYKvf9Pang=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.25.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/enhanced-resolve/-/enhanced-resolve-5.25.1.tgz", + "integrity": "sha512-nGXts5znJzmWPu+mIE9izCOzdg63oJca2mDzGWWTth7sr4aCToKcoyFVBQwN75Ij5Pf6p510EwkTqViTRzDV+w==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.3.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/entities/-/entities-4.5.0.tgz", + "integrity": "sha1-XSaOpecRPsdMTQM7eepaNaSI+0g=", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/envinfo": { + "version": "7.21.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/envinfo/-/envinfo-7.21.0.tgz", + "integrity": "sha1-BKJRvnn5JUhUHzfRPItvIpQMO64=", + "dev": true, + "license": "MIT", + "bin": { + "envinfo": "dist/cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha1-BfdaJdq5jk+x3NXhRywFRtUFfI8=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-module-lexer": { + "version": "2.3.2", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/es-module-lexer/-/es-module-lexer-2.3.2.tgz", + "integrity": "sha1-MR+k9AFowZdcUFR3xRsjI01BrVU=", + "dev": true, + "license": "MIT" + }, + "node_modules/es-toolkit": { + "version": "1.52.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/es-toolkit/-/es-toolkit-1.52.0.tgz", + "integrity": "sha1-cerxqLGINO93Y37Mu4hbpMA81t0=", + "license": "MIT", + "workspaces": [ + "docs", + "benchmarks", + "tests/types", + "tests/browser-compat" + ] + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha1-ARo/aYVroYnf+n3I/M6Z0qh5A+U=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/events/-/events-3.3.0.tgz", + "integrity": "sha1-Mala0Kkk4tLEGagTrrLE6HjqdAA=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/exenv-es6": { + "version": "1.1.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/exenv-es6/-/exenv-es6-1.1.1.tgz", + "integrity": "sha1-gLeoxa8k1TMx91W6wH6Eq7H23mc=", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "license": "MIT" + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha1-On1WtVnWy8PrUSMlJE5hmmXGxSU=", + "license": "MIT" + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha1-h0v2nG9ATCtdmcSBNBOZ/VWJJjM=", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-uri": { + "version": "3.1.7", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/fast-uri/-/fast-uri-3.1.7.tgz", + "integrity": "sha1-dDFX2Vfzy7TGUxDgM9wq1K19xgo=", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/fastdom": { + "version": "1.0.12", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/fastdom/-/fastdom-1.0.12.tgz", + "integrity": "sha1-rkPVWvAXJSrkmbLhhlEauXQS3jk=", + "license": "MIT", + "dependencies": { + "strictdom": "^1.0.1" + } + }, + "node_modules/fastest-levenshtein": { + "version": "1.0.16", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", + "integrity": "sha1-IQ5htv8YHekeqbPRuE/e3UfgNOU=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4.9.1" + } + }, + "node_modules/find-root": { + "version": "1.1.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha1-q8/Iunb3CMQql7PWhbfpRQv7nOQ=", + "dev": true, + "license": "MIT" + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha1-l6/n1s3AvFkoWEt8jXsW6KmqXRk=", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/flat/-/flat-5.0.2.tgz", + "integrity": "sha1-jKb+MyBp/6nTJMMnGYxZglnOskE=", + "dev": true, + "license": "BSD-3-Clause", + "bin": { + "flat": "cli.js" + } + }, + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha1-Mujp7Rtoo0l777msK2rfkqY4V28=", + "dev": true, + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/free-style": { + "version": "3.1.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/free-style/-/free-style-3.1.0.tgz", + "integrity": "sha1-TimWApU05rFzFhHYQ0N7ni9HPwg=", + "license": "MIT" + }, + "node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha1-Aoc8+8QITd4SfqpfmQXu8jJdGr8=", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true, + "license": "ISC" + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha1-LALYZNl/PqbIgwxGTL0Rq26rehw=", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/github-slugger": { + "version": "2.0.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/github-slugger/-/github-slugger-2.0.0.tgz", + "integrity": "sha1-Us8vknmiHrbFndOFtBDwwK3ajxo=", + "license": "ISC" + }, + "node_modules/glob": { + "version": "7.1.7", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/glob/-/glob-7.1.7.tgz", + "integrity": "sha1-Oxk+kjPwHULQs/eClLvutBj5SpA=", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha1-QYPk6L8Iu24Fu7L30uDI9xLKQOM=", + "dev": true, + "license": "ISC" + }, + "node_modules/hachure-fill": { + "version": "0.5.2", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/hachure-fill/-/hachure-fill-0.5.2.tgz", + "integrity": "sha1-0ZvEzIdQpZYrR/sTAFV6hfz5NMw=", + "license": "MIT" + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha1-lEdx/ZyByBJlxNaUGGDaBrtZR5s=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/hasown": { + "version": "2.0.4", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/hasown/-/hasown-2.0.4.tgz", + "integrity": "sha1-jGLYy5C+sqrV0KW2dYGtmFTD8AM=", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/htmlparser2": { + "version": "8.0.2", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/htmlparser2/-/htmlparser2-8.0.2.tgz", + "integrity": "sha1-8AIVFwWzg+YkM7XPRm9bcW7a7CE=", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "entities": "^4.4.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha1-pS+AvzjaGVLrXGgXkHGYcaGnJQE=", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/icss-utils": { + "version": "5.1.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha1-xr5oWKvQE9do6YNmrkfiXViHsa4=", + "dev": true, + "license": "ISC", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/import-local": { + "version": "3.2.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/import-local/-/import-local-3.2.0.tgz", + "integrity": "sha1-w9XHRXmMAqb4uJdyarpRABhu4mA=", + "dev": true, + "license": "MIT", + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-meta-resolve": { + "version": "4.2.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/import-meta-resolve/-/import-meta-resolve-4.2.0.tgz", + "integrity": "sha1-CMuFtb037MjrHg9nDcJ2cALUNzQ=", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dev": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha1-D6LGT5MpF8NDOg3tVTY6rjdBa3w=", + "dev": true, + "license": "ISC" + }, + "node_modules/internmap": { + "version": "2.0.3", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/internmap/-/internmap-2.0.3.tgz", + "integrity": "sha1-ZoXyN1XkPFJOJR0py8lySOMGEAk=", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/interpret": { + "version": "3.1.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/interpret/-/interpret-3.1.1.tgz", + "integrity": "sha1-W+DO7WfKecbEvFzw1+6EPc6hEMQ=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/is-core-module": { + "version": "2.16.2", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/is-core-module/-/is-core-module-2.16.2.tgz", + "integrity": "sha1-PgdFCoCA684/vwysSU9NKrMk4II=", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha1-8Rb4Bk/pCz94RKOJl8C3UFEmnx0=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-object": { + "version": "5.1.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/is-plain-object/-/is-plain-object-5.1.0.tgz", + "integrity": "sha1-Iu17XoVrtXlmNI5blGja2kK+h/Q=", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true, + "license": "ISC" + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isomorphic.js": { + "version": "0.2.5", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/isomorphic.js/-/isomorphic.js-0.2.5.tgz", + "integrity": "sha1-E+7PNvLbpT6F01XhG/nUIIxvf4g=", + "license": "MIT", + "funding": { + "type": "GitHub Sponsors ❤", + "url": "https://github.com/sponsors/dmonad" + } + }, + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha1-iDOp2Jq0rN5hiJQr0cU7Y5DtWoo=", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha1-jRRvCQDolzsQa29zzB6ajLhvjbA=", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha1-zW/BfihQDP9WwbhsCn/UpUpzAFw=", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha1-GSA/tZmR35jjoocFDUZHzerzJJk=", + "license": "MIT" + }, + "node_modules/json-schema-compare": { + "version": "0.2.2", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/json-schema-compare/-/json-schema-compare-0.2.2.tgz", + "integrity": "sha1-3WAVCDNakMf0z622suOXIlyQjlY=", + "license": "MIT", + "dependencies": { + "lodash": "^4.17.4" + } + }, + "node_modules/json-schema-merge-allof": { + "version": "0.8.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/json-schema-merge-allof/-/json-schema-merge-allof-0.8.1.tgz", + "integrity": "sha1-7SgozdlYYW/3T5MoMKJikXieqvI=", + "license": "MIT", + "dependencies": { + "compute-lcm": "^1.1.2", + "json-schema-compare": "^0.2.2", + "lodash": "^4.17.20" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha1-rnvLNlard6c7pcSb9lTzjmtoYOI=", + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/json5/-/json5-2.2.3.tgz", + "integrity": "sha1-eM1vGhm9wStz21rQxh79ZsHikoM=", + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonfile": { + "version": "6.2.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/jsonfile/-/jsonfile-6.2.1.tgz", + "integrity": "sha1-tuMXF/Isw3MwsIHOAFHtXeU68vY=", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsonpointer": { + "version": "5.0.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/jsonpointer/-/jsonpointer-5.0.1.tgz", + "integrity": "sha1-IRDgrwkA/TdGe1kH7NE6eIShtVk=", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/katex": { + "version": "0.16.47", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/katex/-/katex-0.16.47.tgz", + "integrity": "sha1-ChOkLC3rT3TmHxYtRAuRZaVIAw8=", + "funding": [ + "https://opencollective.com/katex", + "https://github.com/sponsors/katex" + ], + "license": "MIT", + "dependencies": { + "commander": "^8.3.0" + }, + "bin": { + "katex": "cli.js" + } + }, + "node_modules/katex/node_modules/commander": { + "version": "8.3.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/commander/-/commander-8.3.0.tgz", + "integrity": "sha1-SDfqGy2me5xhamevuw+v7lZ7ymY=", + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/khroma": { + "version": "2.1.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/khroma/-/khroma-2.1.0.tgz", + "integrity": "sha1-RfLOlM4jGkN89bY8LohubrQru7E=" + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha1-B8BQNKbDSfoG4k+jWqdttFgM5N0=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/layout-base": { + "version": "1.0.2", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/layout-base/-/layout-base-1.0.2.tgz", + "integrity": "sha1-EpHilog8Miqd1MXdggY3IbU+JuI=", + "license": "MIT" + }, + "node_modules/lib0": { + "version": "0.2.117", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/lib0/-/lib0-0.2.117.tgz", + "integrity": "sha1-bD+SZHXSiQSvBbWQcDy7vClHVxY=", + "license": "MIT", + "dependencies": { + "isomorphic.js": "^0.2.4" + }, + "bin": { + "0ecdsa-generate-keypair": "bin/0ecdsa-generate-keypair.js", + "0gentesthtml": "bin/gentesthtml.js", + "0serve": "bin/0serve.js" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "type": "GitHub Sponsors ❤", + "url": "https://github.com/sponsors/dmonad" + } + }, + "node_modules/license-webpack-plugin": { + "version": "4.0.2", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/license-webpack-plugin/-/license-webpack-plugin-4.0.2.tgz", + "integrity": "sha1-HhhELtILdUuC8a3v9CJJuB0RrsY=", + "dev": true, + "license": "ISC", + "dependencies": { + "webpack-sources": "^3.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + }, + "webpack-sources": { + "optional": true + } + } + }, + "node_modules/loader-utils": { + "version": "2.0.4", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha1-i1yzi1w0qaAY7h/A5qBm0d/MUow=", + "dev": true, + "license": "MIT", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha1-Gvujlq/WdqbUJQTQpno6frn2KqA=", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lodash": { + "version": "4.18.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/lodash/-/lodash-4.18.1.tgz", + "integrity": "sha1-/ytmwfYybVlRPeJAe/iBQ5gSdxw=", + "license": "MIT" + }, + "node_modules/lodash-es": { + "version": "4.18.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/lodash-es/-/lodash-es-4.18.1.tgz", + "integrity": "sha1-uWLuuA2dmDqQC/NClh+3QYyhCx0=", + "license": "MIT" + }, + "node_modules/lodash.escape": { + "version": "4.0.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/lodash.escape/-/lodash.escape-4.0.1.tgz", + "integrity": "sha1-yQRGkMIeBClL6qUXcS/e0fqI3pg=", + "license": "MIT" + }, + "node_modules/lodash.mergewith": { + "version": "4.6.2", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz", + "integrity": "sha1-YXEh+JrFX1kEfHrsHM1mVMZZD1U=", + "license": "MIT" + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha1-ce5R+nvkyuwaY4OffmgtgTLTDK8=", + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha1-QQ/IoXtw5ZgBPfJXwkRrfzOD8Rk=", + "dev": true, + "license": "ISC" + }, + "node_modules/markdown-to-jsx": { + "version": "7.7.17", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/markdown-to-jsx/-/markdown-to-jsx-7.7.17.tgz", + "integrity": "sha1-bpl9aqTb4uacQjxldFVBhGd3SDw=", + "license": "MIT", + "engines": { + "node": ">= 10" + }, + "peerDependencies": { + "react": ">= 0.14.0" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + } + } + }, + "node_modules/marked": { + "version": "17.0.6", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/marked/-/marked-17.0.6.tgz", + "integrity": "sha1-KpdYaictO+WIDxmOAgt0rSfPhro=", + "license": "MIT", + "bin": { + "marked": "bin/marked.js" + }, + "engines": { + "node": ">= 20" + } + }, + "node_modules/marked-gfm-heading-id": { + "version": "4.1.4", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/marked-gfm-heading-id/-/marked-gfm-heading-id-4.1.4.tgz", + "integrity": "sha1-nw7nus41zpyQxYcAWT1s27RhhwY=", + "license": "MIT", + "dependencies": { + "github-slugger": "^2.0.0" + }, + "peerDependencies": { + "marked": ">=13 <19" + } + }, + "node_modules/marked-mangle": { + "version": "1.1.13", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/marked-mangle/-/marked-mangle-1.1.13.tgz", + "integrity": "sha1-KxGUwayMXiIm1u8yFusA6UlL2MA=", + "license": "MIT", + "peerDependencies": { + "marked": ">=4 <19" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha1-UoI2KaFN0AyXcPtq1H3GMQ8sH2A=", + "dev": true, + "license": "MIT" + }, + "node_modules/mermaid": { + "version": "11.17.2", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/mermaid/-/mermaid-11.17.2.tgz", + "integrity": "sha1-48rzcXWCwOROXQTP8EPgJcrsfLo=", + "license": "MIT", + "dependencies": { + "@braintree/sanitize-url": "^7.1.2", + "@iconify/utils": "^3.0.2", + "@mermaid-js/parser": "^1.2.1", + "@types/d3": "^7.4.3", + "@upsetjs/venn.js": "^2.0.0", + "cytoscape": "^3.34.0", + "cytoscape-cose-bilkent": "^4.1.0", + "cytoscape-fcose": "^2.2.0", + "d3": "^7.9.0", + "d3-sankey": "^0.12.3", + "dagre-d3-es": "7.0.14", + "dayjs": "^1.11.21", + "dompurify": "^3.3.3", + "es-toolkit": "^1.45.1", + "fastdom": "1.0.12", + "katex": "^0.16.47", + "khroma": "^2.1.0", + "marked": "^16.3.0", + "roughjs": "^4.6.6", + "stylis": "^4.3.6", + "ts-dedent": "^2.2.0", + "uuid": "^11.1.0 || ^12 || ^13 || ^14.0.0" + } + }, + "node_modules/mermaid/node_modules/marked": { + "version": "16.4.2", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/marked/-/marked-16.4.2.tgz", + "integrity": "sha1-SVmmS+bEhvDbdGfq184ojeVCkKM=", + "license": "MIT", + "bin": { + "marked": "bin/marked.js" + }, + "engines": { + "node": ">= 20" + } + }, + "node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha1-zds+5PnGRTDf9kAjZmHULLajFPU=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mini-css-extract-plugin": { + "version": "2.10.2", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/mini-css-extract-plugin/-/mini-css-extract-plugin-2.10.2.tgz", + "integrity": "sha1-XIXslFDAXSbjJTG0ZaFaCMOlclM=", + "dev": true, + "license": "MIT", + "dependencies": { + "schema-utils": "^4.0.0", + "tapable": "^2.2.1" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/mini-svg-data-uri": { + "version": "1.4.4", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/mini-svg-data-uri/-/mini-svg-data-uri-1.4.4.tgz", + "integrity": "sha1-irCqvN+MKa1Wk8pZWvGd0urQmTk=", + "dev": true, + "license": "MIT", + "bin": { + "mini-svg-data-uri": "cli.js" + } + }, + "node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha1-WAyI+NVEXyvWqo88re+g3nn71p4=", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha1-waRk52kzAuCCoHXO4MBXdBrEdyw=", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minimizer-webpack-plugin": { + "version": "5.10.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/minimizer-webpack-plugin/-/minimizer-webpack-plugin-5.10.1.tgz", + "integrity": "sha1-MzrSelP81Ru9hoJSpHM+4ISAsCE=", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.31", + "jest-worker": "^27.4.5", + "schema-utils": "^4.3.3", + "terser": "^5.51.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@minify-html/node": { + "optional": true + }, + "@napi-rs/image": { + "optional": true + }, + "@swc/core": { + "optional": true + }, + "@swc/css": { + "optional": true + }, + "@swc/html": { + "optional": true + }, + "clean-css": { + "optional": true + }, + "cssnano": { + "optional": true + }, + "csso": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "html-minifier-terser": { + "optional": true + }, + "imagemin": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "postcss": { + "optional": true + }, + "sharp": { + "optional": true + }, + "svgo": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "node_modules/minipass": { + "version": "7.1.3", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha1-eTibTrG7LQA6m7qH1JLyvTe9xls=", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/nanoid": { + "version": "3.3.19", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/nanoid/-/nanoid-3.3.19.tgz", + "integrity": "sha512-Y2tUNy4ouw6tq5oDSKeQYGOyhkUBhNOcGV/02KC+6kd9eDGqdZd++mjMiIDilrBYvjEnCYvVtsuHCuP+okSfug==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha1-tKr7k+OustgXTKU88WOrfXMIMF8=", + "dev": true, + "license": "MIT" + }, + "node_modules/node-releases": { + "version": "2.0.55", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/node-releases/-/node-releases-2.0.55.tgz", + "integrity": "sha1-xS+u22gAHc/ndJW17RrFgnoXiPw=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha1-PdM8ZHohT9//2DWTPrCG2g3CHbE=", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha1-o0KLtwiLOmApL2aRkni3wpetTwc=", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha1-yyhoVA4xPWHeWPr741zpAE1VQOY=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha1-TxRxoBCCeob5TP2bByfjbSZ95QU=", + "dev": true, + "license": "BlueOak-1.0.0" + }, + "node_modules/package-manager-detector": { + "version": "1.8.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/package-manager-detector/-/package-manager-detector-1.8.0.tgz", + "integrity": "sha1-cMmixL0aUT3NbK0Aap/OvsIqElM=", + "license": "MIT" + }, + "node_modules/parse-srcset": { + "version": "1.0.2", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/parse-srcset/-/parse-srcset-1.0.2.tgz", + "integrity": "sha1-8r0iH2zJcKk42IVWq8WJyqqiveE=", + "license": "MIT" + }, + "node_modules/path-browserify": { + "version": "1.0.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha1-2YRUqcN1PVeQhg8W9ohnueRr4f0=", + "license": "MIT" + }, + "node_modules/path-data-parser": { + "version": "0.1.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/path-data-parser/-/path-data-parser-0.1.0.tgz", + "integrity": "sha1-j1ulzHD8e+yz3O+uoI4mWaumC4w=", + "license": "MIT" + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha1-UTvb4tO5XXdi6METfvoZXGxhtbM=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha1-WB9q3mWMu6ZaDTOA3ndTKVBU83U=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha1-+8EUtgykKzDZ2vWFjkvWi77bZzU=", + "dev": true, + "license": "MIT" + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha1-eWCmaIiFlKByCxKpEdGnQqufEdI=", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha1-PTIa8+q5ObCDyPkpodEs2oHCa2s=", + "license": "ISC" + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha1-8JkTPfft5CLoHR2ESCcO6z5CYfM=", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/points-on-curve": { + "version": "0.2.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/points-on-curve/-/points-on-curve-0.2.0.tgz", + "integrity": "sha1-fbuYxDeRhZQ0KEdhMw+ok8uBtNE=", + "license": "MIT" + }, + "node_modules/points-on-path": { + "version": "0.2.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/points-on-path/-/points-on-path-0.2.1.tgz", + "integrity": "sha1-VTICtUJMU77TcTWzGIWOrP+F3VI=", + "license": "MIT", + "dependencies": { + "path-data-parser": "0.1.0", + "points-on-curve": "0.2.0" + } + }, + "node_modules/postcss": { + "version": "8.5.28", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/postcss/-/postcss-8.5.28.tgz", + "integrity": "sha1-2kVjqZoG5i1sHNGsrjYyJLyu1uk=", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.18", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-modules-extract-imports": { + "version": "3.1.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz", + "integrity": "sha1-tEl8uFqcDEtaq+t1m7JejYnxUAI=", + "dev": true, + "license": "ISC", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-local-by-default": { + "version": "4.2.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.2.0.tgz", + "integrity": "sha1-0VD0ODeDHa4l5AhVluhPb11uw2g=", + "dev": true, + "license": "MIT", + "dependencies": { + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^7.0.0", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-scope": { + "version": "3.2.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/postcss-modules-scope/-/postcss-modules-scope-3.2.1.tgz", + "integrity": "sha1-G7zN3LOY8delEeCi0dBHcYr0B4w=", + "dev": true, + "license": "ISC", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-values": { + "version": "4.0.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", + "integrity": "sha1-18Xn5ow7s8myfL9Iyguz/7RgLJw=", + "dev": true, + "license": "ISC", + "dependencies": { + "icss-utils": "^5.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-selector-parser": { + "version": "7.1.6", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/postcss-selector-parser/-/postcss-selector-parser-7.1.6.tgz", + "integrity": "sha1-Relw8tk9RUfWdUFn7REy9DASxL8=", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha1-cjwJkgg2um0+WvAZ+SvAlxwC5RQ=", + "dev": true, + "license": "MIT" + }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha1-Z9h78aaU9IQ1zzMsJK8QIUoxQLU=", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/prop-types/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha1-eJcppNw23imZ3BVt1sHZwYzqVqQ=", + "license": "MIT" + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha1-AnQi4vrsCyXhVJw+G9gwm5EztuU=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha1-M0WUG0FTy50ILY7uTNogFqmu9/Y=", + "license": "MIT" + }, + "node_modules/react": { + "version": "18.3.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/react/-/react-18.3.1.tgz", + "integrity": "sha1-SauJIAnFOTNiW9FrJTP8dUyrKJE=", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "18.3.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha1-wiZdeVEbV9R5s90/36UVNklMXLQ=", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.2" + }, + "peerDependencies": { + "react": "^18.3.1" + } + }, + "node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha1-6DVX3BLq5jqZ4AOkY4ix3LtE234=", + "license": "MIT" + }, + "node_modules/rechoir": { + "version": "0.8.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/rechoir/-/rechoir-0.8.0.tgz", + "integrity": "sha1-Sfhm4NMhRhQto62PDv81KzIV/yI=", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve": "^1.20.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha1-iaf92TgmEmcxjq/hT5wy5ZjDaQk=", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", + "license": "MIT" + }, + "node_modules/resolve": { + "version": "1.22.12", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/resolve/-/resolve-1.22.12.tgz", + "integrity": "sha1-9bKmgIl8acI4oTzRaxVnH4tzVJ8=", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "is-core-module": "^2.16.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha1-DwB18bslRHZs9zumpuKt/ryxPy0=", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha1-w1IlhD3493bfIcV1V7wIfp39/Gk=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/rimraf": { + "version": "5.0.10", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/rimraf/-/rimraf-5.0.10.tgz", + "integrity": "sha1-I7mEPT3JLbcfluGizpLjn9KoIhw=", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^10.3.7" + }, + "bin": { + "rimraf": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/brace-expansion": { + "version": "2.1.4", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/brace-expansion/-/brace-expansion-2.1.4.tgz", + "integrity": "sha1-WJ2rEcABjQNmvmTNi/Esjb7MgyY=", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/rimraf/node_modules/glob": { + "version": "10.5.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/glob/-/glob-10.5.0.tgz", + "integrity": "sha1-jsA1WRnNMzjChCiiPU8k7MX+c4w=", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/minimatch": { + "version": "9.0.9", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha1-mwy5/LeAh/b9fqur4lEcTT1gV04=", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.2" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/robust-predicates": { + "version": "3.0.3", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/robust-predicates/-/robust-predicates-3.0.3.tgz", + "integrity": "sha1-EJkGGzNJ4sWr7GwqsKzUQNJNQGI=", + "license": "Unlicense" + }, + "node_modules/roughjs": { + "version": "4.6.6", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/roughjs/-/roughjs-4.6.6.tgz", + "integrity": "sha1-EFn0ml4MgN7lQaAFsgzDIrIiFYs=", + "license": "MIT", + "dependencies": { + "hachure-fill": "^0.5.2", + "path-data-parser": "^0.1.0", + "points-on-curve": "^0.2.0", + "points-on-path": "^0.2.1" + } + }, + "node_modules/rw": { + "version": "1.3.3", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/rw/-/rw-1.3.3.tgz", + "integrity": "sha1-P4Yt+pGrdmsUiF700BEkv9oHT7Q=", + "license": "BSD-3-Clause" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha1-RPoWGwGHuVSd2Eu5GAL5vYOFzWo=", + "license": "MIT" + }, + "node_modules/sanitize-html": { + "version": "2.12.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/sanitize-html/-/sanitize-html-2.12.1.tgz", + "integrity": "sha1-KAoPXDcwUiKSH2+dYFvh9lWJFMc=", + "license": "MIT", + "dependencies": { + "deepmerge": "^4.2.2", + "escape-string-regexp": "^4.0.0", + "htmlparser2": "^8.0.0", + "is-plain-object": "^5.0.0", + "parse-srcset": "^1.0.2", + "postcss": "^8.3.11" + } + }, + "node_modules/sanitize-html/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha1-FLqDpdNz49MR5a/KKc9b+tllvzQ=", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/scheduler": { + "version": "0.23.2", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha1-QUumSjsoKJLpRM8hCOzAeNEVzcM=", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/schema-utils": { + "version": "4.5.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/schema-utils/-/schema-utils-4.5.0.tgz", + "integrity": "sha512-zJlMCZ0cAR5p/Y4oVpRoqioDMJcGxaXRrQ/4rP4WyR84vc5z/DolXdbvXeDpTwbtocDFr2rhPqHPErDCUtz2kA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.15", + "ajv": "^8.20.0", + "ajv-formats": "^3.0.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/semver": { + "version": "7.8.5", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/semver/-/semver-7.8.5.tgz", + "integrity": "sha1-ObZGA33VDBT7RR5+TKxY7YuGP2k=", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/shallow-clone": { + "version": "3.0.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha1-jymBrZJTH1UDWwH7IwdppA4C76M=", + "dev": true, + "license": "MIT", + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha1-zNCvT4g1+9wmW4JGGq8MNmY/NOo=", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha1-rhbxZE2HPsrYQ7AwexQzYtTEIXI=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha1-lSGIwcvVRgcOLdIND0HArgUwywQ=", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha1-HOVlD93YerwJnto33P8CTCZnrkY=", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-loader": { + "version": "1.0.2", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/source-map-loader/-/source-map-loader-1.0.2.tgz", + "integrity": "sha1-sKZYKy6qOH7eHs+AYa4Lk8I/nrA=", + "dev": true, + "license": "MIT", + "dependencies": { + "data-urls": "^2.0.0", + "iconv-lite": "^0.6.2", + "loader-utils": "^2.0.0", + "schema-utils": "^2.7.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/source-map-loader/node_modules/ajv": { + "version": "6.15.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha1-B+mCx0YmFnqnoklcU4F4ktcTlJI=", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/source-map-loader/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha1-MfKdpatuANHC0yms97WSlhTVAU0=", + "dev": true, + "license": "MIT", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/source-map-loader/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha1-afaofZUTq4u4/mO9sJecRI5oRmA=", + "dev": true, + "license": "MIT" + }, + "node_modules/source-map-loader/node_modules/schema-utils": { + "version": "2.7.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/schema-utils/-/schema-utils-2.7.1.tgz", + "integrity": "sha1-HKTzLRskxZDCA7jnpQvw6kzTlNc=", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 8.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha1-BP58f54e0tZiIzwoyys1ufY/bk8=", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/strictdom": { + "version": "1.0.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/strictdom/-/strictdom-1.0.1.tgz", + "integrity": "sha1-GJ3pFkn3PUTVm4Qy76aO+dJllGA=", + "license": "MIT" + }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha1-FPja7G2B5yIdKjV+Zoyrc728p5Q=", + "dev": true, + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha1-JpxxF9J7Ba0uU2gwqOyJXvnG0BA=", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha1-CCyyyJyf6GWaMRpTvWpNxTAdswQ=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha1-6Bj9ac5cz8tARZT4QpY79TFkzDc=", + "dev": true, + "license": "MIT" + }, + "node_modules/string-width-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha1-nibGPTD1NEPpSJSVshBdN7Z6hdk=", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha1-0iomlSKDamJ6+NBLXD/Sx/o+MuM=", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha1-nibGPTD1NEPpSJSVshBdN7Z6hdk=", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha1-CCyyyJyf6GWaMRpTvWpNxTAdswQ=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/style-loader": { + "version": "3.3.4", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/style-loader/-/style-loader-3.3.4.tgz", + "integrity": "sha1-8w94bDbbA6RcvVW2pw2TDEeQkOc=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/style-mod": { + "version": "4.1.3", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/style-mod/-/style-mod-4.1.3.tgz", + "integrity": "sha1-bpASJVu3mb2sN+KI92cbXXG/n3M=", + "license": "MIT" + }, + "node_modules/stylis": { + "version": "4.4.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/stylis/-/stylis-4.4.0.tgz", + "integrity": "sha1-xYRsk0X0v8Ub0MvXyjWgdE9IWl0=", + "license": "MIT" + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha1-G33NyzK4E4gBs+R4umpRyqiWSNo=", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha1-btpL00SjyUrqN21MwxvHcxEDngk=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tabbable": { + "version": "5.3.3", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/tabbable/-/tabbable-5.3.3.tgz", + "integrity": "sha1-qsD/iMc7ItbDxaULFYYxAAa0f78=", + "license": "MIT" + }, + "node_modules/tapable": { + "version": "2.3.3", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/tapable/-/tapable-2.3.3.tgz", + "integrity": "sha1-XafJmSxGA4IhJnmFqyhCGoh58WA=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/terser": { + "version": "5.51.2", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/terser/-/terser-5.51.2.tgz", + "integrity": "sha1-VVkSQlp/L/dzdCXDcY+nbHBp9u8=", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.15.0", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "5.6.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/terser-webpack-plugin/-/terser-webpack-plugin-5.6.1.tgz", + "integrity": "sha1-R7xBvYuPq4ODti7HY7c5SCkJfns=", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.25", + "jest-worker": "^27.4.5", + "schema-utils": "^4.3.0", + "terser": "^5.31.1" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@minify-html/node": { + "optional": true + }, + "@swc/core": { + "optional": true + }, + "@swc/css": { + "optional": true + }, + "@swc/html": { + "optional": true + }, + "clean-css": { + "optional": true + }, + "cssnano": { + "optional": true + }, + "csso": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "html-minifier-terser": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "postcss": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/commander/-/commander-2.20.3.tgz", + "integrity": "sha1-/UhehMA+tIgcIHIrpIA16FMa6zM=", + "dev": true, + "license": "MIT" + }, + "node_modules/tinyexec": { + "version": "1.3.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/tinyexec/-/tinyexec-1.3.1.tgz", + "integrity": "sha1-FqLjxuI/r85yZA5njmUds2FFucY=", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/tr46": { + "version": "2.1.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/tr46/-/tr46-2.1.0.tgz", + "integrity": "sha1-+oeqgcpdWUHajL8fm3SdyWmk4kA=", + "dev": true, + "license": "MIT", + "dependencies": { + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ts-dedent": { + "version": "2.3.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/ts-dedent/-/ts-dedent-2.3.0.tgz", + "integrity": "sha1-j6w2x5ArVBwVSsE6J6xGeZevEfg=", + "license": "MIT", + "engines": { + "node": ">=6.10" + } + }, + "node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha1-zy04vcNKE0vK8QkcQfZhni9nLQA=", + "license": "0BSD" + }, + "node_modules/typescript": { + "version": "5.3.3", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/typescript/-/typescript-5.3.3.tgz", + "integrity": "sha1-s85roljnLmMFumb1ybRSqu4//jc=", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/typestyle": { + "version": "2.4.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/typestyle/-/typestyle-2.4.0.tgz", + "integrity": "sha1-31uub/FQk/XOUfDKrF73lCj2Tng=", + "license": "MIT", + "dependencies": { + "csstype": "3.0.10", + "free-style": "3.1.0" + } + }, + "node_modules/typestyle/node_modules/csstype": { + "version": "3.0.10", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/csstype/-/csstype-3.0.10.tgz", + "integrity": "sha1-KtOnvtcPNbllcHwJLl8wsyfCkOU=", + "license": "MIT" + }, + "node_modules/undici-types": { + "version": "8.9.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/undici-types/-/undici-types-8.9.0.tgz", + "integrity": "sha1-4kDZfItdheU0fOc9JYZceQbB7J8=", + "dev": true, + "license": "MIT" + }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha1-Fo78IYCWTmOG0GHglN9hr+I5sY0=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.3.3", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/update-browserslist-db/-/update-browserslist-db-1.3.3.tgz", + "integrity": "sha512-pJ2sYawQS0R/WI928Gj5GlPhTGzbMelq0+4INtSYNDV9ErKJcX6xjGWkoG/VnB3dpUm00zALaqkrUD77pO5TDQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha1-mxpSWVIlhZ5V9mnZKPiMbFfyp34=", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/url-parse": { + "version": "1.5.10", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha1-nTwvc2wddd070r5QfcwRHx4uqcE=", + "license": "MIT", + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true, + "license": "MIT" + }, + "node_modules/uuid": { + "version": "14.0.2", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/uuid/-/uuid-14.0.2.tgz", + "integrity": "sha1-1a4D5NsIgchycfiwub1zEtAseZo=", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist-node/bin/uuid" + } + }, + "node_modules/validate.io-array": { + "version": "1.0.6", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/validate.io-array/-/validate.io-array-1.0.6.tgz", + "integrity": "sha1-W1osr9j4uFq7L4hroVPy2Tond00=", + "license": "MIT" + }, + "node_modules/validate.io-function": { + "version": "1.0.2", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/validate.io-function/-/validate.io-function-1.0.2.tgz", + "integrity": "sha1-NDoZgC7TsZaCaceA5VjpNBHAutc=" + }, + "node_modules/validate.io-integer": { + "version": "1.0.5", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/validate.io-integer/-/validate.io-integer-1.0.5.tgz", + "integrity": "sha1-FoSWSAuVviJH7EQ/IjPeT4mHgGg=", + "dependencies": { + "validate.io-number": "^1.0.3" + } + }, + "node_modules/validate.io-integer-array": { + "version": "1.0.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/validate.io-integer-array/-/validate.io-integer-array-1.0.0.tgz", + "integrity": "sha1-LKveAzKTpry+Bj/q/pHq9GsToIk=", + "dependencies": { + "validate.io-array": "^1.0.3", + "validate.io-integer": "^1.0.4" + } + }, + "node_modules/validate.io-number": { + "version": "1.0.3", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/validate.io-number/-/validate.io-number-1.0.3.tgz", + "integrity": "sha1-9j/+2iSL8opnqNSODjtGGhZluvg=" + }, + "node_modules/vscode-jsonrpc": { + "version": "8.2.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/vscode-jsonrpc/-/vscode-jsonrpc-8.2.1.tgz", + "integrity": "sha1-oyLMDx2X95T/2cTNKomKC94JfzQ=", + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/vscode-languageserver-protocol": { + "version": "3.18.3", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.18.3.tgz", + "integrity": "sha1-Y5OggGD7lPVSkkP6O+BWxnY5ghE=", + "license": "MIT", + "dependencies": { + "vscode-jsonrpc": "9.0.2", + "vscode-languageserver-types": "3.18.3" + } + }, + "node_modules/vscode-languageserver-protocol/node_modules/vscode-jsonrpc": { + "version": "9.0.2", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/vscode-jsonrpc/-/vscode-jsonrpc-9.0.2.tgz", + "integrity": "sha1-CGt2xPlPGwdD3urE4LV8nEpV6B0=", + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/vscode-languageserver-types": { + "version": "3.18.3", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/vscode-languageserver-types/-/vscode-languageserver-types-3.18.3.tgz", + "integrity": "sha1-6ylsQv1lk3WoKVG5zDPnZyup7+c=", + "license": "MIT" + }, + "node_modules/vscode-ws-jsonrpc": { + "version": "1.0.2", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/vscode-ws-jsonrpc/-/vscode-ws-jsonrpc-1.0.2.tgz", + "integrity": "sha1-6tLv1mKT8zHMwiAiKuGuyku1ssE=", + "license": "MIT", + "dependencies": { + "vscode-jsonrpc": "^8.0.2" + } + }, + "node_modules/w3c-keyname": { + "version": "2.2.8", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/w3c-keyname/-/w3c-keyname-2.2.8.tgz", + "integrity": "sha1-exfIxog9TouGrIq6edOeiA+IacU=", + "license": "MIT" + }, + "node_modules/watchpack": { + "version": "2.5.2", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/watchpack/-/watchpack-2.5.2.tgz", + "integrity": "sha1-4S6C2EZ0Jm/Bxtv+OIkbkv8FIuw=", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webidl-conversions": { + "version": "6.1.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/webidl-conversions/-/webidl-conversions-6.1.0.tgz", + "integrity": "sha1-kRG01+qArNQPUnDWZmIa+ni2lRQ=", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=10.4" + } + }, + "node_modules/webpack": { + "version": "5.110.3", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/webpack/-/webpack-5.110.3.tgz", + "integrity": "sha1-4SK2b2Imt6+PIJthAs0TI4xIE6g=", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.8", + "@types/json-schema": "^7.0.15", + "@webassemblyjs/ast": "^1.14.1", + "@webassemblyjs/wasm-edit": "^1.14.1", + "@webassemblyjs/wasm-parser": "^1.14.1", + "acorn": "^8.16.0", + "browserslist": "^4.28.1", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.24.4", + "es-module-lexer": "^2.1.0", + "events": "^3.2.0", + "graceful-fs": "^4.2.11", + "mime-db": "^1.54.0", + "minimizer-webpack-plugin": "^5.7.0", + "neo-async": "^2.6.2", + "schema-utils": "^4.3.3", + "tapable": "^2.3.0", + "watchpack": "^2.5.2", + "webpack-sources": "^3.5.1" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-cli": { + "version": "5.1.4", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/webpack-cli/-/webpack-cli-5.1.4.tgz", + "integrity": "sha1-yOBGun6q5JEdfnHislt3b8w1dZs=", + "dev": true, + "license": "MIT", + "dependencies": { + "@discoveryjs/json-ext": "^0.5.0", + "@webpack-cli/configtest": "^2.1.1", + "@webpack-cli/info": "^2.0.2", + "@webpack-cli/serve": "^2.0.5", + "colorette": "^2.0.14", + "commander": "^10.0.1", + "cross-spawn": "^7.0.3", + "envinfo": "^7.7.3", + "fastest-levenshtein": "^1.0.12", + "import-local": "^3.0.2", + "interpret": "^3.1.1", + "rechoir": "^0.8.0", + "webpack-merge": "^5.7.3" + }, + "bin": { + "webpack-cli": "bin/cli.js" + }, + "engines": { + "node": ">=14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "5.x.x" + }, + "peerDependenciesMeta": { + "@webpack-cli/generators": { + "optional": true + }, + "webpack-bundle-analyzer": { + "optional": true + }, + "webpack-dev-server": { + "optional": true + } + } + }, + "node_modules/webpack-cli/node_modules/commander": { + "version": "10.0.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/commander/-/commander-10.0.1.tgz", + "integrity": "sha1-iB7ka0930cHczFgjQzqjmwIsvgY=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "node_modules/webpack-merge": { + "version": "5.10.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/webpack-merge/-/webpack-merge-5.10.0.tgz", + "integrity": "sha1-o61ddzJB6caCgDq/Yo1M1iuKQXc=", + "dev": true, + "license": "MIT", + "dependencies": { + "clone-deep": "^4.0.1", + "flat": "^5.0.2", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/webpack-sources": { + "version": "3.5.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/webpack-sources/-/webpack-sources-3.5.1.tgz", + "integrity": "sha1-dsJBhIbcwCsqoGlMEEF2woWP6Eo=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/whatwg-mimetype": { + "version": "2.3.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", + "integrity": "sha1-PUseAxLSB5h5+Cav8Y2+7KWWD78=", + "dev": true, + "license": "MIT" + }, + "node_modules/whatwg-url": { + "version": "8.7.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/whatwg-url/-/whatwg-url-8.7.0.tgz", + "integrity": "sha1-ZWp45RD/jzk3vAvL6fXArDWUG3c=", + "dev": true, + "license": "MIT", + "dependencies": { + "lodash": "^4.7.0", + "tr46": "^2.1.0", + "webidl-conversions": "^6.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/which/-/which-2.0.2.tgz", + "integrity": "sha1-fGqN0KY2oDJ+ELWckobu6T8/UbE=", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wildcard": { + "version": "2.0.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/wildcard/-/wildcard-2.0.1.tgz", + "integrity": "sha1-WrENAkhxmJVINrY0n3T/+WHhD2c=", + "dev": true, + "license": "MIT" + }, + "node_modules/worker-loader": { + "version": "3.0.8", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/worker-loader/-/worker-loader-3.0.8.tgz", + "integrity": "sha1-X8XNpKPTFj2cJ0pOOoEc6LYNuzc=", + "dev": true, + "license": "MIT", + "dependencies": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/worker-loader/node_modules/ajv": { + "version": "6.15.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha1-B+mCx0YmFnqnoklcU4F4ktcTlJI=", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/worker-loader/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha1-MfKdpatuANHC0yms97WSlhTVAU0=", + "dev": true, + "license": "MIT", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/worker-loader/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha1-afaofZUTq4u4/mO9sJecRI5oRmA=", + "dev": true, + "license": "MIT" + }, + "node_modules/worker-loader/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha1-9QqIh3w8AWUqFbYirp6Xld96YP4=", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha1-VtwiNo7lcPrOG0mBmXXZuaXq0hQ=", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha1-Z+FFz/UQpqaYS98RUpEdadLrnkM=", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha1-CCyyyJyf6GWaMRpTvWpNxTAdswQ=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha1-7dgDYornHATIWuegkG7a00tkiTc=", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha1-ctOmjVmMm9s68q0ehPIdiWq9TeM=", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha1-wqCah6y95pVD3m9j+jmVyCbFNqI=", + "dev": true, + "license": "MIT" + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha1-6Bj9ac5cz8tARZT4QpY79TFkzDc=", + "dev": true, + "license": "MIT" + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha1-JpxxF9J7Ba0uU2gwqOyJXvnG0BA=", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha1-nibGPTD1NEPpSJSVshBdN7Z6hdk=", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha1-wETV3MUhoHZBNHJZehrLHxA8QEE=", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true, + "license": "ISC" + }, + "node_modules/ws": { + "version": "8.21.3", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/ws/-/ws-8.21.3.tgz", + "integrity": "sha1-ZgtPrdtqPldchuB4EmkZlh9N5Pw=", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/y-protocols": { + "version": "1.0.7", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/y-protocols/-/y-protocols-1.0.7.tgz", + "integrity": "sha1-ZjHEkudbeLOmE1OmAGfm+KTDjV8=", + "license": "MIT", + "dependencies": { + "lib0": "^0.2.85" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=8.0.0" + }, + "funding": { + "type": "GitHub Sponsors ❤", + "url": "https://github.com/sponsors/dmonad" + }, + "peerDependencies": { + "yjs": "^13.0.0" + } + }, + "node_modules/yjs": { + "version": "13.6.32", + "resolved": "https://ms-feed-25.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/yjs/-/yjs-13.6.32.tgz", + "integrity": "sha1-hZ3KSNeyZlxvS3pEgel7cqsp57I=", + "license": "MIT", + "dependencies": { + "lib0": "^0.2.99" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">=8.0.0" + }, + "funding": { + "type": "GitHub Sponsors ❤", + "url": "https://github.com/sponsors/dmonad" + } + } + } +} diff --git a/sdk/python/python/labextension/package.json b/sdk/python/python/labextension/package.json new file mode 100644 index 00000000..b3292a56 --- /dev/null +++ b/sdk/python/python/labextension/package.json @@ -0,0 +1,41 @@ +{ + "name": "taugrid-jupyterlab", + "version": "0.1.0", + "description": "Native TauGrid RayJob status console for JupyterLab, with notebook submission gated.", + "keywords": ["jupyter", "jupyterlab", "jupyterlab-extension", "taugrid", "ray", "kubernetes"], + "license": "MIT", + "author": "TauGrid maintainers", + "main": "lib/index.js", + "types": "lib/index.d.ts", + "style": "style/index.css", + "files": ["lib/**/*.{js,js.map,d.ts,d.ts.map}", "style/**/*.{css,js,js.map}"], + "scripts": { + "build": "npm run build:lib && npm run build:labextension", + "build:labextension": "node tools/build-labextension.cjs", + "build:lib": "tsc", + "clean": "rimraf lib tsconfig.tsbuildinfo", + "test": "node --test tests/console.test.cjs" + }, + "dependencies": { + "@jupyterlab/application": "^4.0.0", + "@jupyterlab/apputils": "^4.0.0", + "@jupyterlab/coreutils": "^6.0.0", + "@jupyterlab/launcher": "^4.0.0", + "@jupyterlab/notebook": "^4.0.0", + "@jupyterlab/services": "^7.0.0", + "@lumino/widgets": "^2.0.0", + "react": "^18.2.0", + "react-dom": "^18.2.0" + }, + "devDependencies": { + "@jupyterlab/builder": "^4.0.0", + "@types/react": "^18.2.0", + "@types/react-dom": "^18.2.0", + "rimraf": "^5.0.0", + "typescript": "~5.3.0" + }, + "jupyterlab": { + "extension": true, + "outputDir": "../tau/labextension" + } +} diff --git a/sdk/python/python/labextension/src/api.ts b/sdk/python/python/labextension/src/api.ts new file mode 100644 index 00000000..32b6dbc4 --- /dev/null +++ b/sdk/python/python/labextension/src/api.ts @@ -0,0 +1,66 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +import { URLExt } from '@jupyterlab/coreutils'; +import { ServerConnection } from '@jupyterlab/services'; +import { RunTarget } from './model'; + +export type ApiQuery = Partial & { queue?: string; pod?: string; container?: string; tail?: string; previous?: string; timestamps?: string; includeMetrics?: string; path?: string }; + +export function apiUrl(path: string, target?: ApiQuery): string { + const settings = ServerConnection.makeSettings(); + const query = target ? `?${new URLSearchParams(Object.entries(target).filter(([, value]) => value !== undefined) as [string, string][])}` : ''; + return URLExt.join(settings.baseUrl, 'taugrid', 'api', path) + query; +} + +async function request(path: string, init: RequestInit, target?: ApiQuery): Promise { + const settings = ServerConnection.makeSettings(); + const controller = new AbortController(); + const abort = (): void => controller.abort(); + init.signal?.addEventListener('abort', abort, { once: true }); + if (init.signal?.aborted) { controller.abort(); } + let timedOut = false; + const timeout = window.setTimeout(() => { timedOut = true; controller.abort(); }, 30000); + try { + const response = await ServerConnection.makeRequest(apiUrl(path, target), { + ...init, signal: controller.signal, cache: 'no-store', + headers: { Accept: 'application/json', ...(init.headers || {}) } + }, settings); + const text = await response.text(); + let body: unknown = undefined; + try { + body = text ? JSON.parse(text) : undefined; + } catch { + if (response.ok) { + throw new Error('The Jupyter server did not return status JSON. Check your sign-in and the TauGrid server extension.'); + } + body = text; + } + if (!response.ok) { + const detail = typeof body === 'object' && body !== null && typeof (body as Record).message === 'string' + ? String((body as Record).message) + : `HTTP ${response.status}`; + throw new Error(detail); + } + return body as T; + } catch (error) { + if (timedOut) { throw new Error('The Jupyter server did not respond within 30 seconds. Check its connection and retry.'); } + throw error; + } finally { + window.clearTimeout(timeout); + init.signal?.removeEventListener('abort', abort); + } +} + +export function apiGet(path: string, target?: ApiQuery, signal?: AbortSignal): Promise { + return request(path, { method: 'GET', signal }, target); +} + +export function apiPost(path: string, body: unknown, signal?: AbortSignal): Promise { + return request(path, { + method: 'POST', + body: JSON.stringify(body ?? {}), + headers: { 'Content-Type': 'application/json' }, + signal + }); +} diff --git a/sdk/python/python/labextension/src/explorer.tsx b/sdk/python/python/labextension/src/explorer.tsx new file mode 100644 index 00000000..399cb789 --- /dev/null +++ b/sdk/python/python/labextension/src/explorer.tsx @@ -0,0 +1,134 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +import * as React from 'react'; +import { apiGet } from './api'; +import { LogSnapshot, parseLogs, parseRuns, portalLink, RunList, RunStatus, RunTarget } from './model'; +import { SnapshotRequest, SnapshotState } from './snapshot'; + +function useSnapshot(): [SnapshotState, React.MutableRefObject | null>] { + const [state, setState] = React.useState>({ busy: false, value: null, error: null }); + const request = React.useRef | null>(null); + React.useEffect(() => { + const current = new SnapshotRequest(setState); + request.current = current; + return () => { current.dispose(); request.current = null; }; + }, []); + return [state, request]; +} + +export function RunRows({ result, onSelect }: { result: RunList; onSelect: (target: RunTarget) => void }): JSX.Element { + const partial = result.truncated || result.warnings.length > 0; + return

; +} + +export function RunBrowser({ namespace, onSelect, portalUrl }: { namespace: string; onSelect: (target: RunTarget) => void; portalUrl: string | null }): JSX.Element { + const [queue, setQueue] = React.useState(''); + const [state, request] = useSnapshot(); + const id = React.useId(); + const link = portalLink(portalUrl); + const namespaceValue = namespace.trim(); + const reload = React.useCallback((): void => { + if (!namespaceValue) { request.current?.reset(); return; } + void request.current?.load(async signal => + parseRuns(await apiGet('runs', { namespace: namespaceValue, queue: queue.trim() }, signal))); + }, [namespaceValue, queue]); + // The list follows the namespace and queue without a submit: the sidebar's job + // is to show what is there. Debounced so typing a namespace does not fire a + // request per keystroke. + React.useEffect(() => { + const timer = window.setTimeout(reload, 250); + return () => window.clearTimeout(timer); + }, [reload]); + return
+

Live runs

+

Tau-managed Jobs and RayJobs in {namespaceValue || '(enter a namespace)'}, newest first. This is live cluster state, not durable history.

+
{ event.preventDefault(); reload(); }}> + + +
+
{state.busy ? 'Reading live runs...' : state.value ? `${state.value.runs.length} matching runs returned.` : ''}
+ {state.error &&

{state.error}

} + {state.value && } + {link &&
Open configured portal for history (new tab)} +
; +} + +export function LogContent({ value }: { value: LogSnapshot }): JSX.Element { + return
+

Snapshot for {value.pod}/{value.container}. {value.possiblyTruncated ? 'Byte limit reached; output may be truncated.' : 'Only the requested tail is shown; older lines may exist.'}

+
{value.text || '(No log lines returned)'}
+
; +} + +export function LogViewer({ status }: { status: RunStatus }): JSX.Element { + const pods = status.pods.filter(pod => pod.containers?.length); + const [pod, setPod] = React.useState(pods[0]?.name || ''); + const selected = pods.find(item => item.name === pod); + const [container, setContainer] = React.useState(selected?.containers?.[0] || ''); + const [tail, setTail] = React.useState('200'); + const [previous, setPrevious] = React.useState(false); + const [timestamps, setTimestamps] = React.useState(false); + const [state, request] = useSnapshot(); + const id = React.useId(); + const load = (event: React.FormEvent): void => { + event.preventDefault(); + void request.current?.load(async signal => parseLogs(await apiGet('logs', { + namespace: status.namespace, name: status.name, kind: status.kind || 'RayJob', + pod, container, tail, previous: String(previous), timestamps: String(timestamps) + }, signal))); + }; + return
+

Container logs

+

Manual snapshot only, at most 64 KiB. No streaming, automatic log checks or durable log archive.

+ {!pods.length ?

No verified pod/container choices. Refresh run status to retry discovery.

:
+ + + + + + +
} +
{state.busy ? 'Reading bounded log snapshot...' : ''}
+ {state.error &&

{state.error}

} + {state.value && } +
; +} diff --git a/sdk/python/python/labextension/src/index.ts b/sdk/python/python/labextension/src/index.ts new file mode 100644 index 00000000..1c43a50e --- /dev/null +++ b/sdk/python/python/labextension/src/index.ts @@ -0,0 +1,121 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +import * as React from 'react'; +import { ILayoutRestorer, JupyterFrontEnd, JupyterFrontEndPlugin } from '@jupyterlab/application'; +import { Dialog, ICommandPalette, ReactWidget, showDialog, ToolbarButton, WidgetTracker } from '@jupyterlab/apputils'; +import { ILauncher } from '@jupyterlab/launcher'; +import { INotebookTracker, NotebookPanel } from '@jupyterlab/notebook'; +import { RunTarget } from './model'; +import { SubmissionConfirmation, SubmissionReview } from './submitview'; +import { About, NotebookHandle, RunDetail, RunLogs, RunsSidebar, runWidgetId, SurfaceWidget } from './widget'; + +const plugin: JupyterFrontEndPlugin = { + id: 'taugrid:plugin', + description: 'TauGrid runs and notebook submission', + autoStart: true, + optional: [ILayoutRestorer, ILauncher, ICommandPalette, INotebookTracker], + activate: (app: JupyterFrontEnd, restorer: ILayoutRestorer | null, launcher: ILauncher | null, palette: ICommandPalette | null, notebooks: INotebookTracker | null): void => { + const tracker = new WidgetTracker({ namespace: 'taugrid-runs' }); + const runTabs = new Map(); + const identities = new WeakMap(); + const reviews = new WeakMap(); + const about = (): void => { void showDialog({ title: 'About TauGrid', body: ReactWidget.create(React.createElement(About)), buttons: [Dialog.okButton({ label: 'Close' })] }); }; + const openRun = async (target: RunTarget, surface = 'detail'): Promise => { + const id = runWidgetId(target, surface); + let widget = runTabs.get(id); + if (!widget || widget.isDisposed) { + widget = new SurfaceWidget(surface === 'logs' ? React.createElement(RunLogs, { target }) : React.createElement(RunDetail, { target, onOpenLogs: identity => { void openRun(identity, 'logs'); } })); + widget.id = id; + widget.title.label = (surface === 'logs' ? 'Logs: ' : (target.kind || 'RayJob') + ': ') + target.name; + widget.title.caption = target.namespace + '/' + target.kind + '/' + target.name; + widget.title.closable = true; + runTabs.set(id, widget); + identities.set(widget, { ...target, surface }); + widget.disposed.connect(() => { runTabs.delete(id); }); + } + if (!widget.isAttached) app.shell.add(widget, 'main'); + if (!tracker.has(widget)) await tracker.add(widget); + if (!widget.isDisposed) app.shell.activateById(widget.id); + }; + const sidebar = new SurfaceWidget(React.createElement(RunsSidebar, { onOpenRun: target => { void openRun(target); }, onAbout: about })); + sidebar.id = 'taugrid-runs'; + sidebar.title.label = 'TauGrid'; + sidebar.title.caption = 'TauGrid runs'; + sidebar.title.closable = false; + app.shell.add(sidebar, 'left', { rank: 700 }); + restorer?.add(sidebar, 'taugrid-runs'); + app.commands.addCommand('taugrid:open', { + label: 'TauGrid: Open runs', + execute: () => { app.shell.activateById(sidebar.id); } + }); + app.commands.addCommand('taugrid:open-run', { + label: 'TauGrid: Open run details', + execute: args => { + if (typeof args.namespace !== 'string' || !args.namespace.trim() || typeof args.name !== 'string' || !args.name.trim()) return; + if (args.kind !== undefined && args.kind !== 'Job' && args.kind !== 'RayJob') return; + return openRun({ namespace: args.namespace.trim(), name: args.name.trim(), kind: args.kind || 'RayJob' }, args.surface === 'logs' ? 'logs' : 'detail'); + } + }); + if (restorer) void restorer.restore(tracker, { + command: 'taugrid:open-run', + args: widget => ({ ...identities.get(widget)! }), + name: widget => widget.id + }); + const openReview = (panel: NotebookPanel): void => { + if (panel.isDisposed) return; + let widget = reviews.get(panel); + if (!widget || widget.isDisposed) { + const path = panel.context.path; + const notebook: NotebookHandle = { + name: path, + toJSON: () => { + if (panel.isDisposed) throw new Error('The source notebook was closed. Reopen it and start a new submission review.'); + if (panel.context.path !== path) throw new Error('The source notebook was renamed. Close this review and submit again from the notebook toolbar.'); + return JSON.stringify(panel.context.model.toJSON()); + } + }; + widget = new SurfaceWidget(React.createElement(SubmissionReview, { + notebook, + onAbout: about, + onOpenRun: target => { void openRun(target); }, + onConfirm: async plan => { + const result = await showDialog({ title: 'Confirm submission', body: ReactWidget.create(React.createElement(SubmissionConfirmation, { plan })), buttons: [Dialog.cancelButton(), Dialog.okButton({ label: 'Confirm submission' })] }); + return result.button.accept; + } + })); + widget.id = 'taugrid-review-' + panel.id; + widget.title.label = 'Submit: ' + path.split('/').pop(); + widget.title.caption = 'Review submission for ' + path; + widget.title.closable = true; + reviews.set(panel, widget); + } + if (!widget.isAttached) app.shell.add(widget, 'main'); + app.shell.activateById(widget.id); + }; + const activeNotebook = (): NotebookPanel | null => { + const panel = notebooks?.currentWidget; + return panel && !panel.isDisposed && app.shell.currentWidget === panel ? panel : null; + }; + app.commands.addCommand('taugrid:submit-notebook', { + label: 'TauGrid: Submit current notebook', + isEnabled: () => !!activeNotebook(), + execute: () => { const panel = activeNotebook(); if (panel) openReview(panel); } + }); + app.commands.addCommand('taugrid:about', { label: 'TauGrid: About', execute: about }); + const toolbarPanels = new WeakSet(); + const addToolbar = (panel: NotebookPanel): void => { + if (toolbarPanels.has(panel)) return; + toolbarPanels.add(panel); + panel.toolbar.addItem('taugrid-submit', new ToolbarButton({ label: 'Submit to TauGrid', tooltip: 'Review this notebook before submitting to TauGrid', onClick: () => openReview(panel) })); + }; + notebooks?.forEach(addToolbar); + notebooks?.widgetAdded.connect((sender, panel) => addToolbar(panel)); + app.shell.currentChanged?.connect(() => app.commands.notifyCommandChanged('taugrid:submit-notebook')); + notebooks?.currentChanged.connect(() => app.commands.notifyCommandChanged('taugrid:submit-notebook')); + for (const command of ['taugrid:open', 'taugrid:submit-notebook', 'taugrid:about']) palette?.addItem({ command, category: 'TauGrid' }); + launcher?.add({ command: 'taugrid:open', category: 'TauGrid', rank: 12 }); + } +}; + +export default plugin; diff --git a/sdk/python/python/labextension/src/loss.tsx b/sdk/python/python/labextension/src/loss.tsx new file mode 100644 index 00000000..4eedb95c --- /dev/null +++ b/sdk/python/python/labextension/src/loss.tsx @@ -0,0 +1,47 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +import * as React from 'react'; +import { LossMetrics } from './model'; + +export function LossSection({ metrics, stale = false }: { metrics?: LossMetrics; stale?: boolean }): JSX.Element { + const id = React.useId(); + const samples = metrics?.samples || []; + const minimum = samples.length ? Math.min(...samples.map(sample => sample.value)) : 0; + const maximum = samples.length ? Math.max(...samples.map(sample => sample.value)) : 0; + const scale = Math.max(Math.abs(minimum), Math.abs(maximum), 1); + const span = maximum / scale - minimum / scale; + const first = samples[0]?.step || 0; + const last = samples[samples.length - 1]?.step || first; + const points = samples.map(sample => ({ + x: last === first ? 334 : 60 + 548 * ((sample.step - first) / (last - first)), + y: span === 0 ? 126 : 222 - 192 * ((sample.value / scale - minimum / scale) / span), + ...sample + })); + return
+

Loss

+

{metrics?.source ? Object.entries(metrics.source).map(([key, value]) => `${key}: ${value}`).join(' / ') : 'No loss source available.'}

+

{stale || metrics?.stale ? 'Stale evidence. ' : ''}{metrics?.checkedAt ? `Source checked ${metrics.checkedAt}. ` : 'Source not checked. '}{samples.length} samples{samples.length ? `; steps ${first} to ${last}` : ''}.

+ {metrics?.possiblyTruncated &&

Partial window, not complete training history. {metrics.truncationReasons.join(', ')}. Limit: {metrics.limitBytes} bytes / {metrics.maxPoints} points.

} + {metrics?.coverage &&

Source coverage: {JSON.stringify(metrics.coverage)}

} + {metrics?.message &&

{metrics.message}

} + {samples.length ? <> + + Observed loss by step + {samples.length} observed samples, steps {first} through {last}; loss {minimum} to {maximum}. Straight lines connect observations, not interpolated samples. Exact values are in the sample table. + + {points.length > 1 && `${point.x},${point.y}`).join(' ')} fill="none" stroke="currentColor" strokeWidth="2" />} + {points.map(point => )} + Step + Loss + {first}{last} + +

Loss range: {minimum} to {maximum}.

+
Show observed loss samples ({samples.length}) +
+ {samples.map(sample => )} +
Observed loss samples
StepLoss
{sample.step}{sample.value}
+
+ :

No finite loss samples available. No curve is inferred.

} +
; +} diff --git a/sdk/python/python/labextension/src/model.ts b/sdk/python/python/labextension/src/model.ts new file mode 100644 index 00000000..b675a7c1 --- /dev/null +++ b/sdk/python/python/labextension/src/model.ts @@ -0,0 +1,298 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +export interface RunTarget { + namespace: string; + name: string; + kind?: 'Job' | 'RayJob'; +} + +export interface Phase { + key: string; + label: string; + state: 'done' | 'active' | 'pending' | 'warning' | 'unknown' | 'skipped'; + detail: string; + hint: string; +} + +export interface RunList { + runs: (RunTarget & { state: string; queue?: string | null; created?: string | null })[]; + warnings: string[]; + truncated: boolean; +} + +export interface LogSnapshot { + pod: string; + container: string; + text: string; + limitBytes: number; + possiblyTruncated: boolean; +} + +const isRecord = (entry: unknown): entry is Record => + typeof entry === 'object' && entry !== null && !Array.isArray(entry); +const strings = (entry: unknown): entry is string[] => Array.isArray(entry) && entry.every(value => typeof value === 'string'); +const count = (entry: unknown): boolean => typeof entry === 'number' && Number.isSafeInteger(entry) && entry >= 0; +const optionalText = (entry: Record, keys: string[]): boolean => + keys.every(key => entry[key] == null || typeof entry[key] === 'string'); +const kindValid = (entry: unknown): boolean => entry === 'Job' || entry === 'RayJob'; + +export function portalLink(value: unknown): string | null { + if (typeof value !== 'string' || /[\s\\]/.test(value)) { return null; } + try { + const url = new URL(value); + return ['http:', 'https:'].includes(url.protocol) && !url.username && !url.password ? url.href : null; + } catch { return null; } +} + +export function parseRuns(value: unknown): RunList { + if (!isRecord(value) || !Array.isArray(value.runs) || !strings(value.warnings) || typeof value.truncated !== 'boolean' || + !value.runs.every(row => isRecord(row) && typeof row.name === 'string' && typeof row.namespace === 'string' && + kindValid(row.kind) && typeof row.state === 'string' && ['queue', 'created'].every(key => row[key] == null || typeof row[key] === 'string'))) { + throw new Error('The Jupyter server returned an invalid run list.'); + } + return value as unknown as RunList; +} + +export function parseLogs(value: unknown): LogSnapshot { + if (!isRecord(value) || !['pod', 'container', 'text'].every(key => typeof value[key] === 'string') || + value.limitBytes !== 65536 || typeof value.possiblyTruncated !== 'boolean' || new TextEncoder().encode(value.text as string).length > 65536) { + throw new Error('The Jupyter server returned an invalid log snapshot.'); + } + return value as unknown as LogSnapshot; +} + +export interface RunStatus extends RunTarget { + uid?: string; + metrics?: LossMetrics; + phases?: Phase[]; + output?: { path?: string | null; pvc?: string | null; portalUrl?: string | null }; + existing: boolean; + state?: string | null; + displayState?: string | null; + rayClusterName?: string | null; + jobId?: string | null; + deploymentStatus?: string | null; + queue?: string | null; + admitted?: boolean | null; + message?: string | null; + readyPods: number; + totalPods: number; + terminal: boolean; + pods: { + name: string; + phase?: string | null; + node?: string | null; + ready: boolean; + restarts: number; + rayNodeType?: string | null; + role?: string | null; + uid?: string | null; + containers?: string[]; + }[]; + diagnostics: { + code: string; + severity: string; + message: string; + suggestion?: string | null; + }[]; +} + +export function parseRunStatus(value: unknown): RunStatus { + const output = isRecord(value) ? value.output : undefined; + if (isRecord(value) && ( + !(value.kind == null || kindValid(value.kind)) || + !(value.phases == null || (Array.isArray(value.phases) && value.phases.every(phase => isRecord(phase) && + ['key', 'label', 'detail', 'hint'].every(key => typeof phase[key] === 'string') && + ['done', 'active', 'pending', 'warning', 'unknown', 'skipped'].includes(String(phase.state))))) || + !(output == null || (isRecord(output) && ['path', 'pvc', 'portalUrl'].every(key => output[key] == null || typeof output[key] === 'string'))) || + (Array.isArray(value.pods) && value.pods.some(pod => isRecord(pod) && pod.containers != null && !strings(pod.containers))) + )) { throw new Error('The Jupyter server returned an invalid run status.'); } + const count = (entry: unknown): boolean => + typeof entry === 'number' && Number.isSafeInteger(entry) && entry >= 0; + if (!isRecord(value) || typeof value.name !== 'string' || typeof value.namespace !== 'string' || + typeof value.existing !== 'boolean' || typeof value.terminal !== 'boolean' || + !count(value.readyPods) || !count(value.totalPods) || + !(value.admitted == null || typeof value.admitted === 'boolean') || + !optionalText(value, ['state', 'displayState', 'rayClusterName', 'jobId', 'deploymentStatus', 'queue', 'message']) || + !Array.isArray(value.pods) || !value.pods.every(pod => isRecord(pod) && + typeof pod.name === 'string' && typeof pod.ready === 'boolean' && count(pod.restarts) && + optionalText(pod, ['phase', 'node', 'rayNodeType'])) || + !Array.isArray(value.diagnostics) || !value.diagnostics.every(note => isRecord(note) && + typeof note.code === 'string' && typeof note.severity === 'string' && typeof note.message === 'string' && + optionalText(note, ['suggestion']))) { + throw new Error('The Jupyter server returned invalid run status. Check the TauGrid server extension version and retry.'); + } + return { ...value, ...(value.metrics === undefined ? {} : { metrics: parseMetrics(value.metrics) }) } as unknown as RunStatus; +} + +export interface LossMetrics { + state: 'ready' | 'empty' | 'unavailable' | 'error'; + source: Record | null; + samples: { step: number; value: number }[]; + checkedAt: string | null; + stale: boolean; + limitBytes: number; + maxPoints: number; + possiblyTruncated: boolean; + truncationReasons: string[]; + message: string; + coverage?: Record | null; +} + +export function parseMetrics(value: unknown): LossMetrics { + if (isRecord(value) && ['ready', 'empty', 'unavailable', 'error'].includes(String(value.state)) && + (value.source === null || (isRecord(value.source) && Object.values(value.source).every(entry => typeof entry === 'string'))) && + Array.isArray(value.samples) && value.samples.length <= 512 && value.samples.every((sample, index, samples) => + isRecord(sample) && typeof sample.step === 'number' && Number.isSafeInteger(sample.step) && sample.step >= 0 && + typeof sample.value === 'number' && Number.isFinite(sample.value) && (index === 0 || sample.step > samples[index - 1].step)) && + (value.checkedAt === null || (typeof value.checkedAt === 'string' && Number.isFinite(Date.parse(value.checkedAt)))) && + typeof value.stale === 'boolean' && value.limitBytes === 65536 && value.maxPoints === 512 && + typeof value.possiblyTruncated === 'boolean' && strings(value.truncationReasons) && typeof value.message === 'string' && + (value.coverage == null || isRecord(value.coverage))) return value as unknown as LossMetrics; + return { state: 'error', source: null, samples: [], checkedAt: null, stale: true, limitBytes: 65536, maxPoints: 512, + possiblyTruncated: true, truncationReasons: [], message: 'Invalid metrics evidence from the server. Lifecycle status remains available.' }; +} + +export function describeRun(status: RunStatus): { + label: string; + detail: string; + tone: 'neutral' | 'info' | 'warning' | 'error' | 'success'; +} { + switch (status.state?.toLowerCase()) { + case 'queued': + return { + label: status.admitted === false ? 'Waiting for admission' : 'Queued', + detail: status.admitted === false + ? 'Kueue has not admitted this run. Check queue capacity and the admission diagnostics.' + : 'Execution is not running yet. Check admission and pod scheduling below.', + tone: 'warning' + }; + case 'running': + return { + label: 'Running', + detail: 'The workload reports an active run. Pod readiness is not a measure of training health.', + tone: 'info' + }; + case 'failed': + return { + label: 'Failed', + detail: 'The run stopped with an error. Start with the diagnostics and inspect the affected pod logs.', + tone: 'error' + }; + case 'complete': + return { + label: 'Finished', + detail: 'The workload reports completion. Retrieve outputs from the run\'s configured storage.', + tone: 'success' + }; + case 'not_submitted': + return { + label: 'No such run', + detail: 'No workload was found. Check the kind, namespace and exact resource name, then check the run again.', + tone: 'neutral' + }; + default: + return { + label: 'Unreachable', + detail: 'Run status could not be determined. Check the Jupyter server\'s cluster connection and read permissions, then retry.', + tone: 'error' + }; + } +} + +export function canWatch(status: RunStatus | null): boolean { + return Boolean(status?.existing && !status.terminal && + ['running', 'queued'].includes(status.state?.toLowerCase() || '')); +} + +export interface SubmitPlanSummary { + submissionMode?: string; + retentionSeconds?: number; + submitterImage?: string; + name: string; + namespace: string; + queue: string; + profile: string; + planDigest: string; + payloadDigest: string; + notebookBytes: number; + preparedBytes: number; + encodedEnvBytes: number; + excludedCells: string[]; + /** Files chosen in the review to ship beside the notebook. */ + includedFiles?: string[]; +} + +export interface SubmitPreview { + submittable: boolean; + submissionEnabled: boolean; + plan: SubmitPlanSummary; +} + +export interface SubmitResponse { + submitted: boolean; + name: string; + namespace: string; + kind: string; + payloadDigest: string; + plan: SubmitPlanSummary; +} + +export interface NamespaceRow { + name: string; + tauEnabled: boolean; +} + +export interface NamespaceList { + namespaces: NamespaceRow[]; + warnings: string[]; +} + +export function parseNamespaces(value: unknown): NamespaceList { + if (!isRecord(value) || !Array.isArray(value.namespaces)) { + throw new Error('invalid namespace list'); + } + const namespaces = value.namespaces.map(entry => { + if (!isRecord(entry) || typeof entry.name !== 'string' || typeof entry.tauEnabled !== 'boolean') { + throw new Error('invalid namespace row'); + } + return { name: entry.name, tauEnabled: entry.tauEnabled }; + }); + const warnings = Array.isArray(value.warnings) ? value.warnings.filter((item): item is string => typeof item === 'string') : []; + return { namespaces, warnings }; +} + +export interface Capabilities { + submissionEnabled: boolean; + submissionImplemented: boolean; + portalUrl: string | null; +} + +export function parseCapabilities(value: unknown): Capabilities { + if (!isRecord(value) || typeof value.submissionEnabled !== 'boolean' || typeof value.submissionImplemented !== 'boolean') { + throw new Error('The Jupyter server returned invalid capabilities.'); + } + return { submissionEnabled: value.submissionEnabled, submissionImplemented: value.submissionImplemented, portalUrl: portalLink(value.portalUrl) }; +} + +export function parseSubmitPreview(value: unknown): SubmitPreview { + const plan = isRecord(value) ? value.plan : null; + if (!isRecord(value) || value.submittable !== true || typeof value.submissionEnabled !== 'boolean' || !isRecord(plan) || + !['name', 'namespace', 'queue', 'profile', 'payloadDigest'].every(key => typeof plan[key] === 'string' && Boolean(plan[key])) || + typeof plan.planDigest !== 'string' || !/^[a-f0-9]{64}$/.test(plan.planDigest) || + !['notebookBytes', 'preparedBytes', 'encodedEnvBytes'].every(key => count(plan[key])) || !strings(plan.excludedCells) || + !(plan.includedFiles == null || strings(plan.includedFiles)) || + !optionalText(plan, ['submissionMode', 'submitterImage']) || !(plan.retentionSeconds == null || count(plan.retentionSeconds))) { + throw new Error('The Jupyter server returned an invalid submission preview.'); + } + return value as unknown as SubmitPreview; +} + +export function parseSubmitResponse(value: unknown, plan: SubmitPlanSummary): SubmitResponse { + if (!isRecord(value) || value.submitted !== true || value.name !== plan.name || value.namespace !== plan.namespace || + value.kind !== 'RayJob' || value.payloadDigest !== plan.payloadDigest || !isRecord(value.plan) || value.plan.planDigest !== plan.planDigest) { + throw new Error('The Jupyter server did not confirm the reviewed run. Inspect the planned run before trying again.'); + } + return value as unknown as SubmitResponse; +} diff --git a/sdk/python/python/labextension/src/monitor.ts b/sdk/python/python/labextension/src/monitor.ts new file mode 100644 index 00000000..49069526 --- /dev/null +++ b/sdk/python/python/labextension/src/monitor.ts @@ -0,0 +1,132 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +import { canWatch, RunStatus, RunTarget } from './model'; + +export interface MonitorState { + target: RunTarget | null; + status: RunStatus | null; + error: string | null; + busy: boolean; + watching: boolean; + checkedAt: number | null; + watchMessage?: string; +} + +interface Clock { + set(callback: () => void): number; + clear(handle: number): void; + now(): number; +} + +export class RunMonitor { + state: MonitorState = { + target: null, status: null, error: null, busy: false, watching: false, checkedAt: null + }; + private timer: number | undefined; + private request: AbortController | null = null; + private disposed = false; + private autoStarted = false; + private watchStarted: number | null = null; + + constructor( + private read: (target: RunTarget, signal: AbortSignal) => Promise, + private changed: (state: MonitorState) => void, + private clock: Clock = { + set: callback => window.setTimeout(callback, 10000), + clear: handle => window.clearTimeout(handle), + now: () => Date.now() + }, + private autoWatch = false + ) {} + + lookup(target: RunTarget): void { + if (this.disposed) { return; } + this.request?.abort(); + this.autoStarted = false; + this.watchStarted = null; + this.request = null; + this.clearTimer(); + this.state = { + target, status: null, error: null, busy: false, watching: false, checkedAt: null + }; + this.refresh(); + } + + refresh(): void { + if (this.disposed || this.request || !this.state.target) { return; } + this.clearTimer(); + const request = new AbortController(); + this.request = request; + this.publish({ busy: true }); + void this.read(this.state.target, request.signal).then(status => { + if (this.disposed || this.request !== request) { return; } + const now = this.clock.now(); + let watching = this.state.watching && canWatch(status); + let watchMessage = this.state.watchMessage; + if (this.autoWatch && !this.autoStarted && canWatch(status)) { + this.autoStarted = true; + this.watchStarted = now; + watching = true; + } + if (watching && this.watchStarted !== null && now - this.watchStarted >= 3600000) { + watching = false; + watchMessage = 'Watching paused after one hour. Start watching to continue.'; + } + if (status.terminal) { + watchMessage = 'Run finished. Automatic watch stopped; review final evidence and refresh to retry unavailable metrics.'; + } + this.publish({ status, error: null, checkedAt: now, watching, watchMessage }); + }).catch(error => { + if (this.disposed || this.request !== request) { return; } + this.publish({ + error: error instanceof Error ? error.message : String(error), watching: false + }); + }).finally(() => { + if (this.disposed || this.request !== request) { return; } + this.request = null; + this.publish({ busy: false }); + this.schedule(); + }); + } + + setWatching(watching: boolean): void { + if (this.disposed) { return; } + this.autoStarted = true; + this.watchStarted = watching ? this.clock.now() : null; + this.publish({ watchMessage: watching ? undefined : 'Watching paused.' }); + this.clearTimer(); + this.publish({ watching: watching && !this.state.error && canWatch(this.state.status) }); + this.schedule(); + } + + dispose(): void { + this.disposed = true; + this.request?.abort(); + this.request = null; + this.clearTimer(); + } + + private publish(update: Partial): void { + this.state = { ...this.state, ...update }; + this.changed(this.state); + } + + private clearTimer(): void { + if (this.timer !== undefined) { this.clock.clear(this.timer); } + this.timer = undefined; + } + + private schedule(): void { + if (this.state.watching && !this.request && !this.disposed) { + this.timer = this.clock.set(() => { + this.timer = undefined; + if (this.watchStarted !== null && this.clock.now() - this.watchStarted >= 3600000) { + this.publish({ watching: false, watchMessage: 'Watching paused after one hour. Start watching to continue.' }); + return; + } + this.refresh(); + }); + } + } +} diff --git a/sdk/python/python/labextension/src/snapshot.ts b/sdk/python/python/labextension/src/snapshot.ts new file mode 100644 index 00000000..55a40c23 --- /dev/null +++ b/sdk/python/python/labextension/src/snapshot.ts @@ -0,0 +1,42 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +export interface SnapshotState { + busy: boolean; + value: T | null; + error: string | null; +} + +export class SnapshotRequest { + private controller: AbortController | null = null; + private disposed = false; + + constructor(private readonly changed: (state: SnapshotState) => void) {} + + reset(): void { + this.controller?.abort(); + this.controller = null; + if (!this.disposed) { this.changed({ busy: false, value: null, error: null }); } + } + + async load(read: (signal: AbortSignal) => Promise): Promise { + if (this.disposed) { return; } + this.reset(); + const controller = new AbortController(); + this.controller = controller; + this.changed({ busy: true, value: null, error: null }); + try { + const value = await read(controller.signal); + if (!controller.signal.aborted) { this.changed({ busy: false, value, error: null }); } + } catch (error) { + if (!controller.signal.aborted) { this.changed({ busy: false, value: null, error: error instanceof Error ? error.message : String(error) }); } + } finally { + if (this.controller === controller) { this.controller = null; } + } + } + + dispose(): void { + this.disposed = true; + this.reset(); + } +} diff --git a/sdk/python/python/labextension/src/submission.ts b/sdk/python/python/labextension/src/submission.ts new file mode 100644 index 00000000..724796e0 --- /dev/null +++ b/sdk/python/python/labextension/src/submission.ts @@ -0,0 +1,108 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +import { RunTarget, SubmitPlanSummary, SubmitPreview, parseSubmitPreview, parseSubmitResponse } from './model'; + +export interface SubmissionPayload { + notebook: string; + path: string; + namespace: string; + name?: string; + profile?: string; + queue?: string; + /** Files beside the notebook that should ship with it. */ + files?: string[]; +} + +export interface SubmissionState { + preview: SubmitPreview | null; + busy: boolean; + submitted: RunTarget | null; + attempted: RunTarget | null; + uncertain: boolean; + error: string | null; +} + +export class SubmissionSession { + state: SubmissionState = { preview: null, busy: false, submitted: null, attempted: null, uncertain: false, error: null }; + private request: AbortController | null = null; + private payload: SubmissionPayload | null = null; + private disposed = false; + private writing = false; + + constructor( + private post: (path: string, body: SubmissionPayload & { confirm?: boolean }, signal: AbortSignal) => Promise, + private changed: (state: SubmissionState) => void + ) {} + + async review(payload: SubmissionPayload): Promise { + if (this.disposed || this.writing || this.state.submitted) return; + this.invalidate(); + const request = new AbortController(); + this.request = request; + const captured = { ...payload }; + this.publish({ busy: true, error: null }); + try { + const preview = parseSubmitPreview(await this.post('preview', captured, request.signal)); + if (this.disposed || this.request !== request) return; + this.payload = captured; + this.publish({ preview }); + } catch (error) { + if (!this.disposed && this.request === request) this.publish({ error: String(error) }); + } finally { + if (!this.disposed && this.request === request) { + this.request = null; + this.publish({ busy: false }); + } + } + } + + async submit(plan: SubmitPlanSummary, confirmed: boolean, capabilityReady: boolean): Promise { + const preview = this.state.preview; + if (this.disposed || this.state.busy || this.state.submitted || !confirmed || !capabilityReady || + !preview?.submittable || !preview.submissionEnabled || preview.plan !== plan || !this.payload) return false; + const request = new AbortController(); + this.request = request; + this.writing = true; + const attempted: RunTarget = { namespace: plan.namespace, name: plan.name, kind: 'RayJob' }; + const payload = { ...this.payload, namespace: plan.namespace, name: plan.name, planDigest: plan.planDigest, confirm: true }; + this.payload = null; + this.publish({ preview: null, busy: true, error: null, attempted }); + try { + const result = parseSubmitResponse(await this.post('submit', payload, request.signal), plan); + if (this.disposed || this.request !== request) return false; + if (!result.submitted) throw new Error('The server did not confirm submission. Inspect the planned run before reviewing again.'); + this.publish({ submitted: { namespace: result.namespace, name: result.name, kind: result.kind === 'Job' ? 'Job' : 'RayJob' }, uncertain: false }); + return true; + } catch (error) { + if (!this.disposed && this.request === request) this.publish({ error: String(error), uncertain: true }); + return false; + } finally { + this.writing = false; + if (!this.disposed && this.request === request) { + this.request = null; + this.publish({ busy: false }); + } + } + } + + invalidate(): void { + if (this.disposed || this.writing) return; + this.request?.abort(); + this.request = null; + this.payload = null; + this.publish({ preview: null, busy: false, error: null }); + } + + dispose(): void { + this.disposed = true; + this.request?.abort(); + this.request = null; + this.payload = null; + } + + private publish(update: Partial): void { + this.state = { ...this.state, ...update }; + this.changed(this.state); + } +} diff --git a/sdk/python/python/labextension/src/submitview.tsx b/sdk/python/python/labextension/src/submitview.tsx new file mode 100644 index 00000000..bfb3f8b4 --- /dev/null +++ b/sdk/python/python/labextension/src/submitview.tsx @@ -0,0 +1,149 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +import * as React from 'react'; +import { apiGet, apiPost } from './api'; +import { RunTarget, SubmitPlanSummary } from './model'; +import { SubmissionSession, SubmissionState } from './submission'; +import { NotebookHandle, useCapabilities } from './widget'; + +interface FileCandidate { + name: string; + size: number; +} + +interface FileList { + files: FileCandidate[]; + warnings: string[]; + budgetBytes?: number; +} + +function parseFileList(value: unknown): FileList { + const record = (entry: unknown): entry is Record => + typeof entry === 'object' && entry !== null && !Array.isArray(entry); + if (!record(value) || !Array.isArray(value.files)) { + throw new Error('invalid file list'); + } + const files = value.files.map(entry => { + if (!record(entry) || typeof entry.name !== 'string' || typeof entry.size !== 'number') { + throw new Error('invalid file candidate'); + } + return { name: entry.name, size: entry.size }; + }); + const warnings = Array.isArray(value.warnings) ? value.warnings.filter((item): item is string => typeof item === 'string') : []; + return { files, warnings, budgetBytes: typeof value.budgetBytes === 'number' ? value.budgetBytes : undefined }; +} + +/** Files beside the notebook that could ship inside the workload. */ +function useNotebookFiles(path: string): { value: FileList | null; error: string | null } { + const [value, setValue] = React.useState(null); + const [error, setError] = React.useState(null); + React.useEffect(() => { + const request = new AbortController(); + setError(null); + void apiGet('files', { path }, request.signal) + .then(result => { if (!request.signal.aborted) { setValue(parseFileList(result)); } }) + .catch(reason => { if (!request.signal.aborted) { setError(String(reason)); } }); + return () => request.abort(); + }, [path]); + return { value, error }; +} + +export function SubmissionConfirmation({ plan }: { plan: SubmitPlanSummary }): JSX.Element { + return

Create RayJob {plan.namespace}/{plan.name} using the reviewed notebook snapshot?

+

Queue: {plan.queue || 'Not specified'}. Profile: {plan.profile || 'Not specified'}.

+

This creates a workload using the Jupyter server's credentials. Edits since review are not included.

; +} + +export function SubmissionReview({ notebook, onConfirm, onOpenRun, onAbout }: { + notebook: NotebookHandle; + onConfirm: (plan: SubmitPlanSummary) => Promise; + onOpenRun: (target: RunTarget) => void; + onAbout: () => void; +}): JSX.Element { + const [namespace, setNamespace] = React.useState('ray'); + const [name, setName] = React.useState(''); + const [profile, setProfile] = React.useState(''); + const [queue, setQueue] = React.useState(''); + const [state, setState] = React.useState({ preview: null, busy: false, submitted: null, attempted: null, uncertain: false, error: null }); + const [localError, setLocalError] = React.useState(null); + const [confirming, setConfirming] = React.useState(false); + const capabilities = useCapabilities(); + const candidates = useNotebookFiles(notebook.name); + const [selected, setSelected] = React.useState([]); + const session = React.useRef(null); + const confirmingRef = React.useRef(false); + const id = React.useId(); + React.useEffect(() => { + const current = new SubmissionSession(apiPost, setState); + session.current = current; + return () => { current.dispose(); session.current = null; }; + }, [notebook]); + const locked = state.busy || confirming || !!state.submitted; + const review = (): void => { + setLocalError(null); + session.current?.invalidate(); + try { + void session.current?.review({ notebook: notebook.toJSON(), path: notebook.name, namespace: namespace.trim(), name: name.trim() || undefined, profile: profile.trim() || undefined, queue: queue.trim() || undefined, files: selected.length ? selected : undefined }); + } catch (error) { setLocalError(String(error)); } + }; + const submit = async (): Promise => { + const current = session.current; + const plan = state.preview?.plan; + if (!current || !plan || confirmingRef.current) return; + confirmingRef.current = true; + setConfirming(true); + try { + const accepted = await onConfirm(plan); + if (session.current !== current) return; + await current.submit(plan, accepted, !!capabilities.value?.submissionEnabled && !!capabilities.value?.submissionImplemented); + } catch (error) { + if (session.current === current) setLocalError(String(error)); + } finally { + confirmingRef.current = false; + if (session.current === current) setConfirming(false); + } + }; + const plan = state.preview?.plan; + return
+

Submit notebook

{notebook.name}

+

This review belongs to this notebook. Review captures its current contents; later edits require a new review.

+
{ event.preventDefault(); review(); }}> + + + + + +
+ {candidates.value && (candidates.value.files.length > 0 || candidates.value.warnings.length > 0) &&
+

Files to ship

+

Files beside this notebook. They are embedded in the workload, so the whole payload is capped{candidates.value.budgetBytes ? ` at ${Math.round(candidates.value.budgetBytes / 1024)} KiB` : ''}; anything larger belongs in the runtime image.

+
    + {candidates.value.files.map(file =>
  • + +
  • )} +
+ {candidates.value.warnings.map((warning, index) =>

{warning}

)} +
} + {candidates.error &&

Could not list files beside this notebook, so only the notebook itself will ship.

} + {plan && plan.includedFiles?.length ?

Shipping with the notebook: {plan.includedFiles.join(', ')}

: null} +

{state.submitted ? 'Submitted' : confirming ? 'Awaiting confirmation or submission result...' : state.busy ? 'Reviewing submission...' : plan ? 'Plan ready. No workload has been created.' : 'Review a plan before submitting.'}

+ {capabilities.error ?

{capabilities.error}

: !capabilities.value ?

Checking submission availability...

: !capabilities.value.submissionEnabled || !capabilities.value.submissionImplemented ?

Submission is disabled on this server. You can still review a plan.

: null} + {(state.error || localError) &&

{localError || state.error}

} + {state.uncertain && state.attempted &&

The write outcome is uncertain. Inspect the planned run before reviewing or submitting again. Closing this tab does not cancel a server-side submission.

} + {plan && <>

Submission plan

+ {Object.entries({ Namespace: plan.namespace, 'Run name': plan.name, Queue: plan.queue || 'Not specified', Profile: plan.profile || 'Not specified', 'Payload digest': plan.payloadDigest, 'Notebook bytes': plan.notebookBytes, 'Prepared bytes': plan.preparedBytes, 'Encoded environment bytes': plan.encodedEnvBytes }).map(([label, value]) =>
{label}
{value}
)} +

Submission mode: {plan.submissionMode || 'Not reported'}. Retention: {plan.retentionSeconds ?? 'Not reported'} seconds. Submitter image: {plan.submitterImage || 'Not reported'}.

Excluded cells: {plan.excludedCells.length ? plan.excludedCells.join(', ') : 'None'}.

+ {!state.preview?.submittable &&

This plan cannot be submitted on this server.

}} + {!state.submitted && } + {state.submitted &&

Submitted {state.submitted.namespace}/{state.submitted.name}

} +
; +} \ No newline at end of file diff --git a/sdk/python/python/labextension/src/view.tsx b/sdk/python/python/labextension/src/view.tsx new file mode 100644 index 00000000..ef81af68 --- /dev/null +++ b/sdk/python/python/labextension/src/view.tsx @@ -0,0 +1,113 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +import * as React from 'react'; +import { describeRun, portalLink, RunStatus } from './model'; +import { LossSection } from './loss'; + +export function RunDetails({ status, stale, statusUrl }: { + status: RunStatus; + stale: boolean; + statusUrl: string; +}): JSX.Element { + const state = describeRun(status); + const unavailable = stale || state.label === 'Unreachable'; + const restarts = status.pods.reduce((total, pod) => total + pod.restarts, 0); + return ( +
+
+
+
+

{status.name}

+

Namespace {status.namespace}

+

{stale + ? 'The last check failed. Values below are from the last successful response, not the current cluster state.' + : state.detail}

+
+ + {status.existing &&
+
+
Admission
+
{status.admitted === true ? 'Admitted' : status.admitted === false ? 'Not admitted' : 'Not reported'}
+
Queue {status.queue || 'not reported'}
+
+
+
Pods
+
{status.readyPods} / {status.totalPods} ready
+
{restarts} restart{restarts === 1 ? '' : 's'} observed
+
+
+
Execution
+
{state.label}
+
Deployment {status.deploymentStatus || 'not reported'}
+
+
} + + {status.message &&

{status.message}

} + + {status.phases &&
+

Lifecycle evidence{stale ? ' (last known)' : ''}

+
    {status.phases.map(phase =>
  1. +
    {phase.label} {phase.state}
    +

    {phase.detail}

    {phase.hint &&

    Next action {phase.hint}

    } +
  2. )}
+
} + + + {status.output &&
+

Results

+

Recorded output path: {status.output.path || 'Not recorded'}

+

Recorded output PVC: {status.output.pvc || 'Not recorded'}

+

Metadata does not prove that files exist. This console does not download or proxy artifacts.

+ {portalLink(status.output.portalUrl) ? Open configured portal (new tab) : +

No portal configured. Use tau run get {status.name} with the appropriate namespace and CLI credentials.

} +
} + +
+
+

Diagnostics {status.diagnostics.length}

+ {status.diagnostics.length ?
    + {status.diagnostics.map((note, index) =>
  • + {note.severity} +

    {note.message}

    + {note.suggestion &&

    Next action {note.suggestion}

    } +
  • )} +
:

{unavailable + ? 'No diagnostics are available. Retry the status check.' + : 'No diagnostics returned. This does not confirm workload health.'}

} +
+ {status.existing &&
+

Pods {status.pods.length}

+ {status.pods.length ?
    + {status.pods.map(pod =>
  • +
    {pod.name} + {pod.ready ? 'Ready' : 'Not ready'} +
    +
    +
    Phase
    {pod.phase || 'Unknown'}
    +
    Role
    {pod.role || pod.rayNodeType || 'Not reported'}
    +
    Node
    {pod.node || 'Not assigned'}
    +
    Restarts
    {pod.restarts} restart{pod.restarts === 1 ? '' : 's'}
    +
    +
  • )} +
:

No pods returned. Check admission and diagnostics before assuming pods have not been created.

} +
} +
+ +
+ Run identifiers and source +
+
Ray cluster
{status.rayClusterName || 'Not reported'}
+
Ray job ID
{status.jobId || 'Not reported'}
+
Deployment
{status.deploymentStatus || 'Not reported'}
+
+ Open status JSON (new tab) +

Read through this Jupyter server. No Ray dashboard address is provided by the API.

+
+
+ ); +} diff --git a/sdk/python/python/labextension/src/widget.tsx b/sdk/python/python/labextension/src/widget.tsx new file mode 100644 index 00000000..6c3f3f70 --- /dev/null +++ b/sdk/python/python/labextension/src/widget.tsx @@ -0,0 +1,169 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +import * as React from 'react'; +import { ReactWidget } from '@jupyterlab/apputils'; +import { apiGet, apiUrl } from './api'; +import { LogViewer, RunBrowser } from './explorer'; +import { canWatch, Capabilities, NamespaceList, parseCapabilities, parseNamespaces, parseRunStatus, RunTarget } from './model'; +import { MonitorState, RunMonitor } from './monitor'; +import { RunDetails } from './view'; + +export interface NotebookHandle { + name: string; + toJSON: () => string; +} + + +export function useCapabilities(): { value: Capabilities | null; error: string | null; retry: () => void } { + const [value, setValue] = React.useState(null); + const [error, setError] = React.useState(null); + const [attempt, setAttempt] = React.useState(0); + React.useEffect(() => { + const request = new AbortController(); + setValue(null); + setError(null); + void apiGet('capabilities', undefined, request.signal).then(result => { + if (!request.signal.aborted) setValue(parseCapabilities(result)); + }).catch(reason => { + if (!request.signal.aborted) setError(String(reason)); + }); + return () => request.abort(); + }, [attempt]); + return { value, error, retry: () => setAttempt(current => current + 1) }; +} + +export function useNamespaces(): { value: NamespaceList | null; error: string | null } { + const [value, setValue] = React.useState(null); + const [error, setError] = React.useState(null); + React.useEffect(() => { + const request = new AbortController(); + setError(null); + void apiGet('namespaces', undefined, request.signal) + .then(result => { if (!request.signal.aborted) { setValue(parseNamespaces(result)); } }) + .catch(reason => { if (!request.signal.aborted) { setError(String(reason)); } }); + return () => request.abort(); + }, []); + return { value, error }; +} + +export function RunsSidebar({ onOpenRun, onAbout }: { + onOpenRun: (target: RunTarget) => void; onAbout: () => void; +}): JSX.Element { + const [namespace, setNamespace] = React.useState(''); + const [name, setName] = React.useState(''); + const [kind, setKind] = React.useState<'Job' | 'RayJob'>('RayJob'); + const capabilities = useCapabilities(); + const namespaces = useNamespaces(); + const options = namespaces.value?.namespaces || []; + const id = React.useId(); + // Prefer a namespace that is actually set up for Tau work, and never require + // the researcher to guess or type one that cannot host the run. + React.useEffect(() => { + if (namespace || !options.length) { return; } + const preferred = options.find(option => option.tauEnabled) || options[0]; + setNamespace(preferred.name); + }, [namespace, options]); + const selected = options.find(option => option.name === namespace); + return
+

Runs

+ + + {options.map(option => )} + +

+ {namespaces.error ? 'Namespace list unavailable; type a namespace to continue.' + : !options.length ? 'No namespaces are visible to this server; type one to continue.' + : selected ? (selected.tauEnabled + ? 'This namespace is labelled for Tau work; queue admission is not guaranteed.' + : 'This namespace is not labelled for Tau work, so runs may stay unadmitted.') + : 'This namespace is not in the visible list.' + } + {namespaces.value?.warnings?.length ? ` ${namespaces.value.warnings.join(' ')}` : ''} +

+ +
Find exact run +
{ event.preventDefault(); if (namespace.trim() && name.trim()) onOpenRun({ namespace: namespace.trim(), name: name.trim(), kind }); }}> + + + +
+
+
; +} + +function useRun(target: RunTarget, metrics = false): [MonitorState, React.MutableRefObject] { + const [state, setState] = React.useState({ target, status: null, error: null, busy: false, watching: false, checkedAt: null }); + const monitor = React.useRef(null); + React.useEffect(() => { + const current = new RunMonitor(async (identity, signal) => parseRunStatus(await apiGet('status', { ...identity, ...(metrics ? { includeMetrics: 'true' } : {}) }, signal)), setState, undefined, metrics); + monitor.current = current; + current.lookup(target); + return () => { current.dispose(); monitor.current = null; }; + }, [target.namespace, target.kind, target.name, metrics]); + return [state, monitor]; +} + +function RunHeading({ target, logs = false }: { target: RunTarget; logs?: boolean }): JSX.Element { + return

{logs ? 'Logs: ' : ''}{target.name}

{target.namespace} / {target.kind} / Read only

; +} + +function ReadState({ state }: { state: MonitorState }): JSX.Element { + return <>

{state.busy ? 'Checking run...' : state.checkedAt ? 'Checked ' + new Date(state.checkedAt).toLocaleTimeString() : 'Waiting for first check.'}

+ {state.error &&

{state.error} {state.status ? 'Showing the last successful snapshot. Watch is stopped.' : 'Refresh to retry.'}

}; +} + +export function RunDetail({ target, onOpenLogs }: { target: RunTarget; onOpenLogs: (target: RunTarget) => void }): JSX.Element { + const [state, monitor] = useRun(target, true); + return
+ +
+ +
+ +

{state.error ? 'Watching stopped after a status error.' : state.watchMessage || (state.watching ? 'Watching status and bounded loss samples.' : 'Not watching.')}

+ {state.status && } +
; +} + +export function RunLogs({ target }: { target: RunTarget }): JSX.Element { + const [state, monitor] = useRun(target); + return
+ + + + {state.status && !state.error && !state.busy && } +
; +} + +export function About(): JSX.Element { + const capabilities = useCapabilities(); + return
+

Runs and logs use the Jupyter server's Kubernetes credentials and RBAC. On a shared server, those credentials may be shared. The browser never connects directly to Kubernetes.

+

{capabilities.error || (capabilities.value ? capabilities.value.submissionEnabled && capabilities.value.submissionImplemented ? 'Submission is enabled.' : 'Submission is disabled.' : 'Checking server capabilities...')}

+ {capabilities.error && } +

Submission requires the server operator to certify the notebook runtime and enable TAUGRID_SUBMISSION_ENABLED. Reviewing a plan does not create a run.

+

Durable history is available through an operator-configured portal link or the CLI's Kusto options. {capabilities.value?.portalUrl ? 'A portal link is configured.' : 'No portal link is configured.'} The browser never queries Kubernetes or portal APIs directly. The server may read bounded portal metrics only with separate operator opt-in and an exact run mapping.

+
; +} + +export function runWidgetId(target: RunTarget, surface = 'detail'): string { + return 'taugrid-' + surface + '-' + [target.namespace, target.kind || 'RayJob', target.name].map(value => encodeURIComponent(value)).join(':'); +} + +export class SurfaceWidget extends ReactWidget { + constructor(private element: React.ReactElement) { + super(); + this.addClass('taugrid-widget'); + this.node.tabIndex = -1; + } + protected onActivateRequest(): void { + const control = this.node.querySelector('button:not(:disabled), input:not(:disabled)'); + (control || this.node).focus(); + } + render(): React.ReactElement { return this.element; } +} diff --git a/sdk/python/python/labextension/style/index.css b/sdk/python/python/labextension/style/index.css new file mode 100644 index 00000000..4b76e26e --- /dev/null +++ b/sdk/python/python/labextension/style/index.css @@ -0,0 +1,894 @@ +/* Copyright (c) Microsoft Corporation. + Licensed under the MIT License. */ + +/* TauGrid plugin styling. + This is the TauGrid Portal design applied to the JupyterLab surfaces: the same + tokens, type scale, cards, stat tiles, badges, tables, buttons, focus ring and + chart treatment as portal/frontend/src/styles.css and stellar/charts.css. + + The Portal is a light-only product (color-scheme: light), so the plugin adopts + its fixed palette rather than following the JupyterLab theme. Chrome around the + panel still belongs to JupyterLab. */ + +.taugrid-widget, +.taugrid-panel { + --bg: #f4f6f8; + --panel: #fff; + --line: #e4e8ee; + --text: #1a2230; + --muted: #5c6a7d; + --accent: #2563eb; + --accent-bg: #eaf1fe; + --hover: #f2f6fc; + --ok: #15803d; + --ok-bg: #e7f6ec; + --warn: #b91c1c; + --warn-bg: #fdecec; + --amber: #b45309; + --amber-bg: #fef4e6; + --code-bg: #eef1f6; + color-scheme: light; + font-family: Inter, ui-sans-serif, system-ui, -apple-system, "Segoe UI", sans-serif; +} + +.taugrid-widget { + overflow: auto; + background: var(--bg); + color: var(--text); +} + +.taugrid-panel { + box-sizing: border-box; + max-width: 100%; + padding: 22px 24px 32px; + background: var(--bg); + color: var(--text); + font-size: 14px; +} + +.taugrid-panel *, +.taugrid-panel *::before, +.taugrid-panel *::after { + box-sizing: border-box; +} + +.taugrid-panel code { + background: var(--code-bg); + border-radius: 4px; + padding: 1px 5px; + font-family: ui-monospace, SFMono-Regular, "Cascadia Mono", Consolas, monospace; +} + +.taugrid-panel :focus-visible { + outline: 2px solid var(--accent); + outline-offset: 3px; +} + +/* --- page head ---------------------------------------------------------- */ + +.taugrid-heading { + display: flex; + align-items: flex-start; + justify-content: space-between; + gap: 16px; + max-width: 110ch; + margin-bottom: 18px; +} + +.taugrid-heading h1 { + margin: 0; + font-size: 20px; + font-weight: 750; + letter-spacing: -0.01em; +} + +.taugrid-heading h2 { + margin: 0; + font-size: 16px; +} + +.taugrid-heading p { + margin: 4px 0 0; + color: var(--muted); + font-size: 13px; +} + +/* --- controls ----------------------------------------------------------- */ + +.taugrid-find, +.taugrid-log-form, +.taugrid-review-form { + display: flex; + flex-wrap: wrap; + gap: 12px; + align-items: flex-end; +} + +.taugrid-field { + display: flex; + flex-direction: column; + gap: 6px; + min-width: 120px; + font-size: 12px; + font-weight: 600; +} + +.taugrid-input { + min-width: 0; + height: 32px; + border: 1px solid #dfe6f7; + border-radius: 6px; + background: var(--panel); + color: var(--text); + padding: 5px 9px; + font: inherit; + font-weight: 400; +} + +select.taugrid-input { + max-width: 100%; +} + +.taugrid-button { + display: inline-flex; + align-items: center; + gap: 6px; + border: 1px solid var(--line); + border-radius: 6px; + background: var(--panel); + color: var(--accent); + padding: 6px 10px; + font: inherit; + font-size: 13px; + cursor: pointer; +} + +.taugrid-button:hover:not(:disabled) { + background: var(--hover); +} + +.taugrid-button:disabled { + color: var(--muted); + cursor: not-allowed; + opacity: 0.55; +} + +.taugrid-primary { + border-color: transparent; + border-radius: 8px; + background: var(--accent); + color: #fff; + padding: 9px 16px; + font-weight: 650; +} + +.taugrid-primary:hover:not(:disabled) { + background: #1d4fd7; +} + +.taugrid-actions { + display: flex; + flex-wrap: wrap; + gap: 8px; + margin-top: 12px; +} + +.taugrid-watch { + display: inline-flex; + align-items: center; + gap: 7px; + color: var(--muted); + font-size: 12px; +} + +/* --- banners, notes, errors -------------------------------------------- */ + +.taugrid-muted, +.taugrid-summary, +.taugrid-server-message { + color: var(--muted); +} + +.taugrid-summary, +.taugrid-server-message { + margin: 8px 0 0; + font-size: 12px; +} + +.taugrid-validation, +.taugrid-error, +.taugrid-error-text, +.taugrid-next-action { + overflow-wrap: anywhere; +} + +.taugrid-validation, +.taugrid-error, +.taugrid-error-text { + border: 1px solid #f4b9b9; + border-radius: 8px; + background: var(--warn-bg); + color: var(--warn); + font-size: 12px; + padding: 10px 12px; + margin: 12px 0 0; +} + +.taugrid-error h2 { + margin: 0 0 4px; + font-size: 14px; +} + +/* --- run list (sidebar) ------------------------------------------------- */ + +.taugrid-sidebar { + padding: 16px 14px 24px; + background: var(--bg); +} + +.taugrid-browser { + margin-top: 16px; +} + +.taugrid-namespace-hint { + margin: 6px 0 0; + font-size: 12px; + line-height: 1.4; +} + +.taugrid-browser h2 { + display: flex; + align-items: center; + gap: 8px; + margin: 0 0 12px; + color: var(--muted); + font-size: 13px; + font-weight: 700; + letter-spacing: 0.03em; + text-transform: uppercase; +} + +.taugrid-browser p { + margin: 0 0 12px; + font-size: 12px; +} + +/* Runs table. The Portal renders run collections as table.jobs, so the sidebar + matches that treatment rather than a list of cards. */ +.taugrid-runs-table { + width: 100%; + border-collapse: collapse; + margin-top: 12px; + font-size: 13px; +} + +.taugrid-runs-table caption { + color: var(--muted); + font-size: 12px; + text-align: left; + padding-bottom: 6px; +} + +.taugrid-runs-table th, +.taugrid-runs-table td { + text-align: left; + padding: 8px 10px; + border-bottom: 1px solid var(--line); + vertical-align: top; +} + +.taugrid-runs-table th { + color: var(--muted); + font-size: 12px; + font-weight: 650; + letter-spacing: 0.02em; + text-transform: uppercase; +} + +.taugrid-runs-table tbody tr:hover { + background: var(--hover); +} + +.taugrid-runs-table td { + overflow-wrap: anywhere; +} + +.taugrid-run-link { + border: 0; + background: transparent; + color: var(--accent); + cursor: pointer; + font: inherit; + font-weight: 650; + padding: 0; + text-align: left; +} + +.taugrid-run-link:hover { + text-decoration: underline; +} +.taugrid-details { + margin-top: 16px; + border: 1px solid var(--line); + border-radius: 8px; + background: var(--panel); +} + +.taugrid-details summary { + cursor: pointer; + padding: 13px 12px; + font-weight: 650; + font-size: 13px; +} + +.taugrid-exact { + display: flex; + flex-wrap: wrap; + gap: 12px; + align-items: flex-end; + border-top: 1px solid var(--line); + padding: 12px; +} + +/* --- run detail --------------------------------------------------------- */ + +.taugrid-run { + border: 1px solid var(--line); + border-radius: 8px; + background: var(--panel); + box-shadow: 0 1px 2px rgb(20 30 50 / 4%); + padding: 22px; + margin-top: 18px; + max-width: 110ch; +} + +.taugrid-run-head { + display: flex; + flex-wrap: wrap; + align-items: baseline; + gap: 10px; +} + +.taugrid-state-line { + display: inline-flex; + align-items: center; + gap: 8px; +} + +.taugrid-state-mark { + display: inline-block; + width: 8px; + height: 8px; + border-radius: 999px; + background: var(--muted); + flex: 0 0 auto; +} + +.taugrid-tone-success .taugrid-state-mark { background: var(--ok); } +.taugrid-tone-warning .taugrid-state-mark { background: var(--amber); } +.taugrid-tone-error .taugrid-state-mark { background: var(--warn); } +.taugrid-tone-info .taugrid-state-mark { background: var(--accent); } + +.taugrid-run-name { + margin: 0; + font-size: 20px; + font-weight: 750; + overflow-wrap: anywhere; +} + +.taugrid-run-namespace { + margin: 6px 0 0; + color: var(--muted); + font-size: 12px; +} + +/* stat tiles — the Portal's Overview headline metrics */ +.taugrid-signals { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(170px, 1fr)); + gap: 14px; + margin: 18px 0 0; +} + +.taugrid-signal { + border: 1px solid var(--line); + border-top: 3px solid transparent; + border-radius: 10px; + background: #fff; + padding: 16px 18px; + min-width: 0; +} + +.taugrid-signal dt { + margin: 0; + color: var(--muted); + font-size: 11px; + font-weight: 700; + letter-spacing: 0.04em; + text-transform: uppercase; + line-height: 1.3; +} + +.taugrid-signal dd { + margin: 10px 0 0; + font-size: 28px; + font-weight: 760; + font-variant-numeric: tabular-nums; + line-height: 1.1; + overflow-wrap: anywhere; +} + +.taugrid-signal-detail { + margin-top: 6px; + color: var(--muted); + font-size: 12px; + font-weight: 400; + overflow-wrap: anywhere; +} + +.taugrid-signal.taugrid-tone-good, +.taugrid-signal.taugrid-tone-ready, +.taugrid-signal.taugrid-tone-complete { border-top-color: var(--ok); } +.taugrid-signal.taugrid-tone-good dd, +.taugrid-signal.taugrid-tone-ready dd, +.taugrid-signal.taugrid-tone-complete dd { color: var(--ok); } +.taugrid-signal.taugrid-tone-warn, +.taugrid-signal.taugrid-tone-queued { border-top-color: var(--amber); } +.taugrid-signal.taugrid-tone-warn dd, +.taugrid-signal.taugrid-tone-queued dd { color: var(--amber); } +.taugrid-signal.taugrid-tone-error, +.taugrid-signal.taugrid-tone-failed { border-top-color: var(--warn); } +.taugrid-signal.taugrid-tone-error dd, +.taugrid-signal.taugrid-tone-failed dd { color: var(--warn); } +.taugrid-signal.taugrid-tone-running, +.taugrid-signal.taugrid-tone-info { border-top-color: var(--accent); } +.taugrid-signal.taugrid-tone-running dd, +.taugrid-signal.taugrid-tone-info dd { color: var(--accent); } + +.taugrid-lifecycle, +.taugrid-observations { + margin-top: 26px; +} + +.taugrid-phase-list { + display: flex; + flex-direction: column; + gap: 10px; + list-style: none; + margin: 12px 0 0; + padding: 0; +} + +.taugrid-phase-list > li { + border: 1px solid var(--line); + border-left: 3px solid var(--muted); + border-radius: 10px; + background: #fff; + padding: 14px 16px; +} + +.taugrid-phase-list > li.taugrid-phase-done, +.taugrid-phase-list > li.taugrid-phase-active { border-left-color: var(--ok); } + +.taugrid-phase-list > li.taugrid-phase-pending { border-left-color: var(--amber); } + +.taugrid-phase-list > li.taugrid-phase-warning { border-left-color: var(--warn); } + +.taugrid-phase-list > li > div { + display: flex; + align-items: center; + gap: 10px; + flex-wrap: wrap; + font-size: 14px; + font-weight: 700; +} + +.taugrid-phase-list > li > p { + margin: 8px 0 0; + color: var(--muted); + font-size: 12px; +} + +.taugrid-phase-state, +.taugrid-badge { + border: 1px solid var(--line); + border-radius: 6px; + background: var(--bg); + color: var(--muted); + font-size: 11px; + font-weight: 650; + padding: 2px 8px; +} + +/* --- pods --------------------------------------------------------------- */ + +.taugrid-pod-section h3, +.taugrid-diagnostics h3 { + display: flex; + align-items: center; + gap: 8px; + margin: 26px 0 12px; + color: var(--muted); + font-size: 13px; + font-weight: 700; + letter-spacing: 0.03em; + text-transform: uppercase; +} + +.taugrid-count { + color: var(--muted); + font-weight: 600; +} + +.taugrid-pods { + list-style: none; + margin: 0; + padding: 0; + border-top: 1px solid var(--line); +} + +.taugrid-pod { + border-bottom: 1px solid var(--line); + padding: 10px; + font-size: 13px; +} + +.taugrid-pod:hover { + background: var(--hover); +} + +.taugrid-pod-title { + display: flex; + align-items: center; + gap: 10px; + flex-wrap: wrap; +} + +.taugrid-readiness { + border: 1px solid var(--line); + border-radius: 6px; + background: var(--bg); + color: var(--muted); + font-size: 11px; + font-weight: 650; + padding: 2px 8px; +} + +.taugrid-ready { + border-color: transparent; + background: var(--ok-bg); + color: var(--ok); +} + +.taugrid-pod-facts { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(140px, 1fr)); + gap: 6px 14px; + margin: 8px 0 0; + color: var(--muted); + font-size: 12px; + font-variant-numeric: tabular-nums; +} + +.taugrid-pod-facts div { + min-width: 0; +} + +.taugrid-pod-facts dt { + margin: 0; + color: var(--muted); +} + +.taugrid-pod-facts dd { + margin: 2px 0 0; + color: var(--text); + overflow-wrap: anywhere; +} + +/* --- diagnostics -------------------------------------------------------- */ + +.taugrid-note-list { + list-style: none; + margin: 0; + padding: 0; + display: flex; + flex-direction: column; + gap: 10px; +} + +.taugrid-note { + border: 1px solid var(--line); + border-left: 3px solid var(--muted); + border-radius: 10px; + background: #fff; + padding: 14px 16px; +} + +.taugrid-note.taugrid-tone-error { border-left-color: var(--warn); } +.taugrid-note.taugrid-tone-warning { border-left-color: var(--amber); } +.taugrid-note.taugrid-tone-info { border-left-color: var(--accent); } + +.taugrid-note-severity { + display: inline-block; + border: 1px solid var(--line); + border-radius: 6px; + background: var(--bg); + color: var(--muted); + font-size: 11px; + font-weight: 650; + padding: 2px 8px; + margin-bottom: 8px; + text-transform: capitalize; +} + +.taugrid-next-action { + margin: 8px 0 0; + border: 0; + background: transparent; + color: var(--muted); + padding: 0; + font-size: 12px; +} + +.taugrid-next-action strong { + color: var(--text); + font-weight: 650; +} + +.taugrid-identifiers { + margin: 0; + color: var(--muted); + font-size: 12px; +} + +.taugrid-identifiers div { + margin-top: 4px; +} + +/* --- logs --------------------------------------------------------------- */ + +.taugrid-log-text { + margin: 12px 0 0; + border: 1px solid var(--line); + border-radius: 6px; + background: #fff; + color: var(--text); + font-family: ui-monospace, SFMono-Regular, "Cascadia Mono", Consolas, monospace; + font-size: 12px; + line-height: 1.45; + max-height: 60vh; + overflow: auto; + padding: 12px; + white-space: pre-wrap; + overflow-wrap: anywhere; +} + +/* --- metrics and the loss curve ---------------------------------------- */ + +.taugrid-metrics { + margin-top: 26px; +} + +/* .taugrid-loss-curve is the itself; the polyline and points draw with + currentColor, so the series colour is set here. */ +.taugrid-loss-curve { + display: block; + width: 100%; + height: 210px; + color: var(--accent); + background: + linear-gradient(90deg, rgb(232 232 232 / 45%) 1px, transparent 1px), + linear-gradient(180deg, rgb(232 232 232 / 55%) 1px, transparent 1px); + background-size: 64px 100%, 100% 56px; +} + +.taugrid-loss-curve text { + fill: #83899e; + font-size: 10px; + font-weight: 400; + font-variant-numeric: tabular-nums; +} + +.taugrid-loss-curve polyline { + stroke: currentColor; + stroke-width: 2; +} + +.taugrid-loss-curve circle { + fill: currentColor; + stroke: var(--panel); + stroke-width: 2; +} + +.taugrid-loss-samples { + margin-top: 12px; +} + +.taugrid-loss-table table { + width: 100%; + border-collapse: collapse; + margin-top: 12px; + font-size: 13px; + font-variant-numeric: tabular-nums; +} + +.taugrid-loss-table caption { + color: var(--muted); + font-size: 12px; + text-align: left; +} + +.taugrid-loss-table th, +.taugrid-loss-table td { + text-align: right; + padding: 8px 10px; + border-bottom: 1px solid var(--line); +} + +.taugrid-loss-table th:first-child, +.taugrid-loss-table td:first-child { + text-align: left; +} + +.taugrid-loss-table th { + color: var(--muted); + font-size: 12px; + font-weight: 650; + letter-spacing: 0.02em; + text-transform: uppercase; +} + +.taugrid-loss-table tbody tr:hover { + background: var(--hover); +} + +.taugrid-metrics-source, +.taugrid-metrics-freshness, +.taugrid-metrics-truncation, +.taugrid-metrics-empty, +.taugrid-metrics-error, +.taugrid-watch-state { + margin: 12px 0 0; + color: var(--muted); + font-size: 12px; + overflow-wrap: anywhere; +} + +.taugrid-metrics-error { + border: 1px solid #f4b9b9; + border-radius: 8px; + background: var(--warn-bg); + color: var(--warn); + padding: 10px 12px; +} + +/* --- submission review -------------------------------------------------- */ + +.taugrid-review { + max-width: 100%; +} + +.taugrid-plan { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(170px, 1fr)); + gap: 14px; + margin: 18px 0 0; +} + +.taugrid-plan > div { + border: 1px solid var(--line); + border-radius: 10px; + background: #fff; + padding: 16px 18px; + min-width: 0; +} + +.taugrid-plan dt { + margin: 0; + color: var(--muted); + font-size: 11px; + font-weight: 700; + letter-spacing: 0.04em; + text-transform: uppercase; +} + +.taugrid-plan dd { + margin: 10px 0 0; + font-size: 14px; + font-weight: 650; + overflow-wrap: anywhere; +} + +.taugrid-submitted { + margin: 12px 0 0; + border: 1px solid transparent; + border-radius: 6px; + background: var(--ok-bg); + color: var(--ok); + font-size: 13px; + font-weight: 650; + padding: 8px 12px; +} + +@media (max-width: 800px) { + .taugrid-panel { + padding: 16px; + } + + .taugrid-heading { + flex-direction: column; + gap: 8px; + } + + .taugrid-run { + padding: 16px; + } +} + +@media (prefers-reduced-motion: reduce) { + .taugrid-panel * { + transition: none !important; + animation: none !important; + } +} +/* --- files to ship with the notebook ----------------------------------- */ + +.taugrid-files { + margin-top: 22px; +} + +.taugrid-files h2 { + display: flex; + align-items: center; + gap: 8px; + margin: 0 0 12px; + color: var(--muted); + font-size: 13px; + font-weight: 700; + letter-spacing: 0.03em; + text-transform: uppercase; +} + +.taugrid-files p { + margin: 0 0 10px; +} + +.taugrid-file-list { + list-style: none; + margin: 12px 0 0; + padding: 0; + display: flex; + flex-direction: column; + gap: 8px; +} + +.taugrid-file { + display: flex; + align-items: center; + gap: 12px; + border: 1px solid var(--line); + border-radius: 10px; + background: #fff; + padding: 10px 14px; + font-size: 13px; + cursor: pointer; +} + +.taugrid-file:hover { + border-color: var(--accent); +} + +.taugrid-file input { + flex: 0 0 auto; +} + +.taugrid-file code { + flex: 1 1 auto; + min-width: 0; + overflow-wrap: anywhere; +} + +.taugrid-file .taugrid-muted { + flex: 0 0 auto; + font-variant-numeric: tabular-nums; +} diff --git a/sdk/python/python/labextension/style/index.js b/sdk/python/python/labextension/style/index.js new file mode 100644 index 00000000..dc8cd6f9 --- /dev/null +++ b/sdk/python/python/labextension/style/index.js @@ -0,0 +1,4 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +import './index.css'; diff --git a/sdk/python/python/labextension/tests/console.test.cjs b/sdk/python/python/labextension/tests/console.test.cjs new file mode 100644 index 00000000..79fa76bd --- /dev/null +++ b/sdk/python/python/labextension/tests/console.test.cjs @@ -0,0 +1,612 @@ +const assert = require('node:assert/strict'); +const fs = require('node:fs'); +const path = require('node:path'); +const { test } = require('node:test'); +const ts = require('typescript'); +const React = require('react'); +const { renderToStaticMarkup } = require('react-dom/server'); + +test('loss evidence rejects malformed samples without rejecting lifecycle', () => { + const { parseRunStatus } = load('model.ts'); + const evidence = { state: 'ready', source: { type: 'stdout', runUid: 'run', pod: 'driver', podUid: 'pod', container: 'submitter' }, samples: [{ step: 1, value: 0.5 }], checkedAt: '2026-09-22T00:00:00Z', stale: false, limitBytes: 65536, maxPoints: 512, possiblyTruncated: true, truncationReasons: ['tail-window'], message: 'Bounded evidence' }; + assert.deepEqual(parseRunStatus(run({ metrics: evidence })).metrics, evidence); + for (const samples of [[{ step: -1, value: 1 }], [{ step: 1, value: Infinity }], Array(513).fill({ step: 1, value: 1 })]) { + const status = parseRunStatus(run({ metrics: { ...evidence, samples } })); + assert.equal(status.state, 'running'); + assert.equal(status.metrics.state, 'error'); + assert.deepEqual(status.metrics.samples, []); + } +}); + +test('loss section renders actual points and accessible table only', () => { + const { LossSection } = load('loss.tsx'); + const metrics = { state: 'ready', source: { type: 'stdout', pod: 'driver', podUid: 'pod-uid', container: 'submitter' }, samples: [{ step: 1, value: 0.5 }], checkedAt: '2026-09-22T00:00:00Z', stale: false, possiblyTruncated: true, truncationReasons: ['tail-window'], message: 'Bounded evidence' }; + const html = renderToStaticMarkup(React.createElement(LossSection, { metrics })); + for (const anchor of ['taugrid-loss-curve', 'taugrid-loss-samples', 'taugrid-metrics-source', 'taugrid-metrics-freshness', 'taugrid-metrics-truncation']) assert.ok(html.includes(anchor)); + assert.ok(html.includes(' { + const { RunMonitor } = load('monitor.ts'); + let now = 0; + let response = run(); + const timers = new Map(); + let sequence = 0; + let calls = 0; + const monitor = new RunMonitor(async () => { calls++; return response; }, () => {}, { now: () => now, set: callback => { timers.set(++sequence, callback); return sequence; }, clear: id => timers.delete(id) }, true); + const settle = () => new Promise(resolve => setImmediate(resolve)); + monitor.lookup({ namespace: 'research', kind: 'RayJob', name: 'train' }); + await settle(); + assert.equal(monitor.state.watching, true); + monitor.setWatching(false); + monitor.refresh(); + await settle(); + assert.equal(monitor.state.watching, false); + monitor.setWatching(true); + now = 3600001; + monitor.refresh(); + await settle(); + assert.equal(monitor.state.watching, false); + assert.match(monitor.state.watchMessage, /hour/); + monitor.setWatching(true); + response = run({ terminal: true, state: 'succeeded', metrics: { state: 'empty' } }); + const before = calls; + monitor.refresh(); + await settle(); + assert.equal(calls, before + 1); + assert.equal(monitor.state.status.metrics.state, 'empty'); + assert.equal(monitor.state.watching, false); + assert.equal(timers.size, 0); + monitor.dispose(); +}); + +test('loss curve keeps extreme finite observations finite without inventing points', () => { + const { LossSection } = load('loss.tsx'); + const samples = [{ step: 0, value: -Number.MAX_VALUE }, { step: Number.MAX_SAFE_INTEGER, value: Number.MAX_VALUE }]; + const html = renderToStaticMarkup(React.createElement(LossSection, { metrics: { samples, truncationReasons: [] } })); + assert.equal((html.match(//g) || []).length, 3); + assert.ok(html.includes(' { + const { SubmissionSession } = load('submission.ts'); + const calls = []; + const session = new SubmissionSession(async (path, payload) => { + calls.push({ path, payload }); + return path === 'preview' ? preview : { submitted: true, namespace: plan.namespace, name: plan.name, kind: 'RayJob', payloadDigest: plan.payloadDigest, plan }; + }, () => {}); + await session.review({ notebook: {}, path: 'demo.ipynb', namespace: 'research', profile: 'old', queue: 'old-q' }); + session.invalidate(); + assert.equal(session.state.preview, null); + assert.equal(await session.submit(plan, true, true), false); + await session.review({ notebook: {}, path: 'demo.ipynb', namespace: 'research', profile: 'cpu', queue: 'cpu-q' }); + assert.equal(await session.submit(plan, true, true), true); + assert.equal(calls.at(-1).payload.profile, 'cpu'); + assert.equal(calls.at(-1).payload.queue, 'cpu-q'); + session.dispose(); + const source = fs.readFileSync(path.resolve(__dirname, '../src/submitview.tsx'), 'utf8'); + for (const field of ['profile', 'queue']) { + assert.ok(source.includes(`data-testid="taugrid-submit-${field}"`)); + } +}); + +function load(source, overrides = {}) { + const filename = path.resolve(__dirname, '../src', source); + const output = ts.transpileModule(fs.readFileSync(filename, 'utf8'), { + compilerOptions: { module: ts.ModuleKind.CommonJS, jsx: ts.JsxEmit.React } + }).outputText; + const module = { exports: {} }; + const resolve = name => overrides[name] || (name.startsWith('.') + ? load(name.slice(2) + (fs.existsSync(path.resolve(__dirname, '../src', name + '.tsx')) ? '.tsx' : '.ts'), overrides) + : require(name)); + new Function('require', 'module', 'exports', output)(resolve, module, module.exports); + return module.exports; +} + +const run = overrides => ({ + existing: true, name: 'train-42', namespace: 'research', state: 'running', + readyPods: 1, totalPods: 2, terminal: false, pods: [], diagnostics: [], ...overrides +}); + +const plan = { name: 'train-reviewed', namespace: 'research', queue: 'gpu', profile: 'small', planDigest: 'a'.repeat(64), payloadDigest: 'digest', notebookBytes: 20, preparedBytes: 10, encodedEnvBytes: 16, excludedCells: [] }; +const preview = { plan, submittable: true, submissionEnabled: true }; +const surfaceOverrides = { './api': {}, '@jupyterlab/apputils': { ReactWidget: class {} } }; + +test('plugin routes discovery left, reuses native tabs and binds notebook toolbar reviews', async () => { + const commands = new Map(); + const added = []; + const toolbar = []; + class SurfaceWidget { + constructor(element) { this.element = element; this.title = {}; this.id = ''; this.isDisposed = false; this.isAttached = false; this.disposed = { connect() {} }; } + } + class WidgetTracker { + constructor() { this.widgets = []; } + async add(widget) { this.widgets.push(widget); } + has(widget) { return this.widgets.includes(widget); } + } + const notebook = { id: 'notebook-1', isDisposed: false, context: { path: 'source.ipynb', model: { toJSON: () => ({ cells: [] }) } }, toolbar: { addItem: (name, button) => toolbar.push({ name, button }) } }; + const notebooks = { currentWidget: notebook, forEach: callback => callback(notebook), widgetAdded: { connect() {} }, currentChanged: { connect() {} } }; + const app = { commands: { addCommand: (name, command) => commands.set(name, command), notifyCommandChanged() {} }, shell: { currentWidget: notebook, currentChanged: { connect() {} }, add: (widget, area) => { widget.isAttached = true; added.push({ widget, area }); }, activateById() {} } }; + const restored = []; + const restorer = { add: (widget, name) => restored.push({ widget, name }), restore: (tracker, options) => { restored.push({ tracker, options }); return Promise.resolve(); } }; + const plugin = load('index.ts', { + '@jupyterlab/application': {}, '@jupyterlab/launcher': {}, '@jupyterlab/notebook': {}, + '@jupyterlab/apputils': { WidgetTracker, ToolbarButton: class { constructor(options) { Object.assign(this, options); } }, Dialog: { cancelButton() {}, okButton() {} }, showDialog: async () => ({ button: { accept: false } }), ReactWidget: { create: element => element } }, + './widget': { SurfaceWidget, RunsSidebar() {}, RunDetail() {}, RunLogs() {}, About() {}, runWidgetId: target => JSON.stringify(target) }, + './submitview': { SubmissionReview() {}, SubmissionConfirmation() {} } + }).default; + plugin.activate(app, restorer, { add() {} }, { addItem() {} }, notebooks); + await commands.get('taugrid:open').execute(); + assert.equal(added[0].area, 'left'); + assert.equal(added[0].widget.id, 'taugrid-runs'); + const target = { namespace: 'research', kind: 'RayJob', name: 'train' }; + await commands.get('taugrid:open-run').execute(target); + await commands.get('taugrid:open-run').execute(target); + assert.equal(added.filter(item => item.area === 'main').length, 1); + assert.equal(toolbar[0].name, 'taugrid-submit'); + assert.equal(commands.get('taugrid:submit-notebook').isEnabled(), true); + app.shell.currentWidget = added[1].widget; + assert.equal(commands.get('taugrid:submit-notebook').isEnabled(), false); + await toolbar[0].button.onClick(); + const review = added.at(-1).widget; + assert.equal(review.element.props.notebook.name, 'source.ipynb'); + notebooks.currentWidget = { context: { path: 'other.ipynb' } }; + assert.equal(review.element.props.notebook.toJSON(), '{"cells":[]}'); + assert.equal(restored.filter(item => item.options).length, 1); +}); + +test('sidebar owns discovery and lookup, never monitoring or submission', () => { + const { RunsSidebar } = load('widget.tsx', surfaceOverrides); + const html = renderToStaticMarkup(React.createElement(RunsSidebar, { onOpenRun() {}, onAbout() {} })); + for (const text of ['taugrid-runs', 'Namespace', 'LocalQueue filter', 'Refresh', 'Find exact run', 'Kind', 'RayJob', 'Check run', 'About']) assert.ok(html.includes(text), text); + // The namespace is a filterable selection, not a free-text guess. + assert.ok(html.includes('list="'), 'namespace input must offer a filtered list'); + assert.ok(html.includes(' { + const { RunDetail, RunLogs, runWidgetId } = load('widget.tsx', surfaceOverrides); + const target = { namespace: 'research', name: 'train', kind: 'Job' }; + const detail = renderToStaticMarkup(React.createElement(RunDetail, { target, onOpenLogs() {} })); + assert.ok(detail.includes('taugrid-detail')); + assert.ok(detail.includes('Refresh run')); + assert.ok(!detail.includes('List runs')); + assert.ok(!detail.includes('Submit notebook')); + const logs = renderToStaticMarkup(React.createElement(RunLogs, { target })); + assert.ok(logs.includes('taugrid-logs')); + assert.ok(logs.includes('Refresh pods')); + assert.notEqual(runWidgetId(target), runWidgetId({ ...target, kind: 'RayJob' })); + assert.notEqual(runWidgetId(target), runWidgetId({ ...target, namespace: 'another' })); + assert.notEqual(runWidgetId(target), runWidgetId(target, 'logs')); +}); + +test('submission review owns plan and source; confirmation names the exact write', () => { + const { SubmissionReview, SubmissionConfirmation } = load('submitview.tsx', surfaceOverrides); + const html = renderToStaticMarkup(React.createElement(SubmissionReview, { notebook: { name: 'source.ipynb', toJSON: () => '{}' }, onConfirm: async () => false, onOpenRun() {}, onAbout() {} })); + for (const text of ['taugrid-review', 'source.ipynb', 'Review submission', 'Submit notebook']) assert.ok(html.includes(text), text); + assert.ok(!html.includes('List runs')); + assert.ok(!html.includes('Watch this run')); + const confirmation = renderToStaticMarkup(React.createElement(SubmissionConfirmation, { plan })); + for (const text of ['research', 'train-reviewed', 'gpu', 'reviewed notebook snapshot']) assert.ok(confirmation.includes(text), text); +}); + +test('submission commits immutable reviewed bytes only after confirmation and both gates', async () => { + const { SubmissionSession } = load('submission.ts'); + const calls = []; + const session = new SubmissionSession(async (path, body) => { calls.push({ path, body }); return path === 'preview' ? preview : { submitted: true, name: plan.name, namespace: plan.namespace, kind: 'RayJob', payloadDigest: plan.payloadDigest, plan }; }, () => {}); + const source = { notebook: 'original', path: 'source.ipynb', namespace: 'research' }; + await session.review(source); + source.notebook = 'edited'; + assert.equal(await session.submit(plan, false, true), false); + assert.equal(await session.submit(plan, true, false), false); + assert.equal(calls.length, 1); + assert.equal(await session.submit(plan, true, true), true); + assert.equal(calls[1].body.notebook, 'original'); + assert.equal(calls[1].body.name, plan.name); + assert.equal(calls[1].body.confirm, true); + assert.equal(await session.submit(plan, true, true), false); + assert.equal(calls.length, 2); +}); + +test('preview gate, invalidation and stale confirmations cannot submit', async () => { + const { SubmissionSession } = load('submission.ts'); + let enabled = false; + const calls = []; + const session = new SubmissionSession(async (path) => { calls.push(path); return { ...preview, submittable: enabled }; }, () => {}); + await session.review({ notebook: '{}', path: 'source.ipynb', namespace: 'research' }); + assert.equal(await session.submit(plan, true, true), false); + enabled = true; + await session.review({ notebook: '{}', path: 'source.ipynb', namespace: 'research' }); + session.invalidate(); + assert.equal(await session.submit(plan, true, true), false); + assert.deepEqual(calls, ['preview', 'preview']); +}); + +test('replaced/disposed reviews abort and discard late results', async () => { + const { SubmissionSession } = load('submission.ts'); + const pending = []; + const states = []; + const session = new SubmissionSession((path, body, signal) => new Promise(resolve => pending.push({ signal, resolve })), state => states.push(state)); + const first = session.review({ notebook: 'old', path: 'old.ipynb', namespace: 'ray' }); + const second = session.review({ notebook: 'new', path: 'new.ipynb', namespace: 'ray' }); + assert.equal(pending[0].signal.aborted, true); + pending[0].resolve(preview); + await first; + assert.equal(session.state.preview, null); + session.dispose(); + const count = states.length; + assert.equal(pending[1].signal.aborted, true); + pending[1].resolve(preview); + await second; + assert.equal(states.length, count); +}); + +test('failed writes expose uncertain outcome and cannot be retried without review', async () => { + const { SubmissionSession } = load('submission.ts'); + const session = new SubmissionSession(async path => { if (path === 'preview') return preview; throw new Error('timeout'); }, () => {}); + await session.review({ notebook: '{}', path: 'source.ipynb', namespace: 'ray' }); + assert.equal(await session.submit(plan, true, true), false); + assert.equal(session.state.uncertain, true); + assert.equal(session.state.preview, null); + assert.deepEqual(session.state.attempted, { namespace: plan.namespace, name: plan.name, kind: 'RayJob' }); + assert.equal(await session.submit(plan, true, true), false); +}); + +test('copy distinguishes admission, execution, missing and unreachable', () => { + const { describeRun } = load('model.ts'); + assert.equal(describeRun(run({ state: 'queued', admitted: false })).label, 'Waiting for admission'); + assert.equal(describeRun(run({ state: 'queued', admitted: true })).label, 'Queued'); + assert.equal(describeRun(run({ state: 'not_submitted', existing: false })).label, 'No such run'); + assert.equal(describeRun(run({ state: 'unknown', existing: false })).label, 'Unreachable'); + assert.equal(describeRun(run({ state: 'complete' })).label, 'Finished'); + assert.match(describeRun(run()).detail, /not.*training health/i); +}); + +test('render includes identifiers, unknown admission, diagnostics and link-out', () => { + const { RunDetails } = load('view.tsx'); + const html = renderToStaticMarkup(React.createElement(RunDetails, { + status: run({ jobId: 'job-17', rayClusterName: 'cluster-17', diagnostics: [ + { code: 'restart', severity: 'warning', message: 'Worker restarted', suggestion: 'Inspect worker logs.' } + ], pods: [{ name: 'worker-1', ready: false, restarts: 3, phase: 'Running', node: 'gpu-1' }] }), + stale: false, statusUrl: '/user/alice/taugrid/api/status?name=train-42' + })); + for (const text of ['taugrid-run', 'train-42', 'job-17', 'cluster-17', 'Not reported', + 'Worker restarted', 'Inspect worker logs.', '3 restarts', 'Not ready', 'Open status JSON']) { + assert.ok(html.includes(text), text); + } + assert.ok(html.includes('/user/alice/taugrid/api/status?name=train-42')); +}); + +test('stale data is not presented as a current running state', () => { + const { RunDetails } = load('view.tsx'); + const html = renderToStaticMarkup(React.createElement(RunDetails, { + status: run(), stale: true, statusUrl: '/status' + })); + assert.ok(html.includes('Status unavailable')); + assert.ok(html.includes('Last known state: Running')); +}); + +function harness() { + const { RunMonitor } = load('monitor.ts'); + const pending = []; + const timers = new Map(); + let nextTimer = 0; + const monitor = new RunMonitor((target, signal) => new Promise((resolve, reject) => { + pending.push({ target, signal, resolve, reject }); + }), () => {}, { + set: callback => { timers.set(++nextTimer, callback); return nextTimer; }, + clear: handle => timers.delete(handle), now: () => 1234 + }); + return { monitor, pending, timers }; +} + +const settle = () => new Promise(resolve => setImmediate(resolve)); + +test('browser and logs render labeled native controls and partial-list warnings', () => { + const { RunBrowser, RunRows, LogViewer, LogContent } = load('explorer.tsx', { './api': {} }); + const browser = renderToStaticMarkup(React.createElement(RunBrowser, { namespace: 'ray', onSelect: () => {}, portalUrl: null })); + // The list loads itself; the only control is an explicit refresh. + for (const text of ['Live runs', 'LocalQueue filter', 'Refresh', 'durable history']) { assert.ok(browser.includes(text), text); } + assert.ok(!browser.includes('List runs')); + const rows = renderToStaticMarkup(React.createElement(RunRows, { result: { + runs: [{ namespace: 'ray', name: 'train', kind: 'Job', state: 'queued' }, { namespace: 'ray', name: 'train', kind: 'RayJob', state: 'Running' }], + warnings: ['RayJob read denied'], truncated: true }, onSelect: () => {} })); + for (const text of ['Job', 'RayJob', 'RayJob read denied', 'partial', 'train']) { assert.ok(rows.includes(text), text); } + // Rows are a table, not a card list. + for (const text of ['alert(1)', limitBytes: 65536, possiblyTruncated: true } })); + assert.ok(content.includes('<script>')); + assert.ok(content.includes('truncated')); + assert.ok(!content.includes('" + ) + return "".join(parts) + + +@dataclass +class EmbedView: + """The result of an embed: the framed URL plus a direct portal link.""" + + url: str + path: str + portal_url: str + html: str + proxied: bool = False + + def _repr_html_(self) -> str: + return self.html + + def __str__(self) -> str: + return self.url + + +class PortalProxy: + """A local reverse proxy that serves the TauGrid portal on a separate loopback origin. + + Starts a ThreadingHTTPServer on 127.0.0.1 and forwards every request to the + portal base URL, dropping X-Frame-Options so the notebook can frame it. The + portal SPA uses root-absolute asset and API paths, so a transparent proxy + works without HTML rewriting. + """ + + def __init__( + self, + portal_url: str, + *, + host: str = "127.0.0.1", + port: int = 0, + headers: Optional[Dict[str, str]] = None, + timeout: float = 30.0, + ) -> None: + self.portal_url = portal_url.rstrip("/") + self.host = host + self._requested_port = port + self.headers = dict(headers or {}) + self.timeout = timeout + self._server: Optional[ThreadingHTTPServer] = None + self._thread: Optional[threading.Thread] = None + + @property + def port(self) -> int: + if self._server is None: + return self._requested_port + return int(self._server.server_address[1]) + + @property + def base_url(self) -> str: + return f"http://{self.host}:{self.port}" + + def url(self, path: str) -> str: + if not path.startswith("/"): + path = "/" + path + return self.base_url + path + + def start(self) -> "PortalProxy": + if self._server is not None: + return self + handler = _make_handler(self.portal_url, self.headers, self.timeout) + self._server = ThreadingHTTPServer((self.host, self._requested_port), handler) + self._server.daemon_threads = True # type: ignore[attr-defined] + self._thread = threading.Thread(target=self._server.serve_forever, name="tau-portal-proxy", daemon=True) + self._thread.start() + return self + + def stop(self) -> None: + if self._server is not None: + self._server.shutdown() + self._server.server_close() + self._server = None + if self._thread is not None: + self._thread.join(timeout=5) + self._thread = None + + +def _strip_frame_ancestors(csp: str) -> str: + """Remove frame-ancestors for the opt-in legacy embed.""" + directives = [d.strip() for d in csp.split(";") if d.strip()] + kept = [d for d in directives if not d.lower().startswith("frame-ancestors")] + return "; ".join(kept) + + +def _make_handler(portal_url: str, headers: Dict[str, str], timeout: float) -> type: + class _Handler(BaseHTTPRequestHandler): + protocol_version = "HTTP/1.1" + + def do_GET(self) -> None: # noqa: N802 - http.server API + self._forward("GET") + + def do_HEAD(self) -> None: # noqa: N802 - http.server API + self._forward("HEAD") + + def _forward(self, method: str) -> None: + target = portal_url + self.path + request = urllib.request.Request(target, method=method, headers=dict(headers)) + try: + with urllib.request.urlopen(request, timeout=timeout) as response: + body = response.read() + self._relay(response.status, response.headers.items(), body, method) + except urllib.error.HTTPError as exc: + body = exc.read() + self._relay(exc.code, exc.headers.items() if exc.headers else [], body, method) + except Exception as exc: # pragma: no cover - network failure path + message = f"TauGrid portal proxy could not reach {target}: {exc}".encode("utf-8") + self.send_response(502) + self.send_header("Content-Type", "text/plain; charset=utf-8") + self.send_header("Content-Length", str(len(message))) + self.end_headers() + if method != "HEAD": + self.wfile.write(message) + + def _relay(self, status: int, header_items: Any, body: bytes, method: str) -> None: + self.send_response(status) + for key, value in header_items: + lower = key.lower() + if lower in _HOP_BY_HOP or lower in _FRAME_HEADERS: + continue + if lower == "content-security-policy": + value = _strip_frame_ancestors(value) + if lower == "content-length": + continue + self.send_header(key, value) + self.send_header("Content-Length", str(len(body))) + self.end_headers() + if method != "HEAD": + self.wfile.write(body) + + def log_message(self, *args: Any) -> None: # keep the notebook output clean + return + + return _Handler + + +__all__ = [ + "EmbedView", + "PortalProxy", + "run_view_path", + "ray_dashboard_path", + "experiment_path", + "same_origin", + "iframe_html", +] diff --git a/sdk/python/python/tau/widgets/ipython.py b/sdk/python/python/tau/widgets/ipython.py new file mode 100644 index 00000000..08579993 --- /dev/null +++ b/sdk/python/python/tau/widgets/ipython.py @@ -0,0 +1,121 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +"""IPython/Jupyter plugin loading for the TauGrid notebook panel. + +A platform-authored bootstrap cell loads the plugin without the end user ever +writing an import: IPython auto-loads the load_ipython_extension below when it +is registered (e.g. via %load_ext tau.widgets.ipython) and the plugin +self-registers a %taugrid line magic. + +Two modes, mirroring the TensorBoard notebook plugin: + + %load_ext tau.widgets.ipython + %taugrid # interactive widget panel + %taugrid name=my-rayjob namespace=ray # attach to an existing run + %taugrid --embed --name=my-rayjob --namespace=ray --portal=http://portal:8080 + +The --embed mode serves the TauGrid portal run view through a separate loopback-origin +proxy and frames it in the cell output, so the notebook shows the same UI as the +portal (the TensorBoard pattern). +""" + +from __future__ import annotations + +import re +from typing import Any, Dict, Set, Tuple + +_EMBED_KEYS = ("target", "height", "portal", "page_origin", "workspace") + + +def _parse_magic(line: str) -> Tuple[Set[str], Dict[str, str]]: + """Parse a magic argument line into (flags, kwargs). + + Accepts both the TensorBoard-style space-separated form + (--embed --name=x --namespace=y) and the comma-separated form + (name=x, namespace=y). + """ + flags: Set[str] = set() + kwargs: Dict[str, str] = {} + if not line: + return flags, kwargs + for raw in re.split(r"[,\s]+", line.strip()): + token = raw.strip() + if not token: + continue + if token.startswith("--"): + token = token[2:] + if "=" in token: + key, _, value = token.partition("=") + kwargs[key.strip()] = value.strip().strip("'\"") + else: + flags.add(token.strip()) + elif "=" in token: + key, _, value = token.partition("=") + kwargs[key.strip()] = value.strip().strip("'\"") + return flags, kwargs + + +def _truthy(value: Any) -> bool: + return str(value).strip().lower() in ("1", "true", "yes", "on") + + +def load_ipython_extension(ipython: Any) -> None: # pragma: no cover - ipython + """Register the %taugrid line magic on the running IPython instance.""" + from IPython.core.magic import Magics, line_magic, magics_class # type: ignore[import-not-found] + + from tau.widgets.panel import panel + + @magics_class + class _TauWidgetMagics(Magics): + @line_magic + def taugrid(self, line: str) -> Any: + flags, kwargs = _parse_magic(line) + + # name= attaches to an existing run; it is not a constructor arg. + run_name = kwargs.pop("name", None) + if "portal" in kwargs: + kwargs["portal_url"] = kwargs.pop("portal") + + embed = "embed" in flags or _truthy(kwargs.pop("embed", "false")) + embed_opts: Dict[str, Any] = {} + if embed: + for key in _EMBED_KEYS: + if key in kwargs: + embed_opts[key] = kwargs.pop(key) + if "portal" in embed_opts: + embed_opts["portal_url"] = embed_opts.pop("portal") + if "height" in embed_opts: + embed_opts["height"] = int(embed_opts["height"]) + + ctrl = panel(**kwargs) # type: ignore[call-arg] + if run_name: + ctrl.load(str(run_name)) + + if embed: + # TensorBoard pattern: the cell output is the framed portal UI. + return ctrl.embed(**embed_opts) + + # Return the panel, not a string: Jupyter renders its + # _repr_html_ as text/html, so the browser gets real SVG and class + # hooks instead of an escaped text repr. + return ctrl + + @line_magic + def tau(self, line: str) -> Any: # compatibility alias + return self.taugrid(line) + + ipython.register_magics(_TauWidgetMagics) + + +def unload_ipython_extension(ipython: Any) -> None: # pragma: no cover - ipython + """Remove the %taugrid magic when the extension is unloaded.""" + try: + from tau.widgets.panel import TauGridPanel # noqa: F401 + + del TauGridPanel + except Exception: + pass + + +__all__ = ["load_ipython_extension", "unload_ipython_extension"] diff --git a/sdk/python/python/tau/widgets/kube.py b/sdk/python/python/tau/widgets/kube.py new file mode 100644 index 00000000..5e6a3e1f --- /dev/null +++ b/sdk/python/python/tau/widgets/kube.py @@ -0,0 +1,60 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +"""Kubernetes client access for the notebook widget. + +The client is lazily built from kubeconfig / in-cluster config, and is +injectable so the panel is testable offline with fakes (no cluster, no network). +""" + +from __future__ import annotations + +from dataclasses import dataclass +from typing import Any + + +@dataclass +class ClusterClient: + """Bundle of the two Kubernetes API surfaces the widget uses. + + ``custom`` is a ``CustomObjectsApi``-shaped object; ``core`` is a + ``CoreV1Api``-shaped object. Each is injectable for offline tests. + """ + + custom: Any + core: Any + batch: Any = None + owned_api_client: Any = None + + def close(self): + if self.owned_api_client is not None: + self.owned_api_client.close() + + +def load_client(*, core: Any = None, custom: Any = None, batch: Any = None, retries: int | None = None) -> ClusterClient: + """Build a ``ClusterClient`` from runtime config or the injected fakes. + + When ``core``/``custom`` are provided they are used as-is (offline tests pass + fakes here). Otherwise the ``kubernetes`` client config is loaded lazily. + """ + if core is not None and custom is not None: + return ClusterClient(custom=custom, core=core, batch=batch) + + from kubernetes import client, config # lazy: only when a real cluster is used + + try: + config.load_incluster_config() + except Exception: # pragma: no cover - exercised when NOT in a cluster + try: + config.load_kube_config() + except Exception: # pragma: no cover - no config available + config.load_config() + + configuration = client.Configuration.get_default_copy() + if retries is not None: + configuration.retries = retries + api = client.ApiClient(configuration) + return ClusterClient(custom=client.CustomObjectsApi(api), core=client.CoreV1Api(api), batch=client.BatchV1Api(api), owned_api_client=api) + + +__all__ = ["ClusterClient", "load_client"] diff --git a/sdk/python/python/tau/widgets/metrics.py b/sdk/python/python/tau/widgets/metrics.py new file mode 100644 index 00000000..071ca8f5 --- /dev/null +++ b/sdk/python/python/tau/widgets/metrics.py @@ -0,0 +1,152 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +"""Loss/metrics sources for the notebook widget. + +Three adapters map to the design's loss-source chain (metrics file -> stdout -> +portal series). Every adapter is a pure function of its inputs or takes an +injectable ``opener``, so the whole surface is testable offline. +""" + +from __future__ import annotations + +import json +import re +from dataclasses import dataclass +from typing import Any, Callable, Dict, List, Optional +from urllib.parse import urlencode + +_TAG_RE = re.compile(r"^\s*(?:step\s*=\s*(\d+)\s+)?loss\s*=\s*([+-]?(?:\d+\.?\d*|\.\d+)(?:[eE][+-]?\d+)?)\s*$") + + +@dataclass(frozen=True) +class MetricSample: + step: int + value: float + + +@dataclass +class MetricSeries: + """Loss series for the panel; empty when no samples yet.""" + + samples: List[MetricSample] = None # type: ignore[assignment] + + def __post_init__(self) -> None: + if self.samples is None: + object.__setattr__(self, "samples", []) + + @property + def has_data(self) -> bool: + return len(self.samples) >= 1 + + @property + def first(self) -> Optional[MetricSample]: + return self.samples[0] if self.samples else None + + @property + def last(self) -> Optional[MetricSample]: + return self.samples[-1] if self.samples else None + + +def parse_stdout_line(line: str) -> Optional[MetricSample]: + """Parse a ``loss`` / ``step=.. loss=..`` line, or None if it does not match.""" + match = _TAG_RE.match(line) + if not match: + return None + step_text, loss_text = match.groups() + step = int(step_text) if step_text is not None else 0 + value = float(loss_text) + return MetricSample(step=step, value=value) + + +def read_metrics_file(path: Any) -> MetricSeries: + """Parse JSONL at ```` path; malformed lines are skipped. + + Each object is ``{"step": int, "loss": float}``; non-numeric entries are + skipped rather than failing the whole stream. + """ + series = MetricSeries() + with open(str(path), "r", encoding="utf-8") as handle: + for raw in handle: + raw = raw.strip() + if not raw: + continue + try: + record = json.loads(raw) + except json.JSONDecodeError: + continue + try: + step = int(record["step"]) + value = float(record["loss"]) + except (KeyError, TypeError, ValueError): + continue + series.samples.append(MetricSample(step=step, value=value)) + return series + + +def parse_stdout(stream: Any) -> MetricSeries: + """Collect loss samples from any iterable of lines using the stdout convention.""" + series = MetricSeries() + for line in stream: + sample = parse_stdout_line(line) + if sample is not None: + series.samples.append(sample) + return series + + +class StellarSeriesClient: + """Reads the portal ``/api/stellar/series`` endpoint through an injectable opener.""" + + def __init__(self, base_url: str, opener: Optional[Callable[[str], Any]] = None) -> None: + self.base_url = base_url.rstrip("/") + self._opener = opener or _default_urlopen + + def series(self, *, target: str, metric: str = "train/loss", max_points: int = 1000) -> MetricSeries: + params = urlencode({"target": target, "metric": metric, "max_points": max_points}) + url = f"{self.base_url}/api/stellar/series?{params}" + body = self._opener(url) + return _series_from_payload(body) + + +def _series_from_payload(payload: Any) -> MetricSeries: + if isinstance(payload, str): + try: + payload = json.loads(payload) + except json.JSONDecodeError: + return MetricSeries() + chart = (payload or {}).get("chart") or {} + series = MetricSeries() + for s in chart.get("series") or []: + for point in s.get("values") or []: + try: + series.samples.append(MetricSample(step=int(point["step"]), value=float(point["value"]))) + except (KeyError, TypeError, ValueError): + continue + return series + + +def _default_urlopen(url: str) -> Any: # pragma: no cover - exercised only against a real portal + import urllib.request + + with urllib.request.urlopen(url) as resp: + return json.loads(resp.read().decode("utf-8")) + + +def loss_delta(series: MetricSeries) -> Dict[str, Optional[Any]]: + """Summarize a series the way the panel hero renders it.""" + if not series.has_data: + return {"direction": None, "percent": None, "first": None, "last": None} + first = series.first + last = series.last + if first is None or last is None or first.value == 0: + return {"direction": None, "percent": None, "first": first, "last": last} + change = (last.value - first.value) / abs(first.value) + return { + "direction": "down" if change < 0 else ("up" if change > 0 else "flat"), + "percent": abs(change) * 100, + "first": first, + "last": last, + } + + +__all__ = ["MetricSeries", "MetricSample", "read_metrics_file", "parse_stdout", "parse_stdout_line", "StellarSeriesClient", "loss_delta"] \ No newline at end of file diff --git a/sdk/python/python/tau/widgets/panel.py b/sdk/python/python/tau/widgets/panel.py new file mode 100644 index 00000000..f10ffc71 --- /dev/null +++ b/sdk/python/python/tau/widgets/panel.py @@ -0,0 +1,445 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +"""The ipywidgets panel for the notebook plugin. + +TauGridPanel builds the widget; panel() is the convenience entry point a +platform-authored template cell calls. ipywidgets (and IPython) are imported +lazily so a plain import tau never requires them; on hosts without a widget +manager the panel degrades to a plain-HTML render() snapshot. + +The panel supports two run flows: + +* submit the current notebook as a Kueue-admitted RayJob, and +* load an existing RayJob from the cluster by name and check its status. + +Both are read-only with respect to any run the panel did not create: load and +watch never mutate or delete cluster resources. +""" + +from __future__ import annotations + +import html +from pathlib import Path +from typing import Any, Optional + +from tau._backend import KubernetesBackend +from tau._notebook_pkg import MAX_INPUT_BYTES, StagedPayload +from tau._notebook_submit import build_plan, submit_plan +from tau._render import Profile +from tau.widgets.embed import EmbedView, PortalProxy, experiment_path, iframe_html, ray_dashboard_path, run_view_path, same_origin +from tau.widgets.kube import ClusterClient +from tau.widgets.metrics import MetricSeries +from tau.widgets.render import diagnostics_html, loss_delta_text, status_header_html, svg_loss_chart +from tau.widgets.status import RunStatus, list_runs, read_run_status +from tau.widgets.watcher import DEFAULT_INTERVAL, StatusWatcher + + +class TauGridPanel: + """ipywidgets layout shell; render() is UI-free and testable. + + client and opener are injected so the panel works and is testable without a + cluster. The interactive widget tree is built lazily by build() only when a + display is actually needed. + """ + + def __init__( + self, + *, + namespace: str = "ray", + run_name: str = "", + portal_url: str = "https://portal.contoso.com", + client: Optional[ClusterClient] = None, + ) -> None: + self.namespace = namespace + self.run_name = run_name + self.portal_url = portal_url.rstrip("/") + self.client = client + self.loss: MetricSeries = MetricSeries() + self.staged: Optional[StagedPayload] = None + self.manifest: Optional[Any] = None + self.notebook_path: Optional[str] = None # manual override wins (design 4.1) + self.status: Optional[RunStatus] = None + self.watcher: Optional[StatusWatcher] = None + self.embed_view: Optional[EmbedView] = None + self._proxy: Optional[PortalProxy] = None + self._controls: Optional[Any] = None + + # -- notebook identity (design 4.1: manual override is authoritative) -- + def set_notebook_path(self, path: Optional[str]) -> None: + """Set a manual notebook path override (visible and authoritative).""" + self.notebook_path = path + # A built tree must reflect the override immediately: the Submit button + # enables once a notebook identity is known (S005). + self._repaint_controls() + + # -- load an existing run from the cluster (read-only) -- + def load(self, name: str, namespace: Optional[str] = None, *, client: Optional[ClusterClient] = None) -> RunStatus: + """Attach the panel to an existing RayJob and read its status. + + This is the "load job from the cluster" path: it performs a single + read-only get and switches the panel into run view. It never creates, + mutates, or deletes a resource. + """ + if namespace: + self.namespace = namespace + if client is not None: + self.client = client + self.run_name = name + self.status = self._read_status() + self._repaint_controls() + return self.status if self.status is not None else RunStatus(name=name, namespace=self.namespace) + + #: Alias that reads better at call sites that just want the current state. + def check_status(self) -> Optional[RunStatus]: + """Re-read the attached run's status and return the normalized result.""" + return self.refresh_status() + + def list_runs(self, *, label_selector: Optional[str] = None) -> list: + """List RayJobs in the panel's namespace (for a run chooser).""" + if self.client is None: + return [] + return list_runs(self.client, namespace=self.namespace, label_selector=label_selector) + + # -- TensorBoard-style inline embed of the portal UI -- + def embed( + self, + *, + target: str = "run", + height: int = 640, + portal_url: Optional[str] = None, + page_origin: Optional[str] = None, + workspace: Optional[str] = None, + ) -> EmbedView: + """Embed the TauGrid portal UI inline in the notebook cell. + + This legacy kernel-identity helper removes upstream frame restrictions + through a separate loopback origin. It is not same-origin with Jupyter; + use it only with a trusted local kernel and portal. + + target selects the portal view: "run" (run detail), "ray" (the run's Ray + dashboard, needs a resolved ray_cluster_name), or "experiments" (the + Stellar view for the run's job id). Returns an EmbedView whose HTML is a + framed view plus a direct portal link fallback. + """ + portal = (portal_url or self.portal_url).rstrip("/") + path = self._embed_path(target, workspace=workspace) + direct = portal + path + + # Direct frames require matching origins; otherwise use the opt-in proxy. + use_proxy = not (page_origin and same_origin(page_origin, portal)) + if use_proxy: + if self._proxy is None: + self._proxy = PortalProxy(portal).start() + url = self._proxy.url(path) + else: + url = direct + + view = EmbedView( + url=url, + path=path, + portal_url=portal, + html=iframe_html(url, height=height, link=direct), + proxied=use_proxy, + ) + self.embed_view = view + return view + + def _embed_path(self, target: str, *, workspace: Optional[str] = None) -> str: + if target == "run": + if not self.run_name: + raise ValueError("embed(target='run') needs a run name: call load() or pass run_name=") + path = run_view_path(self.namespace, self.run_name) + elif target == "ray": + cluster = self.status.ray_cluster_name if self.status else None + if not cluster: + raise ValueError( + "embed(target='ray') needs a resolved Ray cluster: call load() first so the " + "RayJob status reports rayClusterName" + ) + path = ray_dashboard_path(self.namespace, cluster) + elif target == "experiments": + run_id = self.status.job_id if self.status else None + if not run_id: + raise ValueError("embed(target='experiments') needs a job id: call load() first") + path = experiment_path(run_id) + else: + raise ValueError(f"unknown embed target {target!r}; expected run, ray, or experiments") + if workspace: + joiner = "&" if "?" in path else "?" + path = f"{path}{joiner}workspace={workspace}" + return path + + def close(self) -> None: + """Stop the embed proxy and the status watcher, if either is running.""" + self.stop_watching() + if self._proxy is not None: + self._proxy.stop() + self._proxy = None + + # -- data (pure, offline-testable) -- + def refresh_status(self) -> Optional[RunStatus]: + """Re-read status for the attached run; None when no client is set.""" + self.status = self._read_status() + return self.status + + def _read_status(self) -> Optional[RunStatus]: + if self.client is None: + return None + if not self.run_name: + return None + return read_run_status(self.client, namespace=self.namespace, name=self.run_name) + + def set_loss(self, series: MetricSeries) -> None: + self.loss = series + + # -- watch (single-flight poll loop) -- + def watch(self, *, interval: float = DEFAULT_INTERVAL) -> Optional[StatusWatcher]: + """Start polling the attached run's status until it is terminal. + + Returns the watcher, or None when there is no client/run to watch. The + watcher is generation-tagged, so stop_watching() discards late replies. + """ + if self.client is None or not self.run_name: + return None + self.stop_watching() + self.watcher = StatusWatcher(self._read_status, on_update=self._on_watch_update, interval=interval) + self.watcher.start() + return self.watcher + + def stop_watching(self) -> None: + """Stop polling. Never cancels or deletes the run.""" + if self.watcher is not None: + self.watcher.stop() + self.watcher = None + + def _on_watch_update(self, status: Optional[RunStatus]) -> None: + if status is not None: + self.status = status + self._repaint_controls() + + # -- submit (design 5.2: the panel IS the submit path) -- + def submit( + self, + notebook: Optional[str] = None, + *, + notebook_bytes: Optional[bytes] = None, + cluster: Optional[Any] = None, + profile: Optional[Profile] = None, + queue: Optional[str] = None, + runtime_pip: Optional[list] = None, + backend: Optional[KubernetesBackend] = None, + staging_dir: Optional[Any] = None, + env: Optional[dict] = None, + env_secret: Optional[dict] = None, + input_cap: int = MAX_INPUT_BYTES, + ) -> Any: + """Submit the current notebook as a Kueue-admitted RayJob. + + The full chain, each step injectable so tests run offline with fakes: + + 1. package the notebook bytes into a self-contained staged payload + (_notebook_pkg.package); + 2. resolve the worker profile and Kueue queue (_profile.resolve from the + TauCluster CRD, or the explicit args); + 3. render the constrained ray.io/v1 RayJob (_render.render_rayjob): + spec.suspend true, managedBy absent, queue label, control-only head, + worker sizing from the profile; + 4. apply it through KubernetesBackend (no tau binary, no kubectl), then + switch the panel into run view. + + Returns the SubmittedRun-shaped handle. + """ + bytes_in = notebook_bytes + if bytes_in is None: + path = notebook or self.run_name or "" + if not path: + raise ValueError( + "no notebook to submit: resolve the current notebook from " + "the Jupyter session or pass notebook=/notebook_bytes=" + ) + with Path(path).open("rb") as source: + bytes_in = source.read(input_cap + 1) + + plan = build_plan( + client=self.client, notebook_bytes=bytes_in, namespace=self.namespace, + name=self.run_name or "analysis", profile=profile, queue=queue, cluster=cluster, + pip=runtime_pip, env=env, env_secret=env_secret, input_cap=input_cap, + staging_dir=staging_dir or self._default_staging_dir(), + ) + handle = submit_plan(client=self.client, plan=plan, backend=backend) + self.run_name = plan.name + self.staged = plan.staged + self.manifest = plan.manifest + self.status = RunStatus( + existing=True, + name=plan.name, + namespace=self.namespace, + state="queued", + display_state="queued", + queue=plan.queue, + ) + self._repaint_controls() + return handle + + def _default_staging_dir(self) -> Any: + import tempfile + + return Path(tempfile.mkdtemp(prefix="tau-notebook-")) + + # -- output -- + def render(self) -> str: + """A plain-HTML render of the panel (used for Save HTML export).""" + parts = [ + "
", + self._status_html(), + f"
{loss_delta_text(self.loss)}
", + svg_loss_chart(self.loss), + ] + if self.status is not None: + parts.append(diagnostics_html(self.status)) + parts.append("
") + return "".join(parts) + + def _repr_html_(self) -> str: + """The notebook display convention: Jupyter renders this as real HTML. + + Returning the panel itself from %taugrid (rather than render()'s plain + string) makes JupyterLab present the panel as text/html, so the browser + renders the SVG and class hooks as DOM nodes. + """ + return self.render() + + # -- interactive widget tree (the button in the notebook) -- + def build(self) -> Any: + """Build the interactive panel: Submit/Load/Refresh buttons, status, chart. + + Requires ipywidgets (the tau[widgets] extra). The tree is constructible + without a frontend, so its wiring is unit-testable offline; the widget + manager only enters the picture on display. + """ + import ipywidgets as widgets # lazy: only when a real button is wanted + + if self.client is not None and self.run_name: + self.refresh_status() + + submit_button = widgets.Button( + description="Submit notebook", + button_style="primary", + tooltip="Package this notebook and submit it as a Kueue-admitted RayJob", + disabled=self._submit_disabled(), + ) + run_input = widgets.Text( + value=self.run_name, + description="Run name", + placeholder="existing RayJob name", + ) + load_button = widgets.Button(description="Load run", tooltip="Load an existing RayJob and check its status") + refresh_button = widgets.Button(description="Refresh", tooltip="Re-read run status") + status = widgets.HTML(self._status_html()) + chart = widgets.HTML(self.render()) + + submit_button.on_click(self._on_submit_clicked) + load_button.on_click(self._on_load_clicked) + refresh_button.on_click(self._on_refresh_clicked) + + self._controls = { + "submit": submit_button, + "load": load_button, + "run_input": run_input, + "refresh": refresh_button, + "status": status, + "chart": chart, + } + return widgets.VBox( + [ + status, + widgets.HBox([submit_button, refresh_button]), + widgets.HBox([run_input, load_button]), + chart, + ], + layout=widgets.Layout(border="1px solid #e2e8f0", padding="8px"), + ) + + def _submit_disabled(self) -> bool: + """The Submit button is disabled until a notebook path is known (S005).""" + return not bool(self.notebook_path) + + def _status_html(self) -> str: + """One-line state header: run identity plus run state (design 6.3).""" + if self.status is not None and self.status.existing: + return status_header_html(self.status) + if not self.notebook_path: + return "
notebook path not resolved
" + if not self.run_name: + return f"
not submitted - {html.escape(str(self.notebook_path))}
" + state = self.status.display_state if self.status is not None else "unknown" + return f"
{html.escape(self.run_name)}: {html.escape(str(state))} - {html.escape(str(self.notebook_path))}
" + + def _repaint_controls(self) -> None: + if self._controls is None: + return + self._controls["submit"].disabled = self._submit_disabled() + self._controls["status"].value = self._status_html() + self._controls["chart"].value = self.render() + + def _on_submit_clicked(self, _change: Any = None) -> Any: + """The Submit button's action: run the full chain, then repaint status. + + The button's on_click registers this handler; tests call it directly to + exercise the same path a user click drives. + """ + if self._submit_disabled(): + raise ValueError( + "no notebook to submit: resolve it from the Jupyter session or " + "set a manual path with panel.set_notebook_path(...)" + ) + handle = self.submit(notebook=self.notebook_path) + # Re-submission is allowed, so the button re-enables; the status line + # switches into run view (design 6.3). + self._repaint_controls() + return handle + + def _on_load_clicked(self, _change: Any = None) -> Optional[RunStatus]: + """The Load button's action: attach to the named run and read status.""" + name = "" + if self._controls is not None: + name = str(self._controls["run_input"].value or "").strip() + name = name or self.run_name + if not name: + raise ValueError("enter a RayJob name to load") + return self.load(name) + + def _on_refresh_clicked(self, _change: Any = None) -> None: + """The Refresh button's action: re-read status and repaint.""" + self.refresh_status() + self._repaint_controls() + + def _ipython_display_(self) -> Any: + """Prefer the interactive button tree; degrade to static HTML. + + IPython calls this for %taugrid; when a widget manager is present the + real Submit button renders, and without one the static _repr_html_ + snapshot is used instead (design: degrade, don't fail). + """ + try: + tree = self.build() + except ImportError as exc: + raise NotImplementedError("ipywidgets not installed") from exc + + from IPython.display import display # type: ignore[import-not-found] + + display(tree) + return None + + +def panel(**kwargs: Any) -> Any: + """Build and return a TauGridPanel. + + This is the one function a platform-authored template cell calls + (import tau.widgets as tg; tg.panel()). + """ + return TauGridPanel(**kwargs) + + +__all__ = ["TauGridPanel", "panel"] diff --git a/sdk/python/python/tau/widgets/render.py b/sdk/python/python/tau/widgets/render.py new file mode 100644 index 00000000..3f895d94 --- /dev/null +++ b/sdk/python/python/tau/widgets/render.py @@ -0,0 +1,158 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +"""Pure HTML/SVG fragments the panel renders (no ipywidgets dependency). + +Keeping these as pure functions means the visual rules are unit-testable offline +(golden text / aria attributes / numeric labels) without a notebook frontend. +""" + +from __future__ import annotations + +import html +from typing import Optional + +from tau.widgets.metrics import MetricSeries, loss_delta +from tau.widgets.status import RunStatus + + +def loss_delta_text(series: MetricSeries) -> str: + """The panel's one-line loss headline: words + numbers above the chart. + + ``loss down 88.4% 0.9230 -> 0.1040``, ``waiting for the first steps`` when + fewer than two points, and a warn-flavored ``loss up`` when it rises. + """ + if not series.has_data: + return "waiting for the first steps" + delta = loss_delta(series) + first, last = series.first, series.last + if first is None or last is None or delta["percent"] is None: + return "waiting for the first steps" + direction = delta["direction"] + if direction == "up": + return f"loss up {delta['percent']:.1f}% (warn) {first.value:.4f} -> {last.value:.4f}" + if direction == "down": + return f"loss down {delta['percent']:.1f}% {first.value:.4f} -> {last.value:.4f}" + return "loss flat" + + +def svg_loss_chart( + series: MetricSeries, + *, + width: int = 300, + height: int = 80, + label: str = "train/loss", +) -> str: + """A minimal, dependency-free inline SVG line chart with an accessible label. + + Returns ``""`` when the series has fewer than two points so the panel can + show the waiting state instead of a meaningless line. + """ + if len(series.samples) < 2: + return "" + xs = [s.step for s in series.samples] + ys = [s.value for s in series.samples] + x0, x1, y0, y1 = min(xs), max(xs), min(ys), max(ys) + span_x = (x1 - x0) or 1 + span_y = (y1 - y0) or 1.0 + + points: list[str] = [] + for i, s in enumerate(series.samples): + px = 2 + (s.step - x0) / span_x * (width - 4) + py = height - 2 - (s.value - y0) / span_y * (height - 4) + points.append(f"{px:.1f},{py:.1f}") + + polyline = " ".join(points) + return ( + f"" + f"" + ) + + +def gpu_bar(percent: Optional[float], observed: bool, width: int = 20) -> str: + """One per-device GPU utilization bar; renders ``not reported`` when unknown. + + The numeric percentage is printed so color is never the only signal. + """ + if not observed or percent is None: + return "not reported" + fill = max(0, min(1000, int(percent * 10))) # percent in tenths + frac = fill / 10.0 + n = int(round(width * frac)) + n = max(0, min(width, n)) + bar = "\u2588" * n + return f"{html.escape(bar)} {percent:.1f}%" + + +_STATE_LABELS = { + "queued": "Pending (not yet admitted)", + "running": "Running", + "failed": "Failed", + "complete": "Complete", + "not_submitted": "Not submitted", + "unknown": "Unknown", +} + + +def state_badge(state: Optional[str]) -> str: + """A text badge for the run state; text carries the meaning, not color.""" + key = (state or "unknown").lower() + label = _STATE_LABELS.get(key, key.replace("_", " ").title()) + return f"{html.escape(label)}" + + +def status_header_html(status: "RunStatus") -> str: + """The panel's one-line run header built from a normalized RunStatus. + + Includes run identity, the state badge, queue, pod readiness, the Ray + cluster name, and any message. All externally supplied text is escaped. + """ + if not status.existing: + return ( + "
" + f"{state_badge(status.state)} run {html.escape(status.namespace)}/{html.escape(status.name)} not found" + "
" + ) + + parts = [ + f"{html.escape(status.namespace)}/{html.escape(status.name)}", + state_badge(status.state), + ] + if status.queue: + parts.append(f"queue {html.escape(status.queue)}") + if status.total_pods: + parts.append(f"{status.ready_pods}/{status.total_pods} pods ready") + if status.ray_cluster_name: + parts.append(f"ray cluster {html.escape(status.ray_cluster_name)}") + if status.job_id: + parts.append(f"job {html.escape(status.job_id)}") + if status.message: + parts.append(html.escape(status.message)) + + return "
" + " · ".join(parts) + "
" + + +def diagnostics_html(status: "RunStatus") -> str: + """Render diagnostics as a list; empty string when there are none.""" + if not status.diagnostics: + return "" + rows = [] + for item in status.diagnostics: + suggestion = f" {html.escape(item.suggestion)}" if item.suggestion else "" + rows.append( + f"
  • " + f"{html.escape(item.code)} {html.escape(item.message)}{suggestion}
  • " + ) + return "
      " + "".join(rows) + "
    " + + +__all__ = [ + "loss_delta_text", + "svg_loss_chart", + "gpu_bar", + "state_badge", + "status_header_html", + "diagnostics_html", +] \ No newline at end of file diff --git a/sdk/python/python/tau/widgets/session.py b/sdk/python/python/tau/widgets/session.py new file mode 100644 index 00000000..82bc50a8 --- /dev/null +++ b/sdk/python/python/tau/widgets/session.py @@ -0,0 +1,66 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +"""Resolve the current notebook path from the Jupyter server. + +The kernel resolves the notebook it is running in via the Jupyter Sessions API +(``GET {base}/api/sessions``): the session whose ``kernel.id`` matches this +kernel is authoritative for ``path``. Resolution is a pure function of an +injectable ``opener``/session provider so it can be tested offline. +""" + +from __future__ import annotations + +import json +from typing import Any, Callable, List, Mapping, Optional + + +class NotebookNotResolved(Exception): + """The current notebook could not be resolved from the Jupyter session API.""" + + +def resolve_notebook_path( + sessions: List[Mapping[str, Any]], + kernel_id: Optional[str], +) -> Optional[str]: + """Return the ``path`` for the session matching ``kernel_id``. + + Returns ``None`` (rather than raising) when there is no match, so callers + can show the manual-path state. Prefers the top-level ``path``; falls back to + ``notebook.path`` (legacy). + """ + if not kernel_id: + return None + for session in sessions: + kernel = session.get("kernel") or {} + if str(kernel.get("id")) != str(kernel_id): + continue + path = session.get("path") or (session.get("notebook") or {}).get("path") + if path: + return str(path) + return None + + +class SessionsApiResolver: + """Resolve through a real (or fake) Jupyter ``/api/sessions`` endpoint.""" + + def __init__(self, base_url: str, opener: Optional[Callable[[str], Any]] = None) -> None: + self.base_url = base_url.rstrip("/") + self._opener = opener or _default_sessions_get + + def sessions(self) -> List[Mapping[str, Any]]: + url = f"{self.base_url}/api/sessions" + data = self._opener(url) + if isinstance(data, str): + data = json.loads(data) + return data if isinstance(data, list) else [] + + +def _default_sessions_get(url: str) -> Any: # pragma: no cover - only against a live server + import urllib.request + + with urllib.request.urlopen(url) as resp: + return json.loads(resp.read().decode("utf-8")) + + +__all__ = ["NotebookNotResolved", "resolve_notebook_path", "SessionsApiResolver"] \ No newline at end of file diff --git a/sdk/python/python/tau/widgets/status.py b/sdk/python/python/tau/widgets/status.py new file mode 100644 index 00000000..4a6b8297 --- /dev/null +++ b/sdk/python/python/tau/widgets/status.py @@ -0,0 +1,378 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +"""Run status model + reader for the notebook widget. + +The reader is a pure function of an injectable ClusterClient-shaped object, +so tests can drive it with a recorded fake offline (no cluster, no network). + +Two capabilities live here: + +* read_run_status normalizes one RayJob (plus its pods) into a RunStatus. It + never raises: a missing object becomes state="not_submitted" and a read + failure becomes a diagnostic. +* list_runs discovers RayJobs in a namespace so the panel can offer + "load an existing run" without the caller knowing the name up front. +""" + +from __future__ import annotations + +from dataclasses import dataclass, field +from typing import Any, Dict, List, Optional + +from tau.widgets.kube import ClusterClient + +RAY_GROUP = "ray.io" +RAY_VERSION = "v1" +RAY_PLURAL = "rayjobs" + +#: Coarse states the panel renders. not_submitted means no object was found. +TERMINAL_STATES = ("complete", "failed") + +#: RayJob status.jobStatus values mapped onto the coarse states. +_COMPLETE_STATUSES = ("SUCCEEDED", "COMPLETED", "SUCCESS") +_FAILED_STATUSES = ("FAILED", "DEAD", "ERROR") +_QUEUED_STATUSES = ("PENDING", "SUSPENDED", "QUEUED") + + +@dataclass +class Diagnostic: + """A user-facing observation about the run, with a suggested next step.""" + + code: str + severity: str # info | warn | error + message: str + suggestion: Optional[str] = None + + +@dataclass +class GPUDevice: + """Per-device GPU observation (mirrors metrics.gpuRuntime.devices).""" + + pod: Optional[str] = None + gpu: Optional[str] = None + utilization_percent: Optional[float] = None + utilization_observed: bool = False + framebuffer_used_mib: Optional[float] = None + framebuffer_used_observed: bool = False + + +@dataclass +class PodInfo: + name: str = "" + phase: Optional[str] = None + node: Optional[str] = None + ready: bool = False + restarts: int = 0 + ray_node_type: Optional[str] = None + + +@dataclass +class RunStatus: + """Normalized status for one RayJob, consumed by the panel.""" + + existing: bool = False + name: str = "" + namespace: str = "" + state: Optional[str] = None # queued | running | failed | complete | not_submitted + display_state: Optional[str] = None + ray_cluster_name: Optional[str] = None + job_id: Optional[str] = None + deployment_status: Optional[str] = None + queue: Optional[str] = None + admitted: Optional[bool] = None + message: Optional[str] = None + reason: Optional[str] = None + pods: List[PodInfo] = field(default_factory=list) + gpu_devices: List[GPUDevice] = field(default_factory=list) + diagnostics: List[Diagnostic] = field(default_factory=list) + + @property + def terminal(self) -> bool: + """True once the run reached an authoritative terminal state.""" + return self.state in TERMINAL_STATES + + @property + def ready_pods(self) -> int: + return sum(1 for pod in self.pods if pod.ready) + + @property + def total_pods(self) -> int: + return len(self.pods) + + +@dataclass(frozen=True) +class RunSummary: + """A lightweight row for the run chooser (list_runs).""" + + name: str + namespace: str + state: Optional[str] = None + queue: Optional[str] = None + created: Optional[str] = None + + +def classify(rayjob: Optional[Dict[str, Any]]) -> str: + """Map a RayJob document to one of the widget's coarse states.""" + if not rayjob: + return "not_submitted" + status = rayjob.get("status") or {} + job = str(status.get("jobStatus") or "").upper() + deployment = str(status.get("jobDeploymentStatus") or "").upper() + reason = str(status.get("reason") or "").upper() + if job in (*_FAILED_STATUSES, "STOPPED", "CANCELLED", "CANCELED") or deployment == "FAILED" or reason in ("SUBMISSIONFAILED", "DEADLINEEXCEEDED", "BACKOFFLIMITEXCEEDED"): + return "failed" + if job in _COMPLETE_STATUSES or deployment in ("COMPLETE", "COMPLETED"): + return "complete" + if job == "RUNNING" or (not job and deployment == "RUNNING"): + return "running" + if (not job and not deployment) or job in _QUEUED_STATUSES or deployment in ("INITIALIZING", "SUSPENDED", "WAITFORCLUSTER", "WAITFORUSER") or (rayjob.get("spec") or {}).get("suspend"): + return "queued" + return "unknown" + + +def read_run_status( + client: ClusterClient, + *, + namespace: str, + name: str, +) -> RunStatus: + """Build a normalized RunStatus from the cluster client. + + The fake client used in offline tests records + get_namespaced_custom_object and list_namespaced_pod returns; a missing + object (None or an ApiException with status 404) yields existing=False. + Never raises: any other read failure is recorded as a diagnostic so the + panel can show a partial status. + """ + info = RunStatus(name=name, namespace=namespace) + + rayjob: Optional[Dict[str, Any]] = None + try: + rayjob = client.custom.get_namespaced_custom_object( + group=RAY_GROUP, version=RAY_VERSION, namespace=namespace, plural=RAY_PLURAL, name=name + ) + info.existing = bool(rayjob) + info.state = classify(rayjob) + except Exception as exc: # missing object or a read failure + if _is_not_found(exc): + info.existing = False + info.state = "not_submitted" + else: + info.existing = False + info.state = "unknown" + info.diagnostics.append( + Diagnostic( + code="status-read-failed", + severity="error", + message=f"could not read RayJob {namespace}/{name}: {exc}", + suggestion="check cluster connectivity and RBAC (get rayjobs.ray.io)", + ) + ) + + if rayjob: + _fill_from_rayjob(info, rayjob) + _read_pods(client, info) + _derive_diagnostics(info) + + info.display_state = (info.state or "unknown").lower() + return info + + +def list_runs(client: ClusterClient, *, namespace: str, label_selector: Optional[str] = None) -> List[RunSummary]: + """List RayJobs in namespace as lightweight summaries. + + Returns an empty list (never raises) when the listing fails, so a run + chooser can degrade to "enter a name manually". + """ + kwargs: Dict[str, Any] = {"group": RAY_GROUP, "version": RAY_VERSION, "namespace": namespace, "plural": RAY_PLURAL} + if label_selector: + kwargs["label_selector"] = label_selector + try: + listing = client.custom.list_namespaced_custom_object(**kwargs) + except Exception: + return [] + + rows: List[RunSummary] = [] + for item in _items(listing): + if not isinstance(item, dict): + continue + metadata = item.get("metadata") or {} + row_name = str(metadata.get("name") or "") + if not row_name: + continue + labels = metadata.get("labels") or {} + rows.append( + RunSummary( + name=row_name, + namespace=namespace, + state=classify(item), + queue=labels.get("kueue.x-k8s.io/queue-name"), + created=metadata.get("creationTimestamp"), + ) + ) + return rows + + +def _fill_from_rayjob(info: RunStatus, rayjob: Dict[str, Any]) -> None: + metadata = rayjob.get("metadata") or {} + status = rayjob.get("status") or {} + labels = metadata.get("labels") or {} + + info.queue = labels.get("kueue.x-k8s.io/queue-name") or info.queue + info.ray_cluster_name = _opt_str(status.get("rayClusterName")) + info.job_id = _opt_str(status.get("jobId")) + info.deployment_status = _opt_str(status.get("jobDeploymentStatus")) + info.reason = _opt_str(status.get("reason")) + info.message = _opt_str(status.get("message")) + + # Kueue admission: a suspended RayJob that has been admitted loses the + # suspend flag; the condition is the authoritative signal when present. + conditions = status.get("conditions") or [] + for condition in conditions: + if not isinstance(condition, dict): + continue + if str(condition.get("type", "")).lower() == "admitted": + info.admitted = str(condition.get("status", "")).lower() == "true" + if condition.get("message"): + info.message = _opt_str(condition.get("message")) + break + + +def _read_pods(client: ClusterClient, info: RunStatus) -> None: + """Read pods for the run, trying each plausible label selector once.""" + seen: Dict[str, PodInfo] = {} + for selector in _pod_selectors(info.name, info.ray_cluster_name): + try: + listing = client.core.list_namespaced_pod(info.namespace, label_selector=selector) + except Exception: + continue + for pod in _items(listing): + pod_info = _pod_info(pod) + if pod_info.name and pod_info.name not in seen: + seen[pod_info.name] = pod_info + info.pods = sorted(seen.values(), key=lambda p: p.name) + + +def _pod_selectors(name: str, ray_cluster_name: Optional[str]) -> List[str]: + selectors = [f"job-name={name}"] + if ray_cluster_name: + selectors.insert(0, f"ray.io/cluster={ray_cluster_name}") + # De-dup while preserving order (the cluster selector is the most precise). + ordered: List[str] = [] + for selector in selectors: + if selector not in ordered: + ordered.append(selector) + return ordered + + +def _pod_info(pod: Any) -> PodInfo: + """Normalize a pod from either a dict (fakes) or a V1Pod (real SDK).""" + metadata = _field(pod, "metadata") or {} + spec = _field(pod, "spec") or {} + status = _field(pod, "status") or {} + labels = _field(metadata, "labels") or {} + + container_statuses = _field(status, "container_statuses", "containerStatuses") or [] + restarts = sum(int(_field(c, "restart_count", "restartCount") or 0) for c in container_statuses) + ready = _pod_ready(status, container_statuses) + return PodInfo( + name=str(_field(metadata, "name") or ""), + phase=_opt_str(_field(status, "phase")), + node=_opt_str(_field(spec, "node_name", "nodeName")), + ready=ready, + restarts=restarts, + ray_node_type=_opt_str(labels.get("ray.io/node-type") if isinstance(labels, dict) else None), + ) + + +def _pod_ready(status: Any, container_statuses: List[Any]) -> bool: + for condition in _field(status, "conditions") or []: + if str(_field(condition, "type") or "").lower() == "ready": + return str(_field(condition, "status") or "").lower() == "true" + if container_statuses: + return all(bool(_field(c, "ready")) for c in container_statuses) + return False + + +def _field(obj: Any, snake: str, camel: Optional[str] = None) -> Any: + """Read a field from a dict (camelCase key) or an SDK object (snake_case).""" + if obj is None: + return None + if isinstance(obj, dict): + if camel is not None and camel in obj: + return obj[camel] + return obj.get(snake) + return getattr(obj, snake, None) + + +def _derive_diagnostics(info: RunStatus) -> None: + if info.state == "failed": + info.diagnostics.append( + Diagnostic( + code="rayjob-failed", + severity="error", + message=info.message or info.reason or "the RayJob reported a failed status", + suggestion="open the pod logs for the failing container and fix the entrypoint", + ) + ) + elif info.state == "queued": + info.diagnostics.append( + Diagnostic( + code="awaiting-admission", + severity="info", + message=info.message or "waiting for Kueue to admit the workload", + suggestion=f"check queue {info.queue or 'default'} quota and pending workloads", + ) + ) + elif info.state == "complete": + info.diagnostics.append( + Diagnostic(code="rayjob-complete", severity="info", message="the RayJob completed successfully") + ) + + restarted = [pod.name for pod in info.pods if pod.restarts > 0] + if restarted: + info.diagnostics.append( + Diagnostic( + code="pod-restarts", + severity="warn", + message=f"{len(restarted)} pod(s) restarted: {', '.join(restarted)}", + suggestion="inspect the previous container logs for the cause", + ) + ) + + +def _is_not_found(exc: Exception) -> bool: + """True for a Kubernetes 404 (missing object), without importing the SDK.""" + status = getattr(exc, "status", None) + if status == 404: + return True + reason = getattr(exc, "reason", None) + if reason and "not found" in str(reason).lower(): + return True + return "not found" in str(exc).lower() + + +def _items(listing: Any) -> list: + if isinstance(listing, dict): + return listing.get("items") or [] + items = getattr(listing, "items", None) + return list(items) if items is not None else [] + + +def _opt_str(value: Any) -> Optional[str]: + return None if value in (None, "") else str(value) + + +__all__ = [ + "RunStatus", + "RunSummary", + "GPUDevice", + "PodInfo", + "Diagnostic", + "read_run_status", + "list_runs", + "classify", + "TERMINAL_STATES", + "ClusterClient", +] diff --git a/sdk/python/python/tau/widgets/watcher.py b/sdk/python/python/tau/widgets/watcher.py new file mode 100644 index 00000000..aaeb03e0 --- /dev/null +++ b/sdk/python/python/tau/widgets/watcher.py @@ -0,0 +1,133 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +"""Single-flight status watcher for the notebook panel. + +The panel polls a run's status on a fixed delay. Two properties matter and are +enforced here rather than in the panel: + +* Single-flight: the next tick is scheduled only after the previous read + finishes, so a slow API call cannot pile up overlapping requests. +* Generation-tagged: every start/stop bumps a generation counter. A late reply + from a stopped or rebound watcher is discarded instead of repainting the + panel. + +The scheduler and clock are injectable, so the whole loop is testable offline +with a fake scheduler and a fake status reader (no threads, no network). +""" + +from __future__ import annotations + +import threading +from typing import Any, Callable, Optional + +from tau.widgets.status import RunStatus + +#: Default poll interval, matching the design (30s default, 5s minimum). +DEFAULT_INTERVAL = 30.0 +MIN_INTERVAL = 5.0 + + +class Scheduler: + """Minimal scheduler seam: schedule a one-shot callback, cancel it.""" + + def schedule(self, delay: float, callback: Callable[[], Any]) -> Any: # pragma: no cover - seam + raise NotImplementedError + + def cancel(self, handle: Any) -> None: # pragma: no cover - seam + raise NotImplementedError + + +class ThreadScheduler(Scheduler): + """Default scheduler backed by a daemon thread timer.""" + + def schedule(self, delay: float, callback: Callable[[], Any]) -> Any: + timer = threading.Timer(delay, callback) + timer.daemon = True + timer.start() + return timer + + def cancel(self, handle: Any) -> None: + try: + handle.cancel() + except Exception: # pragma: no cover - a fired timer cannot be cancelled + pass + + +class StatusWatcher: + """Poll a run's status on a fixed delay until it reaches a terminal state. + + read_status is a zero-argument callable returning a RunStatus (or None). + on_update is called with each fresh status on the calling thread; the panel + uses it to repaint. Both are injected so tests drive the loop directly. + """ + + def __init__( + self, + read_status: Callable[[], Optional[RunStatus]], + *, + on_update: Optional[Callable[[Optional[RunStatus]], None]] = None, + interval: float = DEFAULT_INTERVAL, + min_interval: float = MIN_INTERVAL, + scheduler: Optional[Scheduler] = None, + ) -> None: + self._read = read_status + self._on_update = on_update + self.interval = max(float(interval), float(min_interval)) + self._scheduler = scheduler or ThreadScheduler() + self._generation = 0 + self._handle: Any = None + self._active = False + + @property + def active(self) -> bool: + return self._active + + @property + def generation(self) -> int: + return self._generation + + def start(self) -> int: + """Begin watching. Returns the new generation for correlation.""" + self._generation += 1 + self._active = True + self._schedule(self._generation) + return self._generation + + def stop(self) -> None: + """Stop watching. Invalidates any in-flight reply via the generation.""" + self._generation += 1 + self._active = False + if self._handle is not None: + self._scheduler.cancel(self._handle) + self._handle = None + + def tick(self) -> Optional[RunStatus]: + """Run one refresh synchronously (used by tests and refresh-now).""" + return self._tick(self._generation) + + def _schedule(self, generation: int) -> None: + if not self._active or generation != self._generation: + return + self._handle = self._scheduler.schedule(self.interval, lambda: self._tick(generation)) + + def _tick(self, generation: int) -> Optional[RunStatus]: + if not self._active or generation != self._generation: + return None + try: + status = self._read() + except Exception: # per-reader failure isolation: keep the loop alive + status = None + # A stop/rebind during the read invalidates this reply. + if generation != self._generation: + return None + if self._on_update is not None: + self._on_update(status) + if status is not None and status.terminal: + self._active = False + return status + self._schedule(generation) + return status + + +__all__ = ["StatusWatcher", "Scheduler", "ThreadScheduler", "DEFAULT_INTERVAL", "MIN_INTERVAL"] diff --git a/sdk/python/python/tests/test_jupyter_contract.py b/sdk/python/python/tests/test_jupyter_contract.py new file mode 100644 index 00000000..ca4985d4 --- /dev/null +++ b/sdk/python/python/tests/test_jupyter_contract.py @@ -0,0 +1,112 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. +"""Offline request/confirmation regressions through the real handlers.""" +import asyncio +import json +from types import SimpleNamespace + +import pytest +from tornado.web import HTTPError + +from tau.jupyter import server +from tests.test_jupyter_submit import FakeClient, FakeCustom, VALID_NB, cluster_doc + + +class Handler(server._SubmitMixin): + current_user = "researcher" + + def __init__(self, body, client): + self.request = SimpleNamespace(body=json.dumps(body).encode()) + self._client = client + self.result = None + + def client(self): + return self._client + + def finish(self, result): + self.result = result + + +def body(): + return {"notebook": VALID_NB.decode(), "namespace": "ray", "name": "reviewed"} + + +@pytest.mark.parametrize("key,value", [("namespace", []), ("name", 42), ("profile", {}), + ("queue", False), ("pip", "requests"), ("pip", [7]), ("env", []), + ("env", {"TOKEN": 2}), ("env_secret", {"TOKEN": []})]) +def test_preview_rejects_malformed_fields(key, value): + handler = Handler({**body(), key: value}, FakeClient(FakeCustom(cluster=cluster_doc()))) + with pytest.raises(HTTPError) as error: + asyncio.run(server.PreviewHandler.post(handler)) + assert error.value.status_code == 400 + + +def test_review_digest_required_and_drift_refused_before_create(monkeypatch): + monkeypatch.setattr(server, "SUBMISSION_ENABLED", True) + api = FakeCustom(cluster=cluster_doc()) + client = FakeClient(api) + review = Handler(body(), client) + asyncio.run(server.PreviewHandler.post(review)) + assert not api.created + for digest in (None, "0" * 64): + attempt = Handler({**body(), "confirm": True, "planDigest": digest}, client) + with pytest.raises(HTTPError) as error: + asyncio.run(server.SubmitHandler.post(attempt)) + assert error.value.status_code in (400, 409) + assert not api.created + digest = review.result["plan"]["planDigest"] + monkeypatch.setenv("TAUGRID_RUNTIME_IMAGE", "example:drifted") + with pytest.raises(HTTPError) as error: + asyncio.run(server.SubmitHandler.post(Handler({**body(), "confirm": True, "planDigest": digest}, client))) + assert error.value.status_code == 409 + assert not api.created + monkeypatch.delenv("TAUGRID_RUNTIME_IMAGE") + attempt = Handler({**body(), "confirm": True, "planDigest": digest}, client) + asyncio.run(server.SubmitHandler.post(attempt)) + assert attempt.result["submitted"] is True + assert len(api.created) == 1 + + +def test_disabled_submit_never_creates(monkeypatch): + monkeypatch.setattr(server, "SUBMISSION_ENABLED", False) + api = FakeCustom(cluster=cluster_doc()) + with pytest.raises(HTTPError) as error: + asyncio.run(server.SubmitHandler.post(Handler({**body(), "confirm": True}, FakeClient(api)))) + assert error.value.status_code == 409 + assert not api.created + + +def test_preview_and_create_run_off_event_loop(monkeypatch): + import threading + monkeypatch.setattr(server, "SUBMISSION_ENABLED", True) + api = FakeCustom(cluster=cluster_doc()) + client = FakeClient(api) + handler = Handler(body(), client) + threads = [] + def get_client(): + threads.append(threading.get_ident()) + return client + handler.client = get_client + asyncio.run(server.PreviewHandler.post(handler)) + handler.request.body = json.dumps({**body(), "confirm": True, "planDigest": handler.result["plan"]["planDigest"]}).encode() + asyncio.run(server.SubmitHandler.post(handler)) + assert len(threads) == 3 + assert all(identity != threading.get_ident() for identity in threads) + assert len(api.created) == 1 + + +@pytest.mark.parametrize("fail", [False, True]) +def test_request_owned_client_is_closed_even_after_failure(fail): + closed = [] + client = SimpleNamespace(close=lambda: closed.append(True)) + handler = SimpleNamespace(client=lambda: client) + def operation(client): + if fail: + raise ValueError("refused") + return 42 + if fail: + with pytest.raises(ValueError): + server._call_with_client(handler, operation) + else: + assert server._call_with_client(handler, operation) == 42 + assert closed == [True] diff --git a/sdk/python/python/tests/test_jupyter_metrics.py b/sdk/python/python/tests/test_jupyter_metrics.py new file mode 100644 index 00000000..803e67d1 --- /dev/null +++ b/sdk/python/python/tests/test_jupyter_metrics.py @@ -0,0 +1,254 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +import io +import threading +import time +from concurrent.futures import ThreadPoolExecutor + +import pytest + +from tau.jupyter.metrics import Collector, bounded_body, parse_loss +from tau.jupyter.runs import NativeStatus + + +class Body(io.BytesIO): + def set_read_timeout(self, timeout): + assert 0 < timeout <= 5 + + +def test_explicit_finite_samples_and_limits(): + data = b'loss=9\nstep=2 loss=3\nstep=1 loss=4\nstep=2 loss=2\nstep=3 loss=1e999\nstep=9007199254740992 loss=1\nstep=-1 loss=1\n' + samples, reasons = parse_loss(data) + assert samples == [{'step': 1, 'value': 4.0}, {'step': 2, 'value': 2.0}] + assert 'tail-window' in reasons + samples, reasons = parse_loss(b''.join(f'step={step} loss=1\n'.encode() for step in range(600))) + assert len(samples) == 512 + assert samples[0]['step'] == 88 + assert 'point-limit' in reasons + assert 'record-limit' in parse_loss(b'x' * 4097 + b'\n')[1] + assert parse_loss(b'step=1 loss=2')[0] == [] + + +def test_stream_bound_and_close(): + body = Body(b'x' * 100000) + data = bounded_body(body, time.monotonic() + 10) + assert len(data) == 65537 + assert body.closed + + +def test_identity_documents_use_bounded_nonpreloaded_reads(): + from tau._kube_io import read_document, DOCUMENT_BYTES + + calls = [] + body = Body(b'{"metadata":{"uid":"run"}}') + + def reader(**kwargs): + calls.append(kwargs) + return body + + assert read_document(reader, time.monotonic() + 10)["metadata"]["uid"] == "run" + assert len(calls) == 1 + assert calls[0]["_preload_content"] is False + assert 0 < calls[0]["_request_timeout"][0] <= 2 + assert 0 < calls[0]["_request_timeout"][1] <= 5 + assert body.closed + oversized = Body(b" " * (DOCUMENT_BYTES + 1)) + with pytest.raises(ValueError, match="Identity document exceeded"): + read_document(lambda **kwargs: oversized, time.monotonic() + 10) + assert oversized.closed + + +def test_connect_and_read_timeouts_share_remaining_budget(monkeypatch): + from tau.jupyter import metrics + + monkeypatch.setattr(metrics.time, "monotonic", lambda: 100) + connect, read = metrics.timeout(101) + assert connect + read <= 1 + with pytest.raises(TimeoutError): + metrics.timeout(100) + + +def test_cache_singleflight_and_error_staleness(): + clock = [0.0] + collector = Collector(now=lambda: clock[0]) + info = NativeStatus(name='train', namespace='ray', uid='run') + source = {'type': 'stdout', 'runUid': 'run', 'podUid': 'pod', 'pod': 'driver', 'container': 'main', 'ownerKind': 'Job', 'ownerUid': 'job'} + info.metric_sources = [source] + entered, release = threading.Event(), threading.Event() + calls = [] + + def read(client, status, selected, deadline): + calls.append(selected) + entered.set() + assert release.wait(2) + return b'step=1 loss=2\n' + + collector.read = read + with ThreadPoolExecutor() as pool: + task = pool.submit(collector.collect, None, info) + assert entered.wait(2) + assert collector.collect(None, info)['stale'] + release.set() + first = task.result() + assert collector.collect(None, info) == first + assert len(calls) == 1 + clock[0] = 11 + + def fail(*args): + raise OSError('gone') + + collector.read = fail + failed = collector.collect(None, info) + assert failed['samples'] == first['samples'] + assert failed['checkedAt'] == first['checkedAt'] + assert failed['stale'] + info.uid = 'replacement' + info.metric_sources = [] + assert collector.collect(None, info)['samples'] == [] + + +def metric_status(uid='run', pod_uid='pod'): + info = NativeStatus(name='train', namespace='ray', uid=uid) + info.metric_sources = [{'type': 'stdout', 'runUid': uid, 'podUid': pod_uid, + 'pod': 'driver', 'container': 'main', 'ownerKind': 'Job', 'ownerUid': 'job'}] + return info + + +def test_terminal_bypasses_ttl_once_and_source_changes_do_not_replace_evidence(): + clock = [0.0] + collector = Collector(now=lambda: clock[0]) + calls = [] + + def read(*args): + calls.append(1) + return f'step={len(calls)} loss=2\n'.encode() + + collector.read = read + info = metric_status() + collector.collect(None, info) + final = collector.collect(None, info, force=True) + assert len(calls) == 2 + assert collector.collect(None, info, force=True) == final + assert len(calls) == 2 + clock[0] = 11 + collector.collect(None, info, force=True) + assert len(calls) == 3 + changed = collector.collect(None, metric_status(pod_uid='replacement')) + assert changed['stale'] and changed['state'] == 'unavailable' + assert changed['source']['podUid'] == 'pod' + assert changed['samples'] == [{'step': 3, 'value': 2.0}] + assert 'changed' in changed['message'] + assert len(calls) == 3 + + +def test_cache_lru_idle_expiry_and_cached_errors(): + clock = [0.0] + collector = Collector(now=lambda: clock[0]) + collector.read = lambda *args: b'step=1 loss=1\n' + for index in range(128): + collector.collect(None, metric_status(uid=str(index))) + collector.collect(None, metric_status(uid='0')) + collector.collect(None, metric_status(uid='new')) + assert len(collector.entries) == 128 + assert any(entry['target'][-1] == '0' for entry in collector.entries.values()) + assert not any(entry['target'][-1] == '1' for entry in collector.entries.values()) + clock[0] = 600 + collector.collect(None, metric_status(uid='after-idle')) + assert len(collector.entries) == 1 + calls = [] + + def fail(*args): + calls.append(1) + raise OSError('denied') + + collector.read = fail + failed = collector.collect(None, metric_status(uid='error')) + assert failed['state'] == 'error' + assert collector.collect(None, metric_status(uid='error')) == failed + assert len(calls) == 1 + + +def test_capacity_is_bounded_without_waiting(): + collector = Collector() + release = threading.Event() + entered = threading.Barrier(5) + + def read(*args): + entered.wait(timeout=5) + assert release.wait(5) + return b'step=1 loss=1\n' + + collector.read = read + with ThreadPoolExecutor(max_workers=4) as pool: + tasks = [pool.submit(collector.collect, None, metric_status(uid=str(index))) for index in range(4)] + try: + entered.wait(timeout=5) + saturated = collector.collect(None, metric_status(uid='fifth')) + assert saturated['state'] == 'unavailable' and saturated['stale'] + assert 'capacity' in saturated['message'] + assert len(collector.entries) == 4 + finally: + release.set() + assert all(task.result()['state'] == 'ready' for task in tasks) + + +def test_read_deadline_failure_closes_body_and_clipped_records_are_not_samples(): + body = Body(b'step=1 loss=2\n') + with pytest.raises(TimeoutError): + bounded_body(body, time.monotonic() - 1) + assert body.closed + data = b'step=0 loss=9\nstep=1 loss=2\n' + b'x' * 65536 + samples, reasons = parse_loss(data) + assert samples == [{'step': 1, 'value': 2.0}] + assert 'byte-limit' in reasons and 'tail-window' in reasons + + +def test_portal_requires_explicit_uid_mapping_and_preserves_source(monkeypatch): + from tau.jupyter.metrics import portal_source + + info = metric_status() + monkeypatch.setenv('TAUGRID_PORTAL_URL', 'http://portal.example') + monkeypatch.delenv('TAUGRID_METRICS_PORTAL_ENABLED', raising=False) + assert portal_source(info) is None + monkeypatch.setenv('TAUGRID_METRICS_PORTAL_ENABLED', '1') + monkeypatch.setenv('TAUGRID_METRICS_PORTAL_URL', 'http://portal.example') + monkeypatch.setenv('TAUGRID_METRICS_PORTAL_RUNS', '{"ray/RayJob/train/run":{"target":"experiment","run_id":"exact-run"}}') + info.kind = 'RayJob' + selected = portal_source(info) + assert selected['runId'] == 'exact-run' + info.uid = 'replacement' + assert portal_source(info) is None + + +def test_prior_portal_cannot_override_failed_discovery(monkeypatch): + import tau.jupyter.metrics as metrics + + info = metric_status() + info.metric_sources = [] + source = {"type": "portal", "runUid": info.uid, "target": "target", "runId": "run", "url": "http://portal"} + monkeypatch.setattr(metrics, "portal_source", lambda info: source) + calls = [] + monkeypatch.setattr(metrics, "read_portal", lambda *args: (calls.append(1) or ([{"step": 1, "value": 2}], [], {}))) + clock = [0] + collector = Collector(now=lambda: clock[0]) + assert collector.collect(None, info)["state"] == "ready" + clock[0] = 11 + info.metric_discovery_error = True + result = collector.collect(None, info) + assert result["state"] == "unavailable" and result["stale"] + assert len(calls) == 1 + + +def test_metric_cache_is_partitioned_by_cluster(): + from types import SimpleNamespace + + def client(host): + return SimpleNamespace(custom=SimpleNamespace(api_client=SimpleNamespace(configuration=SimpleNamespace(host=host)))) + + collector = Collector() + calls = [] + collector.read = lambda *args: (calls.append(1) or b"step=1 loss=2\n") + collector.collect(client("https://cluster-a"), metric_status()) + collector.collect(client("https://cluster-b"), metric_status()) + assert len(calls) == 2 diff --git a/sdk/python/python/tests/test_jupyter_runs.py b/sdk/python/python/tests/test_jupyter_runs.py new file mode 100644 index 00000000..67aa4bd7 --- /dev/null +++ b/sdk/python/python/tests/test_jupyter_runs.py @@ -0,0 +1,547 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +import asyncio +import io +import json +import threading +from types import SimpleNamespace + +import pytest + +from tau.jupyter import runs +from tau.widgets.kube import ClusterClient + + +def resource(name="train", kind="Job", uid="run-uid", **status): + return { + "kind": kind, + "metadata": { + "name": name, "uid": uid, "namespace": "ray", + "labels": {"tau.azure.com/workload": "train", "kueue.x-k8s.io/queue-name": "gpu"}, + "creationTimestamp": "2026-09-20T00:00:00Z", + }, + "spec": {}, "status": status, + } + + +def owner(kind, uid): + return {"kind": kind, "uid": uid, "name": "train", "controller": True} + + +def pod(uid="run-uid", kind="Job", **status): + return { + "metadata": {"name": "worker", "uid": "pod-uid", "ownerReferences": [owner(kind, uid)]}, + "spec": {"containers": [{"name": "main"}], "initContainers": [{"name": "init"}]}, + "status": {"phase": "Pending", **status}, + } + + +class LogBody(io.BytesIO): + def set_read_timeout(self, timeout): + assert 0 < timeout <= 5 + + +class FakeApis: + def __init__(self): + self.job = resource() + self.rayjob = resource(kind="RayJob", jobStatus="PENDING") + self.cluster = resource(kind="RayCluster", uid="cluster-uid") + self.cluster["metadata"]["ownerReferences"] = [owner("RayJob", "run-uid")] + self.jobs = [self.job] + self.rayjobs = [self.rayjob] + self.workloads = [] + self.pods = [pod()] + self.text = "hello" + self.namespaces = [ + {"metadata": {"name": "default"}}, + {"metadata": {"name": "team-a", "labels": {"tau.azure.com/workspace": "team-a"}}}, + {"metadata": {"name": "beta", "labels": {"tau.azure.com/workspace": "beta"}}}, + ] + self.calls = [] + self.denied = set() + + def check(self, key): + if key in self.denied: + raise RuntimeError("forbidden") + + def list_namespaced_job(self, **kwargs): + self.check("jobs") + return {"items": self.jobs, "metadata": {}} + + def read_namespaced_job(self, **kwargs): + return self.job + + def get_namespaced_custom_object(self, **kwargs): + self.check(kwargs["plural"]) + return self.cluster if kwargs["plural"] == "rayclusters" else self.rayjob + + def list_namespaced_custom_object(self, **kwargs): + self.check(kwargs["plural"]) + return {"items": self.rayjobs if kwargs["plural"] == "rayjobs" else self.workloads} + + def list_namespaced_pod(self, **kwargs): + self.check("pods") + return {"items": self.pods} + + def read_namespaced_pod(self, **kwargs): + return self.pods[0] + + def read_namespaced_pod_log(self, **kwargs): + self.calls.append(kwargs) + return LogBody(self.text.encode("utf-8")) + + def list_namespace(self, **kwargs): + self.check("namespaces") + return {"items": self.namespaces, "metadata": {}} + + def client(self): + return ClusterClient(core=self, custom=self, batch=self) + + +def phase(status, key): + return next(item for item in status.phases if item["key"] == key) + + +def test_lists_both_tau_kinds_filters_queue_and_submitters(): + api = FakeApis() + unrelated = resource("unrelated") + unrelated["metadata"]["labels"] = {} + submitter = resource("submitter") + submitter["metadata"]["ownerReferences"] = [owner("RayJob", "parent")] + api.jobs.extend([unrelated, submitter]) + api.rayjob["metadata"]["creationTimestamp"] = "2026-09-21T00:00:00Z" + result = runs.list_runs(api.client(), namespace="ray", queue="gpu") + assert [(row["name"], row["kind"]) for row in result["runs"]] == [("train", "RayJob"), ("train", "Job")] + assert runs.list_runs(api.client(), namespace="ray", queue="other")["runs"] == [] + api.denied.add("jobs") + result = runs.list_runs(api.client(), namespace="ray") + assert len(result["runs"]) == 1 + assert result["warnings"] + + +def test_admission_matches_owner_uid_not_name_and_reports_denial(): + api = FakeApis() + workload = resource("old", conditions=[{"type": "Admitted", "status": "True"}]) + workload["metadata"]["ownerReferences"] = [owner("Job", "old-uid")] + api.workloads = [workload] + assert phase(runs.read_run(api.client(), namespace="ray", name="train", kind="Job"), "admission")["state"] == "unknown" + workload["metadata"]["ownerReferences"] = [owner("Job", "run-uid")] + assert runs.read_run(api.client(), namespace="ray", name="train", kind="Job").admitted is True + api.denied.add("workloads") + status = runs.read_run(api.client(), namespace="ray", name="train", kind="Job") + assert phase(status, "admission")["state"] == "unknown" + assert status.diagnostics + + +def test_retry_pod_is_not_terminal_job_and_waiting_reason_is_visible(): + api = FakeApis() + api.job["status"] = {"failed": 1, "active": 1} + api.pods = [pod(containerStatuses=[{"name": "main", "state": {"waiting": {"reason": "ImagePullBackOff"}}}])] + status = runs.read_run(api.client(), namespace="ray", name="train", kind="Job") + assert status.state == "running" and not status.terminal + assert "ImagePullBackOff" in phase(status, "pods")["detail"] + api.job["status"]["conditions"] = [{"type": "Complete", "status": "True"}] + api.pods = [] + status = runs.read_run(api.client(), namespace="ray", name="train", kind="Job") + assert status.terminal + assert phase(status, "pods")["state"] == "skipped" + + +@pytest.mark.parametrize("over_limit", [False, True]) +def test_incomplete_job_pod_discovery_cannot_select_loss_source(monkeypatch, over_limit): + api = FakeApis() + selected = pod() + selected["metadata"]["uid"] = "pod-uid" + listing = {"items": [selected] * (runs.LIMIT + 1 if over_limit else 1), + "metadata": {} if over_limit else {"continue": "more-pods"}} + monkeypatch.setattr(api, "list_namespaced_pod", lambda **kwargs: listing) + info = runs.read_run(api.client(), namespace="ray", name="train", kind="Job") + assert info.metric_discovery_error + + +@pytest.mark.parametrize("retries,expected", [(None, 7), (0, 0)]) +def test_kubernetes_retry_override_is_explicit(monkeypatch, retries, expected): + from kubernetes import client, config + from tau.widgets.kube import load_client + + configuration = SimpleNamespace(retries=7) + monkeypatch.setattr(config, "load_incluster_config", lambda: None) + monkeypatch.setattr(client.Configuration, "get_default_copy", lambda: configuration) + monkeypatch.setattr(client, "ApiClient", lambda settings: settings) + for api_name in ("CustomObjectsApi", "CoreV1Api", "BatchV1Api"): + monkeypatch.setattr(client, api_name, lambda transport: transport) + connection = load_client(retries=retries) + assert configuration.retries == expected + assert connection.core is connection.custom is connection.batch is configuration + + +def test_cluster_creation_does_not_claim_ready_and_rejects_stale_owners(): + api = FakeApis() + api.rayjob["status"]["rayClusterName"] = "cluster" + api.pods = [pod("cluster-uid", "RayCluster"), pod("old-uid", "RayCluster")] + status = runs.read_run(api.client(), namespace="ray", name="train") + assert phase(status, "cluster")["state"] == "done" + assert status.total_pods == 1 and status.ready_pods == 0 + api.cluster["metadata"]["ownerReferences"] = [owner("RayJob", "old-uid")] + status = runs.read_run(api.client(), namespace="ray", name="train") + assert status.total_pods == 0 + assert phase(status, "cluster")["state"] == "unknown" + + +def test_manager_execution_is_remote_not_locally_running(): + api = FakeApis() + api.job["spec"]["managedBy"] = "kueue.x-k8s.io/multikueue" + status = runs.read_run(api.client(), namespace="ray", name="train", kind="Job") + assert "remote" in phase(status, "execution")["detail"].lower() + assert phase(status, "execution")["state"] == "unknown" + assert status.pods == [] + + +def test_logs_bound_utf8_and_verify_membership_and_options(): + api = FakeApis() + api.text = "€" * 30000 + result = runs.read_logs(api.client(), namespace="ray", name="train", kind="Job", pod="worker", container="main", tail=1000, previous=True, timestamps=True) + assert len(result["text"].encode("utf-8")) <= 65536 + assert "�" not in result["text"] + assert result["possiblyTruncated"] + assert api.calls[0]["follow"] is False + assert api.calls[0]["limit_bytes"] == 65537 + assert api.calls[0]["_preload_content"] is False + assert api.calls[0]["tail_lines"] == 1000 + assert api.calls[0]["previous"] and api.calls[0]["timestamps"] + assert api.calls[0]["_request_timeout"] + for kwargs in ({"pod": "stranger", "container": "main"}, {"pod": "worker", "container": "other"}, {"pod": "worker", "container": "main", "tail": -1}): + with pytest.raises(runs.ReadError): + runs.read_logs(api.client(), namespace="ray", name="train", kind="Job", **kwargs) + assert len(api.calls) == 1 + api.pods[0]["metadata"]["ownerReferences"][0]["uid"] = "old-uid" + with pytest.raises(runs.ReadError): + runs.read_logs(api.client(), namespace="ray", name="train", kind="Job", pod="worker", container="main") + + +def test_portal_configuration_rejects_unsafe_links(monkeypatch): + for url in ("javascript:alert(1)", "//portal.example", "https://user:pass@portal.example"): + monkeypatch.setenv("TAUGRID_PORTAL_URL", url) + assert runs.portal_url() is None + monkeypatch.setenv("TAUGRID_PORTAL_URL", "https://portal.example/base") + assert runs.portal_url() == "https://portal.example/base" + + +def test_real_sdk_model_field_shapes_and_existing_serializer(): + from tau.jupyter.server import _status_dict + + api = FakeApis() + api.job = SimpleNamespace(metadata=SimpleNamespace(name="train", uid="run-uid", labels={}, annotations={}), spec=SimpleNamespace(), status=SimpleNamespace(active=1, conditions=[])) + status = runs.read_run(api.client(), namespace="ray", name="train", kind="Job") + result = _status_dict(status) + assert result["existing"] and result["kind"] == "Job" + assert result["phases"] and result["pods"][0]["containers"] == ["main", "init"] + + +@pytest.mark.parametrize(("status", "expected"), [ + ({"jobStatus": "RUNNING"}, "running"), + ({"jobDeploymentStatus": "Running"}, "running"), + ({"jobDeploymentStatus": "Complete"}, "complete"), + ({"jobStatus": "SUCCEEDED", "jobDeploymentStatus": "Failed"}, "failed"), + ({"jobStatus": "STOPPED"}, "failed"), + ({"jobStatus": "PENDING", "reason": "SubmissionFailed"}, "failed"), + ({"jobStatus": "PENDING"}, "queued"), +]) +def test_ray_execution_uses_authoritative_markers(status, expected): + api = FakeApis() + api.rayjob["status"] = status + result = runs.read_run(api.client(), namespace="ray", name="train") + assert result.state == expected + assert result.terminal == (expected in ("failed", "complete")) + + +def test_batch_failure_takes_precedence_over_completion(): + api = FakeApis() + api.job["status"]["conditions"] = [ + {"type": "Complete", "status": "True"}, + {"type": "Failed", "status": "True"}, + ] + assert runs.read_run(api.client(), namespace="ray", name="train", kind="Job").state == "failed" + + +def test_missing_resources_terminal_teardown_and_partial_reads(monkeypatch): + api = FakeApis() + missing = RuntimeError("not found") + missing.status = 404 + + def not_found(**kwargs): + raise missing + + monkeypatch.setattr(api, "read_namespaced_job", not_found) + assert not runs.read_run(api.client(), namespace="ray", name="train", kind="Job").existing + api.rayjob["status"] = {"jobStatus": "SUCCEEDED", "rayClusterName": "cluster"} + original = api.get_namespaced_custom_object + + def custom_get(**kwargs): + return not_found() if kwargs["plural"] == "rayclusters" else original(**kwargs) + + monkeypatch.setattr(api, "get_namespaced_custom_object", custom_get) + result = runs.read_run(api.client(), namespace="ray", name="train") + assert phase(result, "cluster")["state"] == "skipped" + assert result.state == "complete" + api.denied = {"jobs", "rayjobs"} + listing = runs.list_runs(api.client(), namespace="ray") + assert not listing["runs"] and len(listing["warnings"]) == 2 + + +def test_list_continuation_and_result_metadata(monkeypatch): + api = FakeApis() + monkeypatch.setattr(api, "list_namespaced_job", lambda **kwargs: { + "items": api.jobs, "metadata": {"continue": "next-page"}, + }) + assert runs.list_runs(api.client(), namespace="ray")["truncated"] + api.job["metadata"]["annotations"] = {"tau.azure.com/result-path": "folder/results", "tau.azure.com/result-pvc": "outputs"} + api.job["metadata"]["labels"] = {} + api.denied = {"pods"} + result = runs.read_run(api.client(), namespace="ray", name="train", kind="Job") + assert result.output["path"] == "folder/results" and result.output["pvc"] == "outputs" + assert phase(result, "admission")["state"] == "skipped" + assert phase(result, "pods")["state"] == "unknown" + with pytest.raises(runs.ReadError): + runs.read_logs(api.client(), namespace="ray", name="train", kind="Job", pod="worker", container="main") + assert not api.calls + + +def test_submitter_uid_chain_separates_workers_and_hidden_jobs(): + api = FakeApis() + submitter = resource(name="driver", uid="job-uid") + submitter["metadata"]["ownerReferences"] = [owner("RayJob", "run-uid")] + api.jobs = [submitter] + api.pods = [pod(uid="job-uid", phase="Succeeded")] + api.pods[0]["metadata"]["uid"] = "pod-uid" + info = runs.read_run(api.client(), namespace="ray", name="train", kind="RayJob") + assert info.total_pods == 0 and info.ready_pods == 0 + assert info.pod_roles == {"worker": "submitter"} + assert info.metric_sources[0]["podUid"] == "pod-uid" + assert info.metric_sources[0]["ownerUid"] == "job-uid" + assert all(row["kind"] != "Job" for row in runs.list_runs(api.client(), namespace="ray")["runs"]) + api.jobs[0]["metadata"]["ownerReferences"][0]["uid"] = "old-run" + assert not runs.read_run(api.client(), namespace="ray", name="train", kind="RayJob").metric_sources + + +def test_ambiguous_or_denied_submitters_fail_closed_but_httpmode_still_reads(): + api = FakeApis() + api.rayjob["spec"]["submissionMode"] = "HTTPMode" + assert runs.read_run(api.client(), namespace="ray", name="train", kind="RayJob").state == "queued" + submitter = resource(name="driver", uid="job-uid") + submitter["metadata"]["ownerReferences"] = [owner("RayJob", "run-uid")] + api.jobs = [submitter, submitter] + info = runs.read_run(api.client(), namespace="ray", name="train", kind="RayJob") + assert info.metric_discovery_error and not info.metric_sources + api.denied.add("jobs") + assert runs.read_run(api.client(), namespace="ray", name="train", kind="RayJob").metric_discovery_error + + +def test_metrics_rechecks_entire_uid_chain_before_reading(monkeypatch): + from tau.jupyter.metrics import read_stdout + import time + + api = FakeApis() + api.job = resource(name="driver", uid="job-uid") + api.job["metadata"]["ownerReferences"] = [owner("RayJob", "run-uid")] + selected = pod(uid="job-uid") + selected["metadata"]["uid"] = "pod-uid" + selected["metadata"]["ownerReferences"][0]["name"] = "driver" + monkeypatch.setattr(api, "read_namespaced_pod", lambda **kwargs: selected, raising=False) + info = runs.NativeStatus(name="train", namespace="ray", uid="run-uid") + source = {"type": "stdout", "pod": "worker", "podUid": "pod-uid", "container": "main", "ownerKind": "Job", "ownerUid": "job-uid"} + assert read_stdout(api.client(), info, source, time.monotonic() + 10) == b"hello" + api.job["metadata"]["ownerReferences"][0]["uid"] = "replacement" + with pytest.raises(ValueError, match="controller identity"): + read_stdout(api.client(), info, source, time.monotonic() + 10) + assert len(api.calls) == 1 + selected["metadata"]["uid"] = "replacement" + with pytest.raises(ValueError, match="Pod"): + read_stdout(api.client(), info, source, time.monotonic() + 10) + api.rayjob["metadata"]["uid"] = "replacement" + with pytest.raises(ValueError, match="Workload"): + read_stdout(api.client(), info, source, time.monotonic() + 10) + + +def test_status_metrics_are_opt_in_and_terminal_attempt_is_requested(monkeypatch): + from tau.jupyter import server, metrics + from tornado.web import HTTPError + + api = FakeApis() + api.job["status"] = {"conditions": [{"type": "Complete", "status": "True"}]} + calls = [] + + def collect(client, status, force=False): + calls.append(force) + return metrics.empty("No evidence") + + monkeypatch.setattr(metrics.collector, "collect", collect) + handler = FakeHandler(api, namespace="ray", name="train", kind="Job") + asyncio.run(server.StatusHandler.get(handler)) + assert "metrics" not in handler.response and calls == [] + handler.arguments["includeMetrics"] = "true" + asyncio.run(server.StatusHandler.get(handler)) + assert handler.response["terminal"] and handler.response["metrics"]["state"] == "unavailable" + assert calls == [True] + handler.arguments["includeMetrics"] = "yes" + with pytest.raises(HTTPError) as caught: + asyncio.run(server.StatusHandler.get(handler)) + assert caught.value.status_code == 400 + + +class FakeHandler: + def __init__(self, api, **arguments): + self.api = api + self.arguments = arguments + self.current_user = object() + self.request = SimpleNamespace(method="POST", body=b"{}") + self.headers = {} + self.response = None + + def client(self): + return self.api.client() + + def get_argument(self, name, default): + return self.arguments.get(name, default) + + def finish(self, value): + self.response = value + + def set_header(self, name, value): + self.headers[name] = value + + def target(self): + from tau.jupyter.server import _ClientMixin + return _ClientMixin.target(self) + + async def read(self, reader, **kwargs): + from tau.jupyter.server import _ClientMixin + return await _ClientMixin.read(self, reader, **kwargs) + + def json_body(self): + return json.loads(self.request.body) + + +def test_offline_handlers_roundtrip_and_threaded_reads(monkeypatch): + from tau.jupyter import server + api = FakeApis() + handler = FakeHandler(api, namespace="ray", name="train", kind="Job", pod="worker", container="main") + main_thread = threading.get_ident() + threads = [] + original = api.read_namespaced_job + + def read_job(**kwargs): + threads.append(threading.get_ident()) + return original(**kwargs) + + monkeypatch.setattr(api, "read_namespaced_job", read_job) + asyncio.run(server.StatusHandler.get(handler)) + assert handler.response["kind"] == "Job" + assert threads and all(thread != main_thread for thread in threads) + asyncio.run(server.RunsHandler.get(handler)) + assert {row["kind"] for row in handler.response["runs"]} == {"Job", "RayJob"} + asyncio.run(server.LogsHandler.get(handler)) + assert handler.response["text"] == "hello" + assert handler.headers["Cache-Control"] == "no-store" + assert api.calls[0]["tail_lines"] == 200 + monkeypatch.setenv("TAUGRID_PORTAL_URL", "https://portal.example/") + server.CapabilitiesHandler.get(handler) + assert handler.response["portalUrl"] == "https://portal.example/" + handler.arguments.pop("kind") + asyncio.run(server.StatusHandler.get(handler)) + assert handler.response["kind"] == "RayJob" + + +@pytest.mark.parametrize("arguments", [{"tail": "bad"}, {"tail": "1001"}, {"previous": "yes"}, {"timestamps": "1"}, {"kind": "Pod"}, {"namespace": "../other"}, {"pod": "unrelated"}]) +def test_log_handler_rejects_bad_inputs(arguments): + from tornado.web import HTTPError + from tau.jupyter import server + api = FakeApis() + options = {"namespace": "ray", "name": "train", "kind": "Job", "pod": "worker", "container": "main", **arguments} + with pytest.raises(HTTPError) as failure: + asyncio.run(server.LogsHandler.get(FakeHandler(api, **options))) + assert failure.value.status_code in (400, 403) + assert not api.calls + + +def test_handlers_require_authentication_and_preserve_submit_gate(monkeypatch): + from tornado.web import HTTPError + from tau.jupyter import server + handler = FakeHandler(FakeApis()) + handler.current_user = None + handlers = server._handlers("/user/example/taugrid/api") + assert {path.rsplit("/", 1)[-1] for path, _ in handlers} == {"capabilities", "status", "runs", "namespaces", "files", "logs", "preview", "submit"} + for path, handler_type in handlers: + method = handler_type.post if path.endswith(("preview", "submit")) else handler_type.get + with pytest.raises(HTTPError) as failure: + method(handler) + assert failure.value.status_code == 403 + handler.current_user = object() + monkeypatch.setattr(server, "SUBMISSION_ENABLED", False) + with pytest.raises(HTTPError) as failure: + asyncio.run(server.SubmitHandler.post(handler)) + assert failure.value.status_code == 409 + monkeypatch.setattr(server, "SUBMISSION_ENABLED", True) + with pytest.raises(HTTPError) as failure: + asyncio.run(server.SubmitHandler.post(handler)) + assert failure.value.status_code == 400 + +def test_namespace_discovery_flags_tau_ready_and_orders_them_first(): + api = FakeApis() + + result = runs.list_namespaces(api.client()) + + # Tau-ready destinations come first so the picker never makes a researcher + # guess a namespace that cannot host the run. + assert [row["name"] for row in result["namespaces"]] == ["beta", "team-a", "default"] + assert [row["tauEnabled"] for row in result["namespaces"]] == [True, True, False] + assert result["warnings"] == [] + + +def test_namespace_discovery_reports_denial_without_raising(): + api = FakeApis() + api.denied.add("namespaces") + + result = runs.list_namespaces(api.client()) + + assert result["namespaces"] == [] + assert result["warnings"] and "namespace discovery failed" in result["warnings"][0] + + +def test_namespace_continuation_warns_even_for_short_pages(): + api = FakeApis() + api.list_namespace = lambda **kwargs: {"items": api.namespaces[:1], "metadata": {"continue": "next"}} + assert runs.list_namespaces(api.client())["warnings"] + + +def test_ray_status_uses_explicit_states_not_reason_substrings(): + from tau.widgets.status import classify + + for status, expected in (({}, "queued"), ({"jobStatus": "RUNNING", "reason": "Stopping"}, "running"), + ({"jobStatus": "STOPPED"}, "failed"), + ({"jobStatus": "SUCCEEDED"}, "complete"), + ({"jobStatus": "FUTURE_STATE"}, "unknown")): + obj = {"status": status} + assert runs.ray_state(obj) == expected + assert classify(obj) == expected + + +@pytest.mark.parametrize("changed", ["pod", "run", "container"]) +def test_logs_discard_evidence_when_identity_changes_during_read(changed): + api = FakeApis() + original = api.read_namespaced_pod_log + + def replace(**kwargs): + response = original(**kwargs) + if changed == "pod": + api.pods[0]["metadata"]["uid"] = "replacement" + elif changed == "run": + api.job["metadata"]["uid"] = "replacement" + else: + api.pods[0]["spec"]["containers"] = [{"name": "other"}] + return response + + api.read_namespaced_pod_log = replace + with pytest.raises(runs.ReadError): + runs.read_logs(api.client(), namespace="ray", name="train", kind="Job", pod="worker", container="main") diff --git a/sdk/python/python/tests/test_jupyter_submit.py b/sdk/python/python/tests/test_jupyter_submit.py new file mode 100644 index 00000000..da9b4ec6 --- /dev/null +++ b/sdk/python/python/tests/test_jupyter_submit.py @@ -0,0 +1,320 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +"""Offline tests for the server-side submit path (tau.jupyter.submit). + +No cluster, no network: the Kubernetes client and backend are small fakes, and +the whole chain (package -> resolve -> render -> apply) runs in-process. +""" + +from __future__ import annotations + +import json +from typing import Any, Dict, List, Optional + +import pytest + +from tau._payload import decode +from tau.jupyter.submit import ( + SubmitError, + _safe_name, + build_plan, + submit_notebook, + submit_plan, +) + +VALID_NB = json.dumps( + { + "nbformat": 4, + "nbformat_minor": 5, + "metadata": { + "kernelspec": {"language": "python", "name": "python3"}, + "language_info": {"name": "python"}, + }, + "cells": [ + {"cell_type": "code", "id": "c0", "metadata": {}, "outputs": [{"x": 1}], "execution_count": 3, "source": ["print(1)"]}, + ], + } +).encode() + + +class NotFound(Exception): + def __init__(self) -> None: + super().__init__("rayjobs.ray.io not found") + self.status = 404 + + +class FakeCustom: + def __init__(self, cluster: Optional[Dict[str, Any]] = None, existing: bool = False) -> None: + self.cluster = cluster + self.existing = existing + self.created: List[Dict[str, Any]] = [] + + def list_cluster_custom_object(self, **kwargs: Any) -> Dict[str, Any]: + if self.cluster is None: + return {"items": []} + return {"items": [self.cluster]} + + def get_namespaced_custom_object(self, **kwargs: Any) -> Dict[str, Any]: + if self.existing: + return {"metadata": {"name": kwargs.get("name")}} + raise NotFound() + + def create_namespaced_custom_object(self, **kwargs: Any) -> Dict[str, Any]: + if self.existing: + error = RuntimeError("already exists") + error.status = 409 + raise error + self.created.append(kwargs) + return {"metadata": kwargs["body"]["metadata"]} + + +class FakeCore: + pass + + +class FakeClient: + def __init__(self, custom: FakeCustom) -> None: + self.custom = custom + self.core = FakeCore() + + +def cluster_doc() -> Dict[str, Any]: + return { + "spec": { + "workspaceDefaults": {"defaultQueue": "research-gpu"}, + "workloadProfiles": [ + {"name": "training-8gpu", "status": {"state": "ready"}, "compute": {"workerReplicas": 2, "gpusPerWorker": 8}}, + {"name": "cpu", "status": {"state": "ready"}, "compute": {"workerReplicas": 1, "gpusPerWorker": 0}}, + ], + } + } + + +def test_build_plan_embeds_a_self_contained_payload(): + client = FakeClient(FakeCustom(cluster=cluster_doc())) + + plan = build_plan(client=client, notebook_bytes=VALID_NB, namespace="ray", name="demo") + + assert plan.name == "demo" + assert plan.namespace == "ray" + assert plan.queue == "research-gpu" + assert plan.profile == "training-8gpu" + assert plan.manifest["spec"]["submissionMode"] == "K8sJobMode" + assert plan.manifest["spec"]["ttlSecondsAfterFinished"] == 600 + submitter = plan.manifest["spec"]["submitterPodTemplate"]["spec"] + assert submitter["restartPolicy"] == "Never" + assert submitter["containers"][0]["name"] == "submitter" + # The submitter runs the entrypoint, so it must carry the payload and mounts. + assert [c["name"] for c in submitter["initContainers"]] == ["tau-payload"] + assert {v["name"] for v in submitter["volumes"]} >= {"script", "data"} + mounts = {m["name"]: m["mountPath"] for m in submitter["containers"][0]["volumeMounts"]} + assert mounts["script"] == "/script" + assert mounts["data"] == "/data" + assert plan.summary()["submissionMode"] == "K8sJobMode" + assert plan.summary()["retentionSeconds"] == 600 + assert plan.digest + + spec = plan.manifest["spec"] + head = spec["rayClusterSpec"]["headGroupSpec"]["template"]["spec"] + init = head["initContainers"][0] + assert init["name"] == "tau-payload" + env = {e["name"]: e["value"] for e in init["env"]} + files = decode(env["TAU_PAYLOAD_B64"], env["TAU_PAYLOAD_DIGEST"]) + # the prepared notebook, the runner, and the context manifest all ship + assert set(files) == {"analysis.ipynb", "_tau_runner.py", "_tau_notebook_context.json"} + assert plan.manifest["metadata"]["annotations"]["tau.azure.com/payload-digest"] == plan.digest + assert plan.manifest["metadata"]["labels"]["kueue.x-k8s.io/queue-name"] == "research-gpu" + # CLI parity: the managed-by label is what makes a run discoverable by list. + assert plan.manifest["metadata"]["labels"]["tau.azure.com/managed-by"] == "tau" + # Plugin submissions keep pods for 600s so a finished run can still be read. + assert spec["ttlSecondsAfterFinished"] == 600 + # Plugin submissions use K8sJobMode so the driver output is a readable pod log. + assert spec["submissionMode"] == "K8sJobMode" + # outputs are stripped before embedding + assert b"\"outputs\":[]" in files["analysis.ipynb"] + + +def test_build_plan_honours_explicit_profile_and_queue(): + client = FakeClient(FakeCustom(cluster=cluster_doc())) + + plan = build_plan( + client=client, notebook_bytes=VALID_NB, namespace="ray", profile="cpu", queue="team-q" + ) + + assert plan.profile == "cpu" + assert plan.queue == "team-q" + worker = plan.manifest["spec"]["rayClusterSpec"]["workerGroupSpecs"][0] + assert worker["rayStartParams"]["num-gpus"] == "0" + assert plan.summary()["gpusPerWorker"] == [0] + + +def test_build_plan_rejects_unknown_profile(): + client = FakeClient(FakeCustom(cluster=cluster_doc())) + with pytest.raises(SubmitError) as err: + build_plan(client=client, notebook_bytes=VALID_NB, namespace="ray", profile="nope") + assert "not available" in str(err.value) + assert err.value.status == 400 + + +def test_build_plan_rejects_malformed_notebook(): + client = FakeClient(FakeCustom(cluster=cluster_doc())) + with pytest.raises(SubmitError) as err: + build_plan(client=client, notebook_bytes=b"not json", namespace="ray") + assert "cannot submit" in str(err.value) + assert err.value.status == 400 + + +def test_build_plan_reports_oversize_as_413(): + client = FakeClient(FakeCustom(cluster=cluster_doc())) + with pytest.raises(SubmitError) as err: + build_plan(client=client, notebook_bytes=VALID_NB, namespace="ray", input_cap=10) + assert err.value.status == 413 + + +def test_build_plan_requires_a_taucluster(): + client = FakeClient(FakeCustom(cluster=None)) + with pytest.raises(SubmitError) as err: + build_plan(client=client, notebook_bytes=VALID_NB, namespace="ray") + assert err.value.status == 409 + assert "no TauCluster" in str(err.value) + + +def test_build_plan_rejects_env_and_secret_collision(): + client = FakeClient(FakeCustom(cluster=cluster_doc())) + with pytest.raises(SubmitError): + build_plan( + client=client, + notebook_bytes=VALID_NB, + namespace="ray", + env={"TOKEN": "literal"}, + env_secret={"TOKEN": "hf:token"}, + ) + + +def test_submit_plan_applies_once_and_returns_handle(): + custom = FakeCustom(cluster=cluster_doc()) + client = FakeClient(custom) + plan = build_plan(client=client, notebook_bytes=VALID_NB, namespace="ray", name="demo") + + result = submit_plan(client=client, plan=plan) + + assert result.name == "demo" and result.namespace == "ray" and result.kind == "RayJob" + assert result.digest == plan.digest + assert len(custom.created) == 1 + assert custom.created[0]["body"]["kind"] == "RayJob" + assert custom.created[0]["plural"] == "rayjobs" + + +def test_submit_plan_refuses_to_replace_an_existing_run(): + custom = FakeCustom(cluster=cluster_doc(), existing=True) + client = FakeClient(custom) + plan = build_plan(client=client, notebook_bytes=VALID_NB, namespace="ray", name="demo") + + with pytest.raises(SubmitError) as err: + submit_plan(client=client, plan=plan) + + assert err.value.status == 409 + assert custom.created == [] + + +def test_submit_notebook_end_to_end(): + custom = FakeCustom(cluster=cluster_doc()) + client = FakeClient(custom) + + result = submit_notebook(client=client, notebook_bytes=VALID_NB, namespace="ray", name="demo") + + assert result.name == "demo" + assert len(custom.created) == 1 + + +def test_safe_name_sanitizes_and_bounds(): + assert _safe_name("my run/../x") == "my-run-x" + assert len(_safe_name("a" * 200)) <= 63 + assert _safe_name("///") == "notebook-run" + + +def test_review_is_in_memory_and_plan_digest_covers_resolved_runtime(monkeypatch): + import tempfile + + def forbid_temp(*args, **kwargs): + raise AssertionError("preview must not persist notebook bytes") + + monkeypatch.setattr(tempfile, "mkdtemp", forbid_temp) + client = FakeClient(FakeCustom(cluster=cluster_doc())) + first = build_plan(client=client, notebook_bytes=VALID_NB) + same = build_plan(client=client, notebook_bytes=VALID_NB) + assert first.summary()["planDigest"] == same.summary()["planDigest"] + monkeypatch.setenv("TAUGRID_RUNTIME_IMAGE", "example:changed") + changed = build_plan(client=client, notebook_bytes=VALID_NB) + assert changed.summary()["planDigest"] != first.summary()["planDigest"] + + +def test_cluster_discovery_rejects_ambiguous_or_incomplete_lists(): + class Many(FakeCustom): + def list_cluster_custom_object(self, **kwargs): + assert kwargs["limit"] == 2 + assert kwargs["_preload_content"] is False + assert kwargs["_request_timeout"] + return self.listing + + custom = Many() + for listing in ({"items": [cluster_doc(), cluster_doc()]}, + {"items": [cluster_doc()], "metadata": {"continue": "more"}}): + custom.listing = listing + with pytest.raises(SubmitError, match="ambiguous"): + build_plan(client=FakeClient(custom), notebook_bytes=VALID_NB) + + +def test_profile_preserves_flat_scheduling_and_rejects_invalid_counts(): + from tau._profile import workload_profiles + + document = {"spec": {"workloadProfiles": [{"name": "cpu", "workerCount": 2, + "gpusPerWorker": 0, "cpusPerWorker": 3, "memoryPerWorker": "6Gi", + "nodeSelector": {"pool": "cpu"}}]}} + profile = workload_profiles(document)[0] + assert profile.node_selector == {"pool": "cpu"} + assert profile.memory_per_worker == "6Gi" + for count in (0, -1, True, 1.5): + document["spec"]["workloadProfiles"][0]["workerCount"] = count + with pytest.raises(ValueError): + workload_profiles(document) + + +def test_malformed_notebook_structure_is_user_error(): + for document in ([1], {"nbformat": 4, "cells": [], "metadata": []}, + {"nbformat": 4, "cells": [{"cell_type": "code", "source": [7]}], + "metadata": {"kernelspec": {"language": "python"}}}): + with pytest.raises(SubmitError) as error: + build_plan(client=FakeClient(FakeCustom()), notebook_bytes=json.dumps(document).encode()) + assert error.value.status == 400 + + +def test_launcher_filter_never_discards_unrelated_panel_calls(): + from tau._notebook_pkg import prepare_notebook + document = json.loads(VALID_NB) + document["cells"][0]["source"] = ["import tau.widgets as tw\n", "model.panel()"] + prepared, dropped = prepare_notebook(json.dumps(document).encode()) + assert not dropped + assert "model.panel()" in prepared.decode() + + +@pytest.mark.parametrize("metadata", [[], None, "python"]) +def test_invalid_metadata_is_rejected(metadata): + document = json.loads(VALID_NB) + document["metadata"] = metadata + with pytest.raises(SubmitError) as error: + build_plan(client=FakeClient(FakeCustom()), notebook_bytes=json.dumps(document).encode()) + assert error.value.status == 400 + + +@pytest.mark.parametrize("source,expected", [ + ("import tau.widgets as tw\ntw.panel(namespace='ray')", True), + ("from tau.widgets import panel\npanel()", True), + ("import tau.widgets as tw; important_work()", False), + ("import tau.widgets as tw\ntw.panel(namespace=side_effect())", False), + ("%load_ext tau.widgets.ipython\n%taugrid", True), +]) +def test_launcher_recognition_requires_only_known_statements(source, expected): + from tau._notebook_pkg import classify_launcher_cell + assert classify_launcher_cell({"source": source}) is expected diff --git a/sdk/python/python/tests/test_notebook_files.py b/sdk/python/python/tests/test_notebook_files.py new file mode 100644 index 00000000..2ee36045 --- /dev/null +++ b/sdk/python/python/tests/test_notebook_files.py @@ -0,0 +1,132 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +"""Tests for choosing which files ship with a submitted notebook.""" + +from __future__ import annotations + +import json +from pathlib import Path + +import pytest + +from tau._notebook_pkg import package +from tau._payload import decode +from tau.jupyter import notebook_files +from tau.jupyter.notebook_files import ( + MAX_FILE_BYTES, + FileSelectionError, + list_candidates, + notebook_directory, + read_selected, +) + +NOTEBOOK = "analysis.ipynb" + + +def notebook_bytes() -> bytes: + return json.dumps({ + "nbformat": 4, + "nbformat_minor": 5, + "metadata": {"kernelspec": {"language": "python", "name": "python3"}, "language_info": {"name": "python"}}, + "cells": [{"cell_type": "code", "id": "c", "metadata": {}, "outputs": [], "execution_count": None, "source": ["print(1)"]}], + }).encode() + + +def workspace(tmp_path: Path) -> Path: + (tmp_path / NOTEBOOK).write_bytes(notebook_bytes()) + (tmp_path / "helpers.py").write_bytes(b"VALUE = 41\n") + (tmp_path / "config.json").write_bytes(b"{}\n") + (tmp_path / "notes.md").write_bytes(b"# notes\n") + (tmp_path / "image.png").write_bytes(b"\x89PNG") + (tmp_path / ".hidden").write_text("x", encoding="utf-8") + (tmp_path / "__pycache__").mkdir() + (tmp_path / "__pycache__" / "junk.pyc").write_bytes(b"x") + (tmp_path / "nested").mkdir() + (tmp_path / "nested" / "deep.py").write_text("x = 1\n", encoding="utf-8") + return tmp_path + + +def test_candidates_offer_flat_source_files_and_skip_noise(tmp_path): + root = workspace(tmp_path) + + result = list_candidates(root, NOTEBOOK) + + names = [row["name"] for row in result["files"]] + assert names == ["config.json", "helpers.py", "notes.md"] + # The notebook itself, hidden files, caches, binaries and nested trees are not offered. + for skipped in (NOTEBOOK, ".hidden", "image.png", "nested/deep.py"): + assert skipped not in names + assert result["budgetBytes"] > 0 + + +def test_candidates_warn_about_a_file_too_large_to_embed(tmp_path): + root = workspace(tmp_path) + (root / "big.py").write_bytes(b"x" * (MAX_FILE_BYTES + 1)) + + result = list_candidates(root, NOTEBOOK) + + assert "big.py" not in [row["name"] for row in result["files"]] + assert any("big.py" in warning for warning in result["warnings"]) + + +def test_notebook_directory_rejects_escape_from_the_server_root(tmp_path): + root = workspace(tmp_path) + outside = tmp_path.parent / "elsewhere.ipynb" + + with pytest.raises(FileSelectionError): + notebook_directory(root, "../" + outside.name) + + +def test_read_selected_refuses_paths_outside_the_flat_directory(tmp_path): + root = workspace(tmp_path) + directory = notebook_directory(root, NOTEBOOK) + + for name in ("../helpers.py", "nested/deep.py", "/etc/passwd", ".."): + with pytest.raises(FileSelectionError): + read_selected(directory, [name]) + + +def test_read_selected_refuses_missing_and_oversize_files(tmp_path): + root = workspace(tmp_path) + directory = notebook_directory(root, NOTEBOOK) + (root / "big.py").write_bytes(b"x" * (MAX_FILE_BYTES + 1)) + + with pytest.raises(FileSelectionError): + read_selected(directory, ["nope.py"]) + + with pytest.raises(FileSelectionError) as failure: + read_selected(directory, ["big.py"]) + assert failure.value.status == 413 + + +def test_read_selected_enforces_the_payload_ceiling(tmp_path, monkeypatch): + root = workspace(tmp_path) + directory = notebook_directory(root, NOTEBOOK) + monkeypatch.setattr(notebook_files, "MAX_DECODED_BYTES", 10) + + with pytest.raises(FileSelectionError) as failure: + read_selected(directory, ["helpers.py", "config.json"]) + assert failure.value.status == 413 + assert "payload ceiling" in str(failure.value) + + +def test_chosen_files_ride_the_payload_and_the_plan_summary(tmp_path): + root = workspace(tmp_path) + selected = read_selected(notebook_directory(root, NOTEBOOK), ["helpers.py", "config.json"]) + + staged = package(notebook_bytes(), staging_dir=tmp_path / "stage", extra_files=selected) + + assert staged.included_files == ["config.json", "helpers.py"] + files = decode(staged.encoding.encoded, staged.encoding.digest) + assert files["helpers.py"] == b"VALUE = 41\n" + assert files["config.json"] == b"{}\n" + # The chosen files are staged for inspection too. + assert (tmp_path / "stage" / "helpers.py").exists() + + +def test_package_refuses_a_collision_with_a_generated_file(tmp_path): + from tau._notebook_pkg import NotebookInvalid + + with pytest.raises(NotebookInvalid): + package(notebook_bytes(), staging_dir=tmp_path, extra_files={"_tau_runner.py": b"x"}) diff --git a/sdk/python/python/tests/test_notebook_loss_demo.py b/sdk/python/python/tests/test_notebook_loss_demo.py new file mode 100644 index 00000000..192d0f54 --- /dev/null +++ b/sdk/python/python/tests/test_notebook_loss_demo.py @@ -0,0 +1,80 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +import importlib.util +import json +import math +from pathlib import Path + +import pytest + + +@pytest.fixture +def demo(): + path = Path(__file__).resolve().parents[4] / "tools" / "run-cpu-ray-demo.py" + spec = importlib.util.spec_from_file_location("notebook_loss_demo", path) + module = importlib.util.module_from_spec(spec) + spec.loader.exec_module(module) + return module + + +def prepare(demo, monkeypatch, samples, *, gpus=0, state="complete", source_uid="run"): + calls = [] + plan = {"name": "reviewed", "namespace": "ray", "profile": "cpu", + "gpusPerWorker": [gpus], "submissionMode": "K8sJobMode", "retentionSeconds": 600, "planDigest": "a" * 64} + + def call(server, token, path, **kwargs): + calls.append((path, kwargs)) + if path == "capabilities": + return {"submissionEnabled": True} + if path == "preview": + return {"submittable": True, "submissionEnabled": True, "plan": plan} + if path == "submit": + return {"submitted": True, "name": "reviewed", "namespace": "ray", "kind": "RayJob"} + if path == "status": + return {"uid": "run", "terminal": True, "state": state, "metrics": { + "source": {"type": "stdout", "runUid": source_uid, "pod": "driver", "container": "submitter"}, + "checkedAt": "2026-09-22T00:00:00Z", "samples": samples}} + if path == "logs": + return {"text": "step=1 loss=2\n", "possiblyTruncated": True} + raise AssertionError(path) + + monkeypatch.setattr(demo, "call", call) + return calls + + +@pytest.mark.parametrize("samples", [[], [{"step": 1, "value": math.nan}], + [{"step": -1, "value": 2}], [{"step": 1, "value": True}]]) +def test_success_without_real_finite_loss_fails(demo, monkeypatch, samples): + calls = prepare(demo, monkeypatch, samples) + assert demo.main(["--token", "test", "--profile", "cpu"]) == 1 + assert [path for path, _ in calls].count("submit") == 1 + + +def test_loss_success_submits_once_and_polls_opt_in(demo, monkeypatch): + calls = prepare(demo, monkeypatch, [{"step": 1, "value": 2}]) + assert demo.main(["--token", "test", "--profile", "cpu", "--queue", "cpu-q"]) == 0 + assert [path for path, _ in calls] == ["capabilities", "preview", "submit", "status", "logs"] + reviewed = calls[1][1]["body"] + submitted = calls[2][1]["body"] + assert submitted["planDigest"] == "a" * 64 + assert submitted["notebook"] == reviewed["notebook"] + assert submitted["profile"] == "cpu" and submitted["queue"] == "cpu-q" + assert submitted["name"] == "reviewed" and submitted["confirm"] is True + assert calls[3][1]["params"]["includeMetrics"] == "true" + + +@pytest.mark.parametrize("options", [{"gpus": 1}, {"state": "failed"}, {"source_uid": "other"}]) +def test_gpu_failed_or_replaced_run_cannot_pass(demo, monkeypatch, options): + calls = prepare(demo, monkeypatch, [{"step": 1, "value": 2}], **options) + assert demo.main(["--token", "test", "--profile", "cpu"]) == 1 + if options.get("gpus"): + assert "submit" not in [path for path, _ in calls] + + +def test_demo_notebook_is_deterministic_and_cpu_only(demo): + notebook = json.loads(demo.NOTEBOOK.read_text(encoding="utf-8")) + source = "".join(notebook["cells"][1]["source"]) + assert "step=" in source and "loss=" in source and "flush=True" in source + assert "import time" in source + assert "random" not in source and "torch" not in source diff --git a/sdk/python/python/tests/test_notebook_packaging.py b/sdk/python/python/tests/test_notebook_packaging.py new file mode 100644 index 00000000..fb78ddfe --- /dev/null +++ b/sdk/python/python/tests/test_notebook_packaging.py @@ -0,0 +1,24 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. +"""Check wheel packaging refuses an absent or incomplete frontend.""" +import json +import runpy +import sys +from pathlib import Path +from types import SimpleNamespace + +import pytest + + +@pytest.mark.parametrize("with_manifest", [False, True]) +def test_packaging_refuses_missing_prebuilt_assets(tmp_path, monkeypatch, with_manifest): + source = Path(__file__).parents[1] / "setup.py" + copied = tmp_path / "setup.py" + copied.write_text(source.read_text(encoding="utf-8"), encoding="utf-8") + if with_manifest: + folder = tmp_path / "tau" / "labextension" + folder.mkdir(parents=True) + (folder / "package.json").write_text(json.dumps({"jupyterlab": {"_build": {"load": "static/remoteEntry.missing.js"}}}), encoding="utf-8") + monkeypatch.setitem(sys.modules, "setuptools", SimpleNamespace(setup=lambda **kwargs: None)) + with pytest.raises(RuntimeError, match="prebuilt"): + runpy.run_path(str(copied)) diff --git a/sdk/python/python/tests/test_widgets_button.py b/sdk/python/python/tests/test_widgets_button.py new file mode 100644 index 00000000..3da2ec0d --- /dev/null +++ b/sdk/python/python/tests/test_widgets_button.py @@ -0,0 +1,111 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +"""Offline tests for the panel's interactive Submit button (S005/S008 surface). + +The widget tree is constructible without a frontend: ipywidgets objects are +plain Python until displayed. A click is simulated by invoking the same handler +the button's ``on_click`` registers, which is the exact path a user click drives. +""" + +import tempfile +from pathlib import Path + +import pytest + +from tau._backend import KubernetesBackend +from tau._render import Profile, TAU_QUEUE_LABEL +from tau.widgets.kube import ClusterClient +from tau.widgets.panel import TauGridPanel +from tests.test_widgets_submit import FakeCustomApi, NB_BYTES, _cluster_doc + + +def _real_notebook(tmp_path: Path) -> str: + """Write a real notebook file so submit() can read its bytes.""" + src = tmp_path / "analysis.ipynb" + src.write_bytes(NB_BYTES) + return str(src) + + +def _panel_with_button(cluster=None): + fake = FakeCustomApi(cluster=cluster) + panel = TauGridPanel(namespace="ray", run_name="demo", + client=ClusterClient(custom=fake, core=None)) + tree = panel.build() + return panel, tree, fake + + +def test_build_creates_submit_button_with_expected_labels(): + panel, tree, _ = _panel_with_button() + assert panel._controls is not None + submit = panel._controls["submit"] + assert submit.description == "Submit notebook" + assert submit.button_style == "primary" + assert submit.disabled is True # no notebook path yet (S005) + assert panel._controls["refresh"].description == "Refresh" + assert "taugrid-panel" in panel._controls["chart"].value + + +def test_submit_button_enables_once_notebook_path_is_set(tmp_path): + panel, tree, _ = _panel_with_button() + assert panel._controls["submit"].disabled is True + assert "notebook path not resolved" in panel._controls["status"].value + + panel.set_notebook_path(_real_notebook(tmp_path)) + assert panel._controls["submit"].disabled is False + assert "analysis.ipynb" in panel._controls["status"].value + + +def test_clicking_submit_runs_the_full_chain(tmp_path): + panel, tree, fake = _panel_with_button(cluster=_cluster_doc()) + panel.set_notebook_path(_real_notebook(tmp_path)) + with tempfile.TemporaryDirectory() as d: + # The click handler creates its own staging dir via the panel's factory; + # point that factory at this temp dir so cleanup is deterministic. + panel._default_staging_dir = lambda: Path(d) + # Invoke the same handler the button's on_click registered. + handle = panel._on_submit_clicked() + assert handle.name == "demo" and handle.kind == "RayJob" + assert panel.staged.notebook_path.exists() + staged_dir = panel.staged.notebook_path.parent + assert "_tau_runner.py" in {p.name for p in staged_dir.iterdir()} + body = fake.created[0]["body"] + assert body["metadata"]["labels"][TAU_QUEUE_LABEL] == "research-gpu" + # After submit the button stays enabled (re-submission is allowed) and the + # status line switches into run view. + assert panel._controls["submit"].disabled is False + assert "demo" in panel._controls["status"].value + + +def test_clicking_submit_with_no_notebook_raises_instead_of_misrendering(): + panel, tree, fake = _panel_with_button() + with pytest.raises(ValueError): + panel._on_submit_clicked() + assert fake.created == [] + + +def test_refresh_button_repaints_status_and_chart(tmp_path): + panel, tree, _ = _panel_with_button(cluster=_cluster_doc()) + panel.set_notebook_path(_real_notebook(tmp_path)) + before = panel._controls["status"].value + panel._on_refresh_clicked() + assert panel._controls["status"].value == before + assert "taugrid-panel" in panel._controls["chart"].value + + +def test_button_flow_uses_caller_profile_and_queue(tmp_path): + fake = FakeCustomApi() + panel = TauGridPanel(namespace="ray", run_name="demo") + panel.set_notebook_path(_real_notebook(tmp_path)) + panel.build() + with tempfile.TemporaryDirectory() as d: + handle = panel.submit( + notebook=panel.notebook_path, + profile=Profile(name="cpu", workers=1, gpus_per_worker=0), + queue="cpu-queue", + staging_dir=Path(d), + backend=KubernetesBackend(custom_objects=fake), + ) + assert handle.name == "demo" + body = fake.created[0]["body"] + assert body["metadata"]["labels"][TAU_QUEUE_LABEL] == "cpu-queue" \ No newline at end of file diff --git a/sdk/python/python/tests/test_widgets_core.py b/sdk/python/python/tests/test_widgets_core.py new file mode 100644 index 00000000..eef44dac --- /dev/null +++ b/sdk/python/python/tests/test_widgets_core.py @@ -0,0 +1,202 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +"""Offline tests for the notebook widget core (backend + renderer + profile).""" + +import json +import tempfile +from pathlib import Path + +import pytest + +from tau._backend import KubernetesBackend +from tau._notebook_pkg import PayloadTooLarge, package +from tau._profile import NoTauClusterFound, resolve +from tau._render import Profile, UnsupportedShape, refuse, render_rayjob + +TAU_KEY = "kueue.x-k8s.io/queue-name" + +VALID_NB = json.dumps({ + "nbformat": 4, + "nbformat_minor": 5, + "metadata": {"kernelspec": {"language": "python", "name": "python3"}, "language_info": {"name": "python"}}, + "cells": [ + {"cell_type": "code", "id": "c0", "metadata": {}, "outputs": [], "execution_count": None, "source": ["print(1)"]}, + ], +}).encode() + + +class FakeCustomApi: + """Records create_namespaced_custom_object calls for the backend test.""" + + def __init__(self) -> None: + self.created: list[dict] = [] + + def create_namespaced_custom_object(self, **kwargs): + self.created.append(kwargs) + return {"metadata": {"name": kwargs.get("body", {}).get("metadata", {}).get("name")}} + + +def test_import_tau_does_not_pull_kubernetes(): + import sys + + for mod in list(sys.modules): + if mod.startswith("kubernetes"): + del sys.modules[mod] + assert "kubernetes" not in sys.modules + + +def test_render_rayjob_kueue_contract(): + job = render_rayjob( + name="demo", + namespace="ray", + queue="research-gpu", + profile=Profile(name="p1", workers=2, gpus_per_worker=8, num_cpus_per_worker=16), + entrypoint="python _tau_runner.py", + ) + assert job["apiVersion"] == "ray.io/v1" + assert job["kind"] == "RayJob" + assert job["spec"]["suspend"] is True + assert "managedBy" not in job["spec"] + assert job["metadata"]["labels"][TAU_KEY] == "research-gpu" + head = job["spec"]["rayClusterSpec"]["headGroupSpec"] + assert head["rayStartParams"]["num-gpus"] == "0" + assert head["rayStartParams"]["num-cpus"] == "0" + workers = job["spec"]["rayClusterSpec"]["workerGroupSpecs"][0] + assert workers["replicas"] == 2 + assert workers["rayStartParams"]["num-gpus"] == "8" + assert workers["template"]["spec"]["containers"][0]["resources"]["requests"]["nvidia.com/gpu"] == "8" + + +def test_render_rayjob_no_gpu_when_profile_zero(): + job = render_rayjob( + name="cpu", namespace="ns", queue="q", profile=Profile(name="cpu", workers=1, gpus_per_worker=0), + entrypoint="cmd", + ) + wg = job["spec"]["rayClusterSpec"]["workerGroupSpecs"][0] + req = wg["template"]["spec"]["containers"][0]["resources"]["requests"] + assert "nvidia.com/gpu" not in req + assert wg["rayStartParams"]["num-gpus"] == "0" + + +def test_refuse_unsupported_shapes(): + with pytest.raises(UnsupportedShape): + refuse(archives=True) + with pytest.raises(UnsupportedShape): + refuse(chained=True) + with pytest.raises(UnsupportedShape): + refuse(offload=True) + refuse() # non-refusal is a no-op + + +def test_kubernetes_backend_submits_rayjob(): + fake = FakeCustomApi() + backend = KubernetesBackend(custom_objects=fake) + manifest = render_rayjob( + name="x", namespace="ns", queue="q", profile=Profile(name="p", workers=1), + entrypoint="cmd", + ) + backend.submit_rayjob(manifest, namespace="ns") + assert len(fake.created) == 1 + assert fake.created[0]["body"]["kind"] == "RayJob" + assert fake.created[0]["plural"] == "rayjobs" + + +def test_profile_resolution(): + cluster = { + "spec": { + "workspaceDefaults": {"defaultQueue": "research-gpu"}, + "workloadProfiles": [ + {"name": "training-8gpu", "status": {"state": "ready"}, + "compute": {"workerReplicas": 4, "gpusPerWorker": 8}}, + {"name": "training-1gpu", "status": {"state": "ready"}, + "compute": {"workerReplicas": 1, "gpusPerWorker": 1}}, + {"name": "broken", "status": {"state": "notready"}, + "compute": {"workerReplicas": 2, "gpusPerWorker": 2}}, + ], + } + } + profiles, queue = resolve(cluster) + assert queue == "research-gpu" + names = {p.name for p in profiles} + assert names == {"training-8gpu", "training-1gpu"} + eight = next(p for p in profiles if p.name == "training-8gpu") + assert eight.workers == 4 and eight.gpus_per_worker == 8 + + +def test_resolve_no_cluster_raises(): + with pytest.raises(NoTauClusterFound): + resolve({}) + + +def test_package_is_self_contained_and_capped(): + with tempfile.TemporaryDirectory() as d: + payload = package(VALID_NB, staging_dir=Path(d)) + assert payload.notebook_path.exists() + assert payload.runner_path.exists() + assert "analysis.ipynb" in payload.notebook_path.name + with pytest.raises(PayloadTooLarge): + package(VALID_NB, staging_dir=Path(d), input_cap=10) + + +def test_runner_forwards_iopub_without_starting_kernel(tmp_path, monkeypatch, capsys): + import runpy + import sys + from types import SimpleNamespace + + messages = [ + {"msg_type": "stream", "content": {"name": "stdout", "text": "step=1 loss=0.5\n"}}, + {"msg_type": "stream", "content": {"name": "stderr", "text": "diagnostic\n"}}, + {"msg_type": "display_data", "content": {"data": {"text/plain": "not a stream"}}}, + ] + handled = [] + written = [] + + class FakeExecutor: + def __init__(self, timeout): + assert timeout == 600 + + def process_message(self, message, cell, index): + handled.append(message) + return "preserved" + + def preprocess(self, notebook, resources): + for message in messages: + assert self.process_message(message, {}, 0) == "preserved" + + monkeypatch.setitem(sys.modules, "nbconvert", SimpleNamespace(preprocessors=SimpleNamespace(ExecutePreprocessor=FakeExecutor))) + monkeypatch.setitem(sys.modules, "nbformat", SimpleNamespace( + read=lambda *args, **kwargs: {}, write=lambda *args, **kwargs: written.append(args))) + monkeypatch.setattr(sys, "argv", ["_tau_runner.py"]) + payload = package(VALID_NB, staging_dir=tmp_path) + runner = runpy.run_path(str(payload.runner_path)) + assert runner["main"]() == 0 + output = capsys.readouterr() + assert "step=1 loss=0.5\n" in output.out + assert output.err == "diagnostic\n" + assert "not a stream" not in output.out + assert handled == messages and len(written) == 1 + + +def test_package_does_not_modify_source(): + import tempfile as _t + + with _t.TemporaryDirectory() as d: + noted = Path(d) / "src.ipynb" + original = VALID_NB + noted.write_bytes(original) + before = noted.read_bytes() + staging = Path(d) / "stage" + package(noted.read_bytes(), staging_dir=staging) + assert noted.read_bytes() == before + + +@pytest.mark.parametrize("kwargs", [ + {"workers": 0}, {"workers": True}, {"workers": 1.5}, + {"gpus_per_worker": -1}, {"gpus_per_worker": True}, + {"num_cpus_per_worker": float("nan")}, {"num_cpus_per_worker": 0}, + {"num_cpus_per_worker": True}, {"node_selector": {"pool": 7}}, +]) +def test_explicit_profile_rejects_invalid_resources(kwargs): + with pytest.raises(ValueError): + Profile(name="invalid", **kwargs) diff --git a/sdk/python/python/tests/test_widgets_embed.py b/sdk/python/python/tests/test_widgets_embed.py new file mode 100644 index 00000000..d1f97af1 --- /dev/null +++ b/sdk/python/python/tests/test_widgets_embed.py @@ -0,0 +1,336 @@ +# Copyright (c) Microsoft Corporation. +# Licensed under the MIT License. + +"""Offline tests for the TensorBoard-style embed module and its integrations. + +Everything here is local: a tiny stdlib HTTP server stands in for the portal +and the proxy binds an ephemeral port on 127.0.0.1. No cluster, no real portal, +and no external network are touched. +""" + +import json +import threading +import urllib.error +import urllib.request +from http.server import BaseHTTPRequestHandler, ThreadingHTTPServer + +import pytest + +from tau.widgets.embed import ( + PortalProxy, + experiment_path, + iframe_html, + ray_dashboard_path, + run_view_path, + same_origin, +) +from tau.widgets.ipython import _parse_magic +from tau.widgets.panel import TauGridPanel +from tau.widgets.status import RunStatus + + +# --- fake portal upstream ------------------------------------------------- + + +class _FakePortalHandler(BaseHTTPRequestHandler): + """Serves one framed HTML page, one JSON path, and a 404 for anything else.""" + + protocol_version = "HTTP/1.1" + + def do_GET(self) -> None: # noqa: N802 - http.server API + self._respond("GET") + + def do_HEAD(self) -> None: # noqa: N802 - http.server API + self._respond("HEAD") + + def _respond(self, method: str) -> None: + if self.path == "/page": + body = b"portal page" + self.send_response(200) + self.send_header("Content-Type", "text/html; charset=utf-8") + self.send_header("X-Frame-Options", "DENY") + self.send_header("Content-Security-Policy", "default-src 'self'; frame-ancestors 'none'") + elif self.path == "/data.json": + body = json.dumps({"ok": True, "path": self.path}).encode("utf-8") + self.send_response(200) + self.send_header("Content-Type", "application/json") + else: + body = b"not found" + self.send_response(404) + self.send_header("Content-Type", "text/plain; charset=utf-8") + self.send_header("Content-Length", str(len(body))) + self.end_headers() + if method != "HEAD": + self.wfile.write(body) + + def log_message(self, *args: object) -> None: # keep pytest output clean + return + + +class _FakePortal: + """A local stand-in for the TauGrid portal, bound to an ephemeral port.""" + + def __init__(self) -> None: + self._server = ThreadingHTTPServer(("127.0.0.1", 0), _FakePortalHandler) + self._server.daemon_threads = True # type: ignore[attr-defined] + self._thread = threading.Thread(target=self._server.serve_forever, daemon=True) + self._thread.start() + + @property + def base_url(self) -> str: + host, port = self._server.server_address[:2] + return f"http://{host}:{port}" + + def stop(self) -> None: + self._server.shutdown() + self._server.server_close() + self._thread.join(timeout=5) + + def __enter__(self) -> "_FakePortal": + return self + + def __exit__(self, *exc: object) -> bool: + self.stop() + return False + + +# --- path builders -------------------------------------------------------- + + +def test_run_view_path_quotes_both_segments(): + assert run_view_path("ray", "my-job") == "/portal/runs/ray/my-job" + # A slash and a space must both be escaped, not treated as path structure. + assert run_view_path("my ns", "a/b") == "/portal/runs/my%20ns/a%2Fb" + + +def test_ray_dashboard_path_quotes_segments(): + assert ray_dashboard_path("ray", "cluster") == "/api/portal/ray/proxy/ray/cluster/" + assert ray_dashboard_path("my ns", "cluster/1") == "/api/portal/ray/proxy/my%20ns/cluster%2F1/" + + +def test_experiment_path_quotes_run_id(): + assert experiment_path("job-123") == "/stellar?target=job-123" + assert experiment_path("job id/1") == "/stellar?target=job%20id%2F1" + + +# --- same_origin ---------------------------------------------------------- + + +def test_same_origin_true_for_matching_scheme_host_and_default_port(): + assert same_origin("http://portal.example.com/a", "http://portal.example.com/b") is True + assert same_origin("http://portal.example.com:80/a", "http://portal.example.com/b") is True + assert same_origin("https://portal.example.com/a", "https://portal.example.com:443/b") is True + + +def test_same_origin_false_for_scheme_host_or_port_mismatch(): + assert same_origin("http://portal.example.com", "https://portal.example.com") is False + assert same_origin("http://portal.example.com:8080", "http://portal.example.com") is False + assert same_origin("http://a.example.com", "http://b.example.com") is False + + +# --- iframe_html ---------------------------------------------------------- + + +def test_iframe_html_escapes_url_and_title(): + url = 'http://portal.example.com/x">' + title = '"run' + out = iframe_html(url, height=500, title=title) + assert "height:500px" in out + assert "