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.
Files changed (32) hide show
  1. {windhover-0.8.0 → windhover-0.8.1}/PKG-INFO +1 -1
  2. {windhover-0.8.0 → windhover-0.8.1}/pyproject.toml +1 -1
  3. {windhover-0.8.0 → windhover-0.8.1}/windhover/static/index.html +21 -1
  4. {windhover-0.8.0 → windhover-0.8.1}/.github/workflows/ci.yml +0 -0
  5. {windhover-0.8.0 → windhover-0.8.1}/.gitignore +0 -0
  6. {windhover-0.8.0 → windhover-0.8.1}/LICENSE +0 -0
  7. {windhover-0.8.0 → windhover-0.8.1}/README.md +0 -0
  8. {windhover-0.8.0 → windhover-0.8.1}/SPEC.md +0 -0
  9. {windhover-0.8.0 → windhover-0.8.1}/docs/graph.png +0 -0
  10. {windhover-0.8.0 → windhover-0.8.1}/docs/logo.svg +0 -0
  11. {windhover-0.8.0 → windhover-0.8.1}/docs/runs.png +0 -0
  12. {windhover-0.8.0 → windhover-0.8.1}/docs/social-preview.png +0 -0
  13. {windhover-0.8.0 → windhover-0.8.1}/docs/stats.png +0 -0
  14. {windhover-0.8.0 → windhover-0.8.1}/docs/trace.png +0 -0
  15. {windhover-0.8.0 → windhover-0.8.1}/tests/__init__.py +0 -0
  16. {windhover-0.8.0 → windhover-0.8.1}/tests/test_smoke.py +0 -0
  17. {windhover-0.8.0 → windhover-0.8.1}/windhover/__init__.py +0 -0
  18. {windhover-0.8.0 → windhover-0.8.1}/windhover/config.py +0 -0
  19. {windhover-0.8.0 → windhover-0.8.1}/windhover/demo_graph.py +0 -0
  20. {windhover-0.8.0 → windhover-0.8.1}/windhover/extract.py +0 -0
  21. {windhover-0.8.0 → windhover-0.8.1}/windhover/pricing.json +0 -0
  22. {windhover-0.8.0 → windhover-0.8.1}/windhover/server.py +0 -0
  23. {windhover-0.8.0 → windhover-0.8.1}/windhover/static/icon.svg +0 -0
  24. {windhover-0.8.0 → windhover-0.8.1}/windhover/static/manifest.json +0 -0
  25. {windhover-0.8.0 → windhover-0.8.1}/windhover/static/vendor/cytoscape-dagre.js +0 -0
  26. {windhover-0.8.0 → windhover-0.8.1}/windhover/static/vendor/cytoscape.min.js +0 -0
  27. {windhover-0.8.0 → windhover-0.8.1}/windhover/static/vendor/dagre.min.js +0 -0
  28. {windhover-0.8.0 → windhover-0.8.1}/windhover/static/vendor/fonts/fraunces-500.woff2 +0 -0
  29. {windhover-0.8.0 → windhover-0.8.1}/windhover/static/vendor/fonts/fraunces-600-italic.woff2 +0 -0
  30. {windhover-0.8.0 → windhover-0.8.1}/windhover/static/vendor/fonts/fraunces-600.woff2 +0 -0
  31. {windhover-0.8.0 → windhover-0.8.1}/windhover/store.py +0 -0
  32. {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.0
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.0"
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':''}">${esc(l)||' '}</span>`;
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