windhover 0.8.0__tar.gz → 0.8.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {windhover-0.8.0 → windhover-0.8.1}/PKG-INFO +1 -1
- {windhover-0.8.0 → windhover-0.8.1}/pyproject.toml +1 -1
- {windhover-0.8.0 → windhover-0.8.1}/windhover/static/index.html +21 -1
- {windhover-0.8.0 → windhover-0.8.1}/.github/workflows/ci.yml +0 -0
- {windhover-0.8.0 → windhover-0.8.1}/.gitignore +0 -0
- {windhover-0.8.0 → windhover-0.8.1}/LICENSE +0 -0
- {windhover-0.8.0 → windhover-0.8.1}/README.md +0 -0
- {windhover-0.8.0 → windhover-0.8.1}/SPEC.md +0 -0
- {windhover-0.8.0 → windhover-0.8.1}/docs/graph.png +0 -0
- {windhover-0.8.0 → windhover-0.8.1}/docs/logo.svg +0 -0
- {windhover-0.8.0 → windhover-0.8.1}/docs/runs.png +0 -0
- {windhover-0.8.0 → windhover-0.8.1}/docs/social-preview.png +0 -0
- {windhover-0.8.0 → windhover-0.8.1}/docs/stats.png +0 -0
- {windhover-0.8.0 → windhover-0.8.1}/docs/trace.png +0 -0
- {windhover-0.8.0 → windhover-0.8.1}/tests/__init__.py +0 -0
- {windhover-0.8.0 → windhover-0.8.1}/tests/test_smoke.py +0 -0
- {windhover-0.8.0 → windhover-0.8.1}/windhover/__init__.py +0 -0
- {windhover-0.8.0 → windhover-0.8.1}/windhover/config.py +0 -0
- {windhover-0.8.0 → windhover-0.8.1}/windhover/demo_graph.py +0 -0
- {windhover-0.8.0 → windhover-0.8.1}/windhover/extract.py +0 -0
- {windhover-0.8.0 → windhover-0.8.1}/windhover/pricing.json +0 -0
- {windhover-0.8.0 → windhover-0.8.1}/windhover/server.py +0 -0
- {windhover-0.8.0 → windhover-0.8.1}/windhover/static/icon.svg +0 -0
- {windhover-0.8.0 → windhover-0.8.1}/windhover/static/manifest.json +0 -0
- {windhover-0.8.0 → windhover-0.8.1}/windhover/static/vendor/cytoscape-dagre.js +0 -0
- {windhover-0.8.0 → windhover-0.8.1}/windhover/static/vendor/cytoscape.min.js +0 -0
- {windhover-0.8.0 → windhover-0.8.1}/windhover/static/vendor/dagre.min.js +0 -0
- {windhover-0.8.0 → windhover-0.8.1}/windhover/static/vendor/fonts/fraunces-500.woff2 +0 -0
- {windhover-0.8.0 → windhover-0.8.1}/windhover/static/vendor/fonts/fraunces-600-italic.woff2 +0 -0
- {windhover-0.8.0 → windhover-0.8.1}/windhover/static/vendor/fonts/fraunces-600.woff2 +0 -0
- {windhover-0.8.0 → windhover-0.8.1}/windhover/store.py +0 -0
- {windhover-0.8.0 → windhover-0.8.1}/windhover/tracer.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: windhover
|
|
3
|
-
Version: 0.8.
|
|
3
|
+
Version: 0.8.1
|
|
4
4
|
Summary: Self-hosted, mobile-friendly observability for LangGraph — traces, run history, cost, and a living graph view.
|
|
5
5
|
Project-URL: Repository, https://github.com/justfeltlikerunning/windhover
|
|
6
6
|
Author: justfeltlikerunning
|
|
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "windhover"
|
|
7
|
-
version = "0.8.
|
|
7
|
+
version = "0.8.1"
|
|
8
8
|
description = "Self-hosted, mobile-friendly observability for LangGraph — traces, run history, cost, and a living graph view."
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.10"
|
|
@@ -250,6 +250,12 @@ window.pickDiff=async(id)=>{
|
|
|
250
250
|
.code .ln{color:var(--muted);text-align:right;user-select:none;position:sticky;left:-12px;background:var(--surface2);padding-left:12px}
|
|
251
251
|
.code .cl{white-space:pre}
|
|
252
252
|
.code .errline{background:var(--err-weak)}
|
|
253
|
+
.py-k{color:var(--accent-text);font-weight:600}
|
|
254
|
+
.py-s{color:var(--ok)}
|
|
255
|
+
.py-c{color:var(--muted);font-style:italic}
|
|
256
|
+
.py-n{color:var(--chip-tool-t)}
|
|
257
|
+
.py-d{color:var(--chip-llm-t)}
|
|
258
|
+
.py-f{font-weight:700}
|
|
253
259
|
.code .cl.errline{box-shadow:inset 3px 0 0 var(--err);padding-left:6px;margin-left:-6px}
|
|
254
260
|
.errhint{font:11px var(--mono);color:var(--err);margin-top:3px;max-width:400px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
|
|
255
261
|
.diffgrid{display:grid;grid-template-columns:1fr 1fr;gap:10px}
|
|
@@ -581,9 +587,23 @@ function tbLines(err,src){ const out=new Set();
|
|
|
581
587
|
if(m[1].split('/').pop()===base){ const ln=+m[2];
|
|
582
588
|
if(ln>=src.line_start&&ln<=src.line_end) out.add(ln); } }
|
|
583
589
|
return out; }
|
|
590
|
+
const PY_TOKEN=/(#.*$)|("(?:[^"\\]|\\.)*"|'(?:[^'\\]|\\.)*')|(@\w+)|\b(def|class|return|if|elif|else|for|while|try|except|finally|raise|with|as|import|from|lambda|pass|break|continue|and|or|not|in|is|None|True|False|global|nonlocal|yield|async|await|del|assert|self)\b|(\b\d+(?:\.\d+)?\b)/g;
|
|
591
|
+
function pyHi(line){ let out='',last=0,defNext=false;
|
|
592
|
+
for(const m of line.matchAll(PY_TOKEN)){
|
|
593
|
+
out+=esc(line.slice(last,m.index)); last=m.index+m[0].length;
|
|
594
|
+
const t=esc(m[0]);
|
|
595
|
+
if(m[1]) out+=`<span class="py-c">${t}</span>`;
|
|
596
|
+
else if(m[2]) out+=`<span class="py-s">${t}</span>`;
|
|
597
|
+
else if(m[3]) out+=`<span class="py-d">${t}</span>`;
|
|
598
|
+
else if(m[4]) out+=`<span class="py-k">${t}</span>`;
|
|
599
|
+
else out+=`<span class="py-n">${t}</span>`;
|
|
600
|
+
}
|
|
601
|
+
out+=esc(line.slice(last));
|
|
602
|
+
// bold the name right after def/class
|
|
603
|
+
return out.replace(/(<span class="py-k">(?:def|class)<\/span> )([A-Za-z_]\w*)/,'$1<span class="py-f">$2</span>'); }
|
|
584
604
|
function codeBlock(src,hi){ const lines=src.code.replace(/\n$/,'').split('\n');
|
|
585
605
|
return `<div class="code">${lines.map((l,i)=>{ const ln=src.line_start+i, h=hi.has(ln);
|
|
586
|
-
return `<span class="ln ${h?'errline':''}">${ln}</span><span class="cl ${h?'errline':''}">${
|
|
606
|
+
return `<span class="ln ${h?'errline':''}">${ln}</span><span class="cl ${h?'errline':''}">${pyHi(l)||' '}</span>`;
|
|
587
607
|
}).join('')}</div>`; }
|
|
588
608
|
|
|
589
609
|
/* ---------- node pane (tap a node on the graph) ---------- */
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|