From 84b59c65f1a6868d2df9bf0f6318ea7f74c82e4f Mon Sep 17 00:00:00 2001 From: Floki Date: Mon, 29 Jun 2026 13:50:01 +0200 Subject: [PATCH] auto-sync: 2026-06-29_11:50:01 --- vault-graph-api.py | 45 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 vault-graph-api.py diff --git a/vault-graph-api.py b/vault-graph-api.py new file mode 100644 index 0000000..876fb5f --- /dev/null +++ b/vault-graph-api.py @@ -0,0 +1,45 @@ +#!/usr/bin/env python3 +"""Vault Graph API - extracts wikilinks and returns graph data.""" +import json, os, re, sys +from http.server import HTTPServer, BaseHTTPRequestHandler +from urllib.parse import urlparse + +VAULT_DIR = '/opt/jarvis-vault' + +def build_graph(): + files = {} + links = [] + for root, dirs, fnames in os.walk(VAULT_DIR): + for f in fnames: + if not f.endswith('.md'): continue + rel = os.path.relpath(os.path.join(root, f), VAULT_DIR) + path_no_ext = rel[:-3] + files[path_no_ext] = {'id': path_no_ext, 'label': os.path.basename(rel)[:-3], 'path': rel, 'group': rel.split('/')[0] if '/' in rel else 'root'} + with open(os.path.join(root, f)) as fp: + content = fp.read() + # Extract [[wikilinks]] + for m in re.finditer(r'\[\[([^\]]+)\]\]', content): + target = m.group(1).split('|')[0].strip() + if target: + links.append({'source': path_no_ext, 'target': target}) + return {'nodes': list(files.values()), 'links': links} + +class GraphHandler(BaseHTTPRequestHandler): + def _send(self, data): + self.send_response(200) + self.send_header('Content-Type', 'application/json') + self.send_header('Access-Control-Allow-Origin', '*') + self.end_headers() + self.wfile.write(json.dumps(data).encode()) + def do_GET(self): + parsed = urlparse(self.path) + if parsed.path == '/graph': + self._send(build_graph()) + else: + self._send({'error': 'not found'}) + def do_OPTIONS(self): + self._send({}) + +if __name__ == '__main__': + HTTPServer(('0.0.0.0', 8802), GraphHandler).serve_forever() +