graph

CodeGraph: call-graph layer for kosha, backed by graph.db. Augments semantic search with structural traversal.

CodeGraph

def CodeGraph(
    path:str | pathlib.Path=':memory:'
):

Call graph builder and query engine. Uses pyan3 for static analysis and custom AST parsing for dynamic edges. Stores everything in a SQLite database.

cg = CodeGraph(':memory:')
tables = {r[0] for r in cg.db.execute("SELECT name FROM sqlite_master WHERE type='table'")}
assert {'graph_edges','graph_nodes','co_dispatch','file_index'} <= tables, f"Missing tables: {tables}"
print("schema ok:", tables)
schema ok: {'file_index', 'co_dispatch', 'graph_edges', 'pending_attr_calls', 'graph_nodes'}

dyn_edges

def dyn_edges(
    src:str, module:str
)->list:

All dynamic dispatch edges: decorator, connect_body, registration, co_dispatch.

from fastcore.test import test_eq
_src = "from litesearch import *\ndef f(self): self.db.search(q)\ndef g(self): self.st.insert(x)"
_meta = {'m.f': {}, 'm.g': {}}
_hints = _attr_call_hints(sources={'m': _src}, meta=_meta)
test_eq(len(_hints), 2)
test_eq({h['method'] for h in _hints}, {'search','insert'})
assert all('litesearch' in h['pkgs'].split(',') for h in _hints)
# fn not in meta → excluded
test_eq(_attr_call_hints(sources={'m': _src}, meta={}), [])
# depth-1 self.method() and non-self calls → excluded
_src2 = "def f(self): self.direct(); other.thing()"
test_eq(_attr_call_hints(sources={'m2': _src2}, meta={'m2.f':{}}), [])

src="""
def f(self):
    self.db.search(q)
    self.store.insert(x)
    self.direct()        # depth 1 — skip
    other.thing()        # not self — skip
"""
_fn = [n for n in ast.walk(ast.parse(_src)) if isinstance(n, ast.FunctionDef)]
test_eq(_attr_calls(_fn[0]), {'search'})
test_eq(_attr_calls(_fn[1]), {'insert'})
_SRC = '''
import flask
app = flask.Flask(__name__)

@app.route('/hello')
def hello(): pass

def setup(other_app):
    other_app.register(hello)
'''
edges = dyn_edges(_SRC, 'mymod')
kinds = {e['kind'] for e in edges}
assert 'decorator' in kinds, f"Expected decorator edge, got: {edges}"
assert 'registration' in kinds, f"Expected registration edge, got: {edges}"
assert dyn_edges('def (broken', 'bad') == L()
print("_dyn_edges ok:", edges)
_dyn_edges ok: [{'caller': 'mymod.app', 'callee': 'mymod.hello', 'kind': 'decorator', 'confidence': 0.75}, {'caller': 'mymod.setup', 'callee': 'mymod.hello', 'kind': 'connect_body', 'confidence': 0.9}, {'caller': 'mymod.other_app', 'callee': 'mymod.hello', 'kind': 'registration', 'confidence': 0.75}]
_DELEGATES_SRC = '''
from fastcore.all import delegates

def target(x, y, z=1): pass

@delegates(target)
def wrapper_pos(**kw): pass

@delegates(to=target)
def wrapper_kw(**kw): pass

@delegates
def bare(**kw): pass

@delegates()
def empty(**kw): pass
'''
dyn_edges(_DELEGATES_SRC, 'mymod')
[{'caller': 'mymod.wrapper_pos',
  'callee': 'mymod.target',
  'kind': 'delegates',
  'confidence': 0.85},
 {'caller': 'mymod.wrapper_kw',
  'callee': 'mymod.to=target',
  'kind': 'delegates',
  'confidence': 0.85}]
_PATCH_SRC = '''
from fastcore.all import patch, delegates
from apswutils.db import Database, Table, View

@patch
def basic(self:Database, x): pass

@patch(as_prop=True)
def prop(self:Database): pass

@patch(cls_method=True)
def cls_m(cls:Database): pass

@patch
def no_ann(self): pass

@patch
def union_m(self:Table|View): pass
'''
dyn_edges(_PATCH_SRC, 'mymod')
[{'caller': 'mymod.Database',
  'callee': 'mymod.basic',
  'kind': 'patch',
  'confidence': 0.9},
 {'caller': 'mymod.Database',
  'callee': 'mymod.prop',
  'kind': 'patch',
  'confidence': 0.9},
 {'caller': 'mymod.Database',
  'callee': 'mymod.cls_m',
  'kind': 'patch',
  'confidence': 0.9},
 {'caller': 'mymod.Table',
  'callee': 'mymod.union_m',
  'kind': 'patch',
  'confidence': 0.9},
 {'caller': 'mymod.View',
  'callee': 'mymod.union_m',
  'kind': 'patch',
  'confidence': 0.9}]

CodeGraph.resolve_attr_calls

def resolve_attr_calls()->CodeGraph:

Post-sync: resolve pending attr_call hints into edges using populated graph_nodes.


static_edges

def static_edges(
    sources:dict=None, filenames:list=None, root:str=None
)->tuple:

Static call edges via pyan3. Provide either filenames+root or sources dict.

edges, meta = static_edges({"mod": "def foo(): pass\ndef bar(): foo()"})
meta['mod.foo']
{'node': 'mod.foo', 'flavor': 'function', 'file': 'mod'}
assert all(k in edges[0] for k in ('caller','callee','kind','confidence'))
assert all(e['kind'] == 'static' for e in edges)
static_edges({"bad": "def (: !!!"})
pyan3 static analysis failed: invalid syntax (bad, line 1)
([], {})
from textwrap import dedent
_src1 = dedent('''
class Database:
    def query(self): pass
''')
_src2 = dedent('''
from mod1 import Database
def use_db():
    db = Database()
    db.query()
''')
_edges, _ = static_edges({"mod1": _src1, "mod2": _src2})
assert not any(e['callee'].startswith('None.') for e in _edges), \
    f"None namespace callees found: {[e['callee'] for e in _edges if e['callee'].startswith('None.')]}"
print('cross-module callee fix ok:', [e['callee'] for e in _edges])
cross-module callee fix ok: ['mod1.Database.query', 'mod1.Database']
static_edges(filenames=['/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'], root=Path('/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages'))
([{'caller': 'litesearch.core._dtype_suffix',
   'callee': 'litesearch.core._dtype_suffixes',
   'kind': 'static',
   'confidence': 1.0},
  {'caller': 'litesearch.core._slug',
   'callee': 'apswutils.utils.hash_record',
   'kind': 'static',
   'confidence': 1.0},
  {'caller': 'litesearch.core.embed_chunk',
   'callee': 'fastcore.all.L',
   'kind': 'static',
   'confidence': 1.0},
  {'caller': 'litesearch.core.process_content',
   'callee': 'litesearch.core.embed_chunk',
   'kind': 'static',
   'confidence': 1.0},
  {'caller': 'litesearch.core.get_store',
   'callee': 'fastlite.Database',
   'kind': 'static',
   'confidence': 1.0},
  {'caller': 'litesearch.core.get_store',
   'callee': 'fastcore.all.patch',
   'kind': 'static',
   'confidence': 1.0},
  {'caller': 'litesearch.core._register_ann',
   'callee': 'litesearch.core._dtype_suffix',
   'kind': 'static',
   'confidence': 1.0},
  {'caller': 'litesearch.core._register_ann',
   'callee': 'fastlite.Database',
   'kind': 'static',
   'confidence': 1.0},
  {'caller': 'litesearch.core._register_ann',
   'callee': 'fastcore.all.patch',
   'kind': 'static',
   'confidence': 1.0},
  {'caller': 'litesearch.core.ann_indices',
   'callee': 'fastlite.Database',
   'kind': 'static',
   'confidence': 1.0},
  {'caller': 'litesearch.core.ann_indices',
   'callee': 'fastcore.all.patch',
   'kind': 'static',
   'confidence': 1.0},
  {'caller': 'litesearch.core._ann_meta',
   'callee': 'fastlite.Database',
   'kind': 'static',
   'confidence': 1.0},
  {'caller': 'litesearch.core._ann_meta',
   'callee': 'fastcore.all.patch',
   'kind': 'static',
   'confidence': 1.0},
  {'caller': 'litesearch.core._ann_meta',
   'callee': 'fastcore.all.first',
   'kind': 'static',
   'confidence': 1.0},
  {'caller': 'litesearch.core.get_index',
   'callee': 'fastlite.Database',
   'kind': 'static',
   'confidence': 1.0},
  {'caller': 'litesearch.core.get_index',
   'callee': 'litesearch.core._usearch_metric',
   'kind': 'static',
   'confidence': 1.0},
  {'caller': 'litesearch.core.get_index',
   'callee': 'fastcore.all.patch',
   'kind': 'static',
   'confidence': 1.0},
  {'caller': 'litesearch.core.get_index',
   'callee': 'fastcore.all.merge',
   'kind': 'static',
   'confidence': 1.0},
  {'caller': 'litesearch.core.get_index',
   'callee': 'usearch.index.Index',
   'kind': 'static',
   'confidence': 1.0},
  {'caller': 'litesearch.core.get_index',
   'callee': 'fastcore.all.Path',
   'kind': 'static',
   'confidence': 1.0},
  {'caller': 'litesearch.core._save_index',
   'callee': 'fastlite.Database',
   'kind': 'static',
   'confidence': 1.0},
  {'caller': 'litesearch.core._save_index',
   'callee': 'fastcore.all.patch',
   'kind': 'static',
   'confidence': 1.0},
  {'caller': 'litesearch.core.fts_search',
   'callee': 'apswutils.db.Table',
   'kind': 'static',
   'confidence': 1.0},
  {'caller': 'litesearch.core.fts_search',
   'callee': 'fastcore.all.patch',
   'kind': 'static',
   'confidence': 1.0},
  {'caller': 'litesearch.core.fts_search',
   'callee': 'fastcore.all.merge',
   'kind': 'static',
   'confidence': 1.0},
  {'caller': 'litesearch.core.vec_search',
   'callee': 'apswutils.db.Table',
   'kind': 'static',
   'confidence': 1.0},
  {'caller': 'litesearch.core.vec_search',
   'callee': 'fastcore.all.patch',
   'kind': 'static',
   'confidence': 1.0},
  {'caller': 'litesearch.core.vec_search',
   'callee': 'fastcore.all.ifnone',
   'kind': 'static',
   'confidence': 1.0},
  {'caller': 'litesearch.core.vec_search',
   'callee': 'litesearch.core._dtype_suffix',
   'kind': 'static',
   'confidence': 1.0},
  {'caller': 'litesearch.core.ann_search',
   'callee': 'fastcore.all.L',
   'kind': 'static',
   'confidence': 1.0},
  {'caller': 'litesearch.core.ann_search',
   'callee': 'apswutils.db.Table',
   'kind': 'static',
   'confidence': 1.0},
  {'caller': 'litesearch.core.ann_search',
   'callee': 'litesearch.core._in',
   'kind': 'static',
   'confidence': 1.0},
  {'caller': 'litesearch.core.ann_search',
   'callee': 'fastcore.all.patch',
   'kind': 'static',
   'confidence': 1.0},
  {'caller': 'litesearch.core.ann_search',
   'callee': 'litesearch.core._rid',
   'kind': 'static',
   'confidence': 1.0},
  {'caller': 'litesearch.core._idx_remove',
   'callee': 'apswutils.db.Table',
   'kind': 'static',
   'confidence': 1.0},
  {'caller': 'litesearch.core._idx_remove',
   'callee': 'fastcore.all.patch',
   'kind': 'static',
   'confidence': 1.0},
  {'caller': 'litesearch.core._sync_index',
   'callee': 'apswutils.db.Table',
   'kind': 'static',
   'confidence': 1.0},
  {'caller': 'litesearch.core._sync_index',
   'callee': 'litesearch.core._in',
   'kind': 'static',
   'confidence': 1.0},
  {'caller': 'litesearch.core._sync_index',
   'callee': 'fastcore.all.patch',
   'kind': 'static',
   'confidence': 1.0},
  {'caller': 'litesearch.core._sync_index',
   'callee': 'litesearch.core._rid',
   'kind': 'static',
   'confidence': 1.0},
  {'caller': 'litesearch.core._sync_index',
   'callee': 'fastcore.all.L',
   'kind': 'static',
   'confidence': 1.0},
  {'caller': 'litesearch.core.sync',
   'callee': 'fastcore.all.not_',
   'kind': 'static',
   'confidence': 1.0},
  {'caller': 'litesearch.core.sync',
   'callee': 'fastcore.all.in_',
   'kind': 'static',
   'confidence': 1.0},
  {'caller': 'litesearch.core.sync',
   'callee': 'fastcore.all.L',
   'kind': 'static',
   'confidence': 1.0},
  {'caller': 'litesearch.core.sync',
   'callee': 'litesearch.core._slug',
   'kind': 'static',
   'confidence': 1.0},
  {'caller': 'litesearch.core.sync',
   'callee': 'apswutils.db.Table',
   'kind': 'static',
   'confidence': 1.0},
  {'caller': 'litesearch.core.sync',
   'callee': 'litesearch.core.process_content',
   'kind': 'static',
   'confidence': 1.0},
  {'caller': 'litesearch.core.sync',
   'callee': 'fastcore.all.filter_keys',
   'kind': 'static',
   'confidence': 1.0},
  {'caller': 'litesearch.core.sync',
   'callee': 'litesearch.core._np_dtype',
   'kind': 'static',
   'confidence': 1.0},
  {'caller': 'litesearch.core.sync',
   'callee': 'litesearch.core._in',
   'kind': 'static',
   'confidence': 1.0},
  {'caller': 'litesearch.core.sync',
   'callee': 'fastcore.all.patch',
   'kind': 'static',
   'confidence': 1.0},
  {'caller': 'litesearch.core.sync',
   'callee': 'litesearch.core._rid',
   'kind': 'static',
   'confidence': 1.0},
  {'caller': 'litesearch.core.sync.dictcomp.0',
   'callee': 'litesearch.core._slug',
   'kind': 'static',
   'confidence': 1.0},
  {'caller': 'litesearch.core.sync.dictcomp.0',
   'callee': 'fastcore.all.L',
   'kind': 'static',
   'confidence': 1.0},
  {'caller': 'litesearch.core.rebuild_index',
   'callee': 'fastcore.all.L',
   'kind': 'static',
   'confidence': 1.0},
  {'caller': 'litesearch.core.rebuild_index',
   'callee': 'apswutils.db.Table',
   'kind': 'static',
   'confidence': 1.0},
  {'caller': 'litesearch.core.rebuild_index',
   'callee': 'litesearch.core._np_dtype',
   'kind': 'static',
   'confidence': 1.0},
  {'caller': 'litesearch.core.rebuild_index',
   'callee': 'fastcore.all.patch',
   'kind': 'static',
   'confidence': 1.0},
  {'caller': 'litesearch.core.rebuild_index',
   'callee': 'litesearch.core._rid',
   'kind': 'static',
   'confidence': 1.0},
  {'caller': 'litesearch.core.rrf_merge',
   'callee': 'fastcore.all.merge',
   'kind': 'static',
   'confidence': 1.0},
  {'caller': 'litesearch.core.database',
   'callee': 'fastlite.Database',
   'kind': 'static',
   'confidence': 1.0},
  {'caller': 'litesearch.core.database',
   'callee': 'usearch.sqlite_path',
   'kind': 'static',
   'confidence': 1.0},
  {'caller': 'litesearch.core.database',
   'callee': 'fastcore.all.Path',
   'kind': 'static',
   'confidence': 1.0},
  {'caller': 'litesearch.core._get_reranker',
   'callee': 'litesearch.core._RERANKERS',
   'kind': 'static',
   'confidence': 1.0},
  {'caller': 'litesearch.core._get_reranker',
   'callee': 'flashrank.Ranker',
   'kind': 'static',
   'confidence': 1.0},
  {'caller': 'litesearch.core.rerank_hits',
   'callee': 'flashrank.RerankRequest',
   'kind': 'static',
   'confidence': 1.0},
  {'caller': 'litesearch.core.rerank_hits',
   'callee': 'litesearch.core._get_reranker',
   'kind': 'static',
   'confidence': 1.0},
  {'caller': 'litesearch.core.rerank_hits.listcomp.1',
   'callee': 'litesearch.core._get_reranker',
   'kind': 'static',
   'confidence': 1.0},
  {'caller': 'litesearch.core.search',
   'callee': 'litesearch.core.rerank_hits',
   'kind': 'static',
   'confidence': 1.0},
  {'caller': 'litesearch.core.search',
   'callee': 'fastcore.all.L',
   'kind': 'static',
   'confidence': 1.0},
  {'caller': 'litesearch.core.search',
   'callee': 'litesearch.core.rrf_merge',
   'kind': 'static',
   'confidence': 1.0},
  {'caller': 'litesearch.core.search',
   'callee': 'fastlite.Database',
   'kind': 'static',
   'confidence': 1.0},
  {'caller': 'litesearch.core.search',
   'callee': 'fastcore.all.patch',
   'kind': 'static',
   'confidence': 1.0},
  {'caller': 'litesearch.core.search',
   'callee': 'fastcore.all.ifnone',
   'kind': 'static',
   'confidence': 1.0}],
 {'litesearch.core.str': {'node': 'litesearch.core.str',
   'flavor': 'attribute',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core._dtype_suffix.str': {'node': 'litesearch.core._dtype_suffix.str',
   'flavor': 'attribute',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core._in.str': {'node': 'litesearch.core._in.str',
   'flavor': 'attribute',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core._slug.str': {'node': 'litesearch.core._slug.str',
   'flavor': 'attribute',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core.embed_chunk.str': {'node': 'litesearch.core.embed_chunk.str',
   'flavor': 'attribute',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core.embed_chunk.lambda.0.str': {'node': 'litesearch.core.embed_chunk.lambda.0.str',
   'flavor': 'attribute',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core.process_content.str': {'node': 'litesearch.core.process_content.str',
   'flavor': 'attribute',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core.get_store.str': {'node': 'litesearch.core.get_store.str',
   'flavor': 'attribute',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core._register_ann.str': {'node': 'litesearch.core._register_ann.str',
   'flavor': 'attribute',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core.ann_indices.str': {'node': 'litesearch.core.ann_indices.str',
   'flavor': 'attribute',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core._ann_meta.str': {'node': 'litesearch.core._ann_meta.str',
   'flavor': 'attribute',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core.get_index.str': {'node': 'litesearch.core.get_index.str',
   'flavor': 'attribute',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core._save_index.str': {'node': 'litesearch.core._save_index.str',
   'flavor': 'attribute',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core.fts_search.str': {'node': 'litesearch.core.fts_search.str',
   'flavor': 'attribute',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core.vec_search.str': {'node': 'litesearch.core.vec_search.str',
   'flavor': 'attribute',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core.vec_search.listcomp.0.str': {'node': 'litesearch.core.vec_search.listcomp.0.str',
   'flavor': 'attribute',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core._rid.str': {'node': 'litesearch.core._rid.str',
   'flavor': 'attribute',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core.ann_search.str': {'node': 'litesearch.core.ann_search.str',
   'flavor': 'attribute',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core.ann_search.listcomp.0.str': {'node': 'litesearch.core.ann_search.listcomp.0.str',
   'flavor': 'attribute',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core.ann_search.lambda.0.str': {'node': 'litesearch.core.ann_search.lambda.0.str',
   'flavor': 'attribute',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core._idx_remove.str': {'node': 'litesearch.core._idx_remove.str',
   'flavor': 'attribute',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core._sync_index.str': {'node': 'litesearch.core._sync_index.str',
   'flavor': 'attribute',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core._sync_index.lambda.0.str': {'node': 'litesearch.core._sync_index.lambda.0.str',
   'flavor': 'attribute',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core.sync.str': {'node': 'litesearch.core.sync.str',
   'flavor': 'attribute',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core.sync.lambda.0.str': {'node': 'litesearch.core.sync.lambda.0.str',
   'flavor': 'attribute',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core.sync.dictcomp.0.str': {'node': 'litesearch.core.sync.dictcomp.0.str',
   'flavor': 'attribute',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core.rebuild_index.str': {'node': 'litesearch.core.rebuild_index.str',
   'flavor': 'attribute',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core.rebuild_index.lambda.0.str': {'node': 'litesearch.core.rebuild_index.lambda.0.str',
   'flavor': 'attribute',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core.rrf_merge.str': {'node': 'litesearch.core.rrf_merge.str',
   'flavor': 'attribute',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core.rrf_merge.lambda.0.str': {'node': 'litesearch.core.rrf_merge.lambda.0.str',
   'flavor': 'attribute',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core.database.str': {'node': 'litesearch.core.database.str',
   'flavor': 'attribute',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core._get_reranker.str': {'node': 'litesearch.core._get_reranker.str',
   'flavor': 'attribute',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core.rerank_hits.str': {'node': 'litesearch.core.rerank_hits.str',
   'flavor': 'attribute',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core.rerank_hits.listcomp.0.str': {'node': 'litesearch.core.rerank_hits.listcomp.0.str',
   'flavor': 'attribute',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core.rerank_hits.listcomp.1.str': {'node': 'litesearch.core.rerank_hits.listcomp.1.str',
   'flavor': 'attribute',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core.search.str': {'node': 'litesearch.core.search.str',
   'flavor': 'attribute',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core.search.lambda.0.str': {'node': 'litesearch.core.search.lambda.0.str',
   'flavor': 'attribute',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core.__all__': {'node': 'litesearch.core.__all__',
   'flavor': 'name',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'fastcore.all.Path': {'node': 'fastcore.all.Path',
   'flavor': 'importeditem',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'fastcore.all.Generator': {'node': 'fastcore.all.Generator',
   'flavor': 'importeditem',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'fastcore.all.patch': {'node': 'fastcore.all.patch',
   'flavor': 'importeditem',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'fastcore.all.merge': {'node': 'fastcore.all.merge',
   'flavor': 'importeditem',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'fastcore.all.ifnone': {'node': 'fastcore.all.ifnone',
   'flavor': 'importeditem',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'fastcore.all.first': {'node': 'fastcore.all.first',
   'flavor': 'importeditem',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'fastcore.all.L': {'node': 'fastcore.all.L',
   'flavor': 'importeditem',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'fastcore.all.filter_keys': {'node': 'fastcore.all.filter_keys',
   'flavor': 'importeditem',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'fastcore.all.not_': {'node': 'fastcore.all.not_',
   'flavor': 'importeditem',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'fastcore.all.in_': {'node': 'fastcore.all.in_',
   'flavor': 'importeditem',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'fastcore.all.parallel': {'node': 'fastcore.all.parallel',
   'flavor': 'importeditem',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'fastlite.Database': {'node': 'fastlite.Database',
   'flavor': 'importeditem',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'apswutils.db.Table': {'node': 'apswutils.db.Table',
   'flavor': 'importeditem',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'apswutils.utils.cursor_row2dict': {'node': 'apswutils.utils.cursor_row2dict',
   'flavor': 'importeditem',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'apswutils.utils.hash_record': {'node': 'apswutils.utils.hash_record',
   'flavor': 'importeditem',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'numpy.int8': {'node': 'numpy.int8',
   'flavor': 'attribute',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'numpy.float16': {'node': 'numpy.float16',
   'flavor': 'attribute',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'numpy.float64': {'node': 'numpy.float64',
   'flavor': 'attribute',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'numpy.float32': {'node': 'numpy.float32',
   'flavor': 'attribute',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core._dtype_suffixes': {'node': 'litesearch.core._dtype_suffixes',
   'flavor': 'name',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core._dtype_suffix': {'node': 'litesearch.core._dtype_suffix',
   'flavor': 'function',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core._dtype_suffix.^^^argument^^^': {'node': 'litesearch.core._dtype_suffix.^^^argument^^^',
   'flavor': 'unspecified',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core._in.^^^argument^^^': {'node': 'litesearch.core._in.^^^argument^^^',
   'flavor': 'unspecified',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core._slug.^^^argument^^^': {'node': 'litesearch.core._slug.^^^argument^^^',
   'flavor': 'unspecified',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core.embed_chunk.^^^argument^^^': {'node': 'litesearch.core.embed_chunk.^^^argument^^^',
   'flavor': 'unspecified',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core.embed_chunk.lambda.0.^^^argument^^^': {'node': 'litesearch.core.embed_chunk.lambda.0.^^^argument^^^',
   'flavor': 'unspecified',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core.process_content.^^^argument^^^': {'node': 'litesearch.core.process_content.^^^argument^^^',
   'flavor': 'unspecified',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core.get_store.^^^argument^^^': {'node': 'litesearch.core.get_store.^^^argument^^^',
   'flavor': 'unspecified',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core._register_ann.^^^argument^^^': {'node': 'litesearch.core._register_ann.^^^argument^^^',
   'flavor': 'unspecified',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core.ann_indices.^^^argument^^^': {'node': 'litesearch.core.ann_indices.^^^argument^^^',
   'flavor': 'unspecified',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core._ann_meta.^^^argument^^^': {'node': 'litesearch.core._ann_meta.^^^argument^^^',
   'flavor': 'unspecified',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core.get_index.^^^argument^^^': {'node': 'litesearch.core.get_index.^^^argument^^^',
   'flavor': 'unspecified',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core._save_index.^^^argument^^^': {'node': 'litesearch.core._save_index.^^^argument^^^',
   'flavor': 'unspecified',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core.fts_search.^^^argument^^^': {'node': 'litesearch.core.fts_search.^^^argument^^^',
   'flavor': 'unspecified',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core.vec_search.^^^argument^^^': {'node': 'litesearch.core.vec_search.^^^argument^^^',
   'flavor': 'unspecified',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core._rid.^^^argument^^^': {'node': 'litesearch.core._rid.^^^argument^^^',
   'flavor': 'unspecified',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core.ann_search.^^^argument^^^': {'node': 'litesearch.core.ann_search.^^^argument^^^',
   'flavor': 'unspecified',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core.ann_search.lambda.0.^^^argument^^^': {'node': 'litesearch.core.ann_search.lambda.0.^^^argument^^^',
   'flavor': 'unspecified',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core._idx_remove.^^^argument^^^': {'node': 'litesearch.core._idx_remove.^^^argument^^^',
   'flavor': 'unspecified',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core._sync_index.^^^argument^^^': {'node': 'litesearch.core._sync_index.^^^argument^^^',
   'flavor': 'unspecified',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core._sync_index.lambda.0.^^^argument^^^': {'node': 'litesearch.core._sync_index.lambda.0.^^^argument^^^',
   'flavor': 'unspecified',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core.sync.^^^argument^^^': {'node': 'litesearch.core.sync.^^^argument^^^',
   'flavor': 'unspecified',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core.sync.lambda.0.^^^argument^^^': {'node': 'litesearch.core.sync.lambda.0.^^^argument^^^',
   'flavor': 'unspecified',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core.rebuild_index.^^^argument^^^': {'node': 'litesearch.core.rebuild_index.^^^argument^^^',
   'flavor': 'unspecified',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core.rebuild_index.lambda.0.^^^argument^^^': {'node': 'litesearch.core.rebuild_index.lambda.0.^^^argument^^^',
   'flavor': 'unspecified',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core.rrf_merge.^^^argument^^^': {'node': 'litesearch.core.rrf_merge.^^^argument^^^',
   'flavor': 'unspecified',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core.rrf_merge.lambda.0.^^^argument^^^': {'node': 'litesearch.core.rrf_merge.lambda.0.^^^argument^^^',
   'flavor': 'unspecified',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core.database.^^^argument^^^': {'node': 'litesearch.core.database.^^^argument^^^',
   'flavor': 'unspecified',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core._get_reranker.^^^argument^^^': {'node': 'litesearch.core._get_reranker.^^^argument^^^',
   'flavor': 'unspecified',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core.rerank_hits.^^^argument^^^': {'node': 'litesearch.core.rerank_hits.^^^argument^^^',
   'flavor': 'unspecified',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core.search.^^^argument^^^': {'node': 'litesearch.core.search.^^^argument^^^',
   'flavor': 'unspecified',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core.search.lambda.0.^^^argument^^^': {'node': 'litesearch.core.search.lambda.0.^^^argument^^^',
   'flavor': 'unspecified',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core.search.lambda.1.^^^argument^^^': {'node': 'litesearch.core.search.lambda.1.^^^argument^^^',
   'flavor': 'unspecified',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core.search.lambda.2.^^^argument^^^': {'node': 'litesearch.core.search.lambda.2.^^^argument^^^',
   'flavor': 'unspecified',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core._usearch_metric': {'node': 'litesearch.core._usearch_metric',
   'flavor': 'name',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core._np_dtype': {'node': 'litesearch.core._np_dtype',
   'flavor': 'name',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core._in': {'node': 'litesearch.core._in',
   'flavor': 'function',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'str.join': {'node': 'str.join',
   'flavor': 'attribute',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core._slug': {'node': 'litesearch.core._slug',
   'flavor': 'function',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core._slug.NoneType': {'node': 'litesearch.core._slug.NoneType',
   'flavor': 'attribute',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core.NoneType': {'node': 'litesearch.core.NoneType',
   'flavor': 'attribute',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core._register_ann.NoneType': {'node': 'litesearch.core._register_ann.NoneType',
   'flavor': 'attribute',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core._ann_meta.NoneType': {'node': 'litesearch.core._ann_meta.NoneType',
   'flavor': 'attribute',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core.fts_search.NoneType': {'node': 'litesearch.core.fts_search.NoneType',
   'flavor': 'attribute',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core.vec_search.NoneType': {'node': 'litesearch.core.vec_search.NoneType',
   'flavor': 'attribute',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core.sync.setcomp.0.NoneType': {'node': 'litesearch.core.sync.setcomp.0.NoneType',
   'flavor': 'attribute',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core.rebuild_index.NoneType': {'node': 'litesearch.core.rebuild_index.NoneType',
   'flavor': 'attribute',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core.search.NoneType': {'node': 'litesearch.core.search.NoneType',
   'flavor': 'attribute',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core.embed_chunk': {'node': 'litesearch.core.embed_chunk',
   'flavor': 'function',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core.embed_chunk.lambda.0': {'node': 'litesearch.core.embed_chunk.lambda.0',
   'flavor': 'scope',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core.ann_search.lambda.0': {'node': 'litesearch.core.ann_search.lambda.0',
   'flavor': 'scope',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core._sync_index.lambda.0': {'node': 'litesearch.core._sync_index.lambda.0',
   'flavor': 'scope',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core.sync.lambda.0': {'node': 'litesearch.core.sync.lambda.0',
   'flavor': 'scope',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core.rebuild_index.lambda.0': {'node': 'litesearch.core.rebuild_index.lambda.0',
   'flavor': 'scope',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core.rrf_merge.lambda.0': {'node': 'litesearch.core.rrf_merge.lambda.0',
   'flavor': 'scope',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core.search.lambda.0': {'node': 'litesearch.core.search.lambda.0',
   'flavor': 'scope',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core.embed_chunk.lambda.0.^^^argument^^^.get': {'node': 'litesearch.core.embed_chunk.lambda.0.^^^argument^^^.get',
   'flavor': 'attribute',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core.sync.lambda.0.^^^argument^^^.get': {'node': 'litesearch.core.sync.lambda.0.^^^argument^^^.get',
   'flavor': 'attribute',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'fastcore.all.L.get': {'node': 'fastcore.all.L.get',
   'flavor': 'attribute',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'fastcore.all.L.itemgot': {'node': 'fastcore.all.L.itemgot',
   'flavor': 'attribute',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  '*.zip.__iter__': {'node': '*.zip.__iter__',
   'flavor': 'method',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core.get_index.str.__iter__': {'node': 'litesearch.core.get_index.str.__iter__',
   'flavor': 'method',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core.NoneType.__iter__': {'node': 'litesearch.core.NoneType.__iter__',
   'flavor': 'method',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core.ann_search.^^^argument^^^.db.__iter__': {'node': 'litesearch.core.ann_search.^^^argument^^^.db.__iter__',
   'flavor': 'method',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core._idx_remove.^^^argument^^^.__iter__': {'node': 'litesearch.core._idx_remove.^^^argument^^^.__iter__',
   'flavor': 'method',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'fastcore.all.L.__iter__': {'node': 'fastcore.all.L.__iter__',
   'flavor': 'method',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'fastcore.all.L.itemgot.__iter__': {'node': 'fastcore.all.L.itemgot.__iter__',
   'flavor': 'method',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  '*.enumerate.__iter__': {'node': '*.enumerate.__iter__',
   'flavor': 'method',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core._get_reranker.__iter__': {'node': 'litesearch.core._get_reranker.__iter__',
   'flavor': 'method',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  '*.zip.__next__': {'node': '*.zip.__next__',
   'flavor': 'method',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core.get_index.str.__next__': {'node': 'litesearch.core.get_index.str.__next__',
   'flavor': 'method',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core.NoneType.__next__': {'node': 'litesearch.core.NoneType.__next__',
   'flavor': 'method',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core.ann_search.^^^argument^^^.db.__next__': {'node': 'litesearch.core.ann_search.^^^argument^^^.db.__next__',
   'flavor': 'method',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core._idx_remove.^^^argument^^^.__next__': {'node': 'litesearch.core._idx_remove.^^^argument^^^.__next__',
   'flavor': 'method',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'fastcore.all.L.__next__': {'node': 'fastcore.all.L.__next__',
   'flavor': 'method',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'fastcore.all.L.itemgot.__next__': {'node': 'fastcore.all.L.itemgot.__next__',
   'flavor': 'method',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  '*.enumerate.__next__': {'node': '*.enumerate.__next__',
   'flavor': 'method',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core._get_reranker.__next__': {'node': 'litesearch.core._get_reranker.__next__',
   'flavor': 'method',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'numpy.asarray': {'node': 'numpy.asarray',
   'flavor': 'attribute',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core.process_content': {'node': 'litesearch.core.process_content',
   'flavor': 'function',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core.bool': {'node': 'litesearch.core.bool',
   'flavor': 'attribute',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core.process_content.bool': {'node': 'litesearch.core.process_content.bool',
   'flavor': 'attribute',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core.get_store.bool': {'node': 'litesearch.core.get_store.bool',
   'flavor': 'attribute',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core._register_ann.bool': {'node': 'litesearch.core._register_ann.bool',
   'flavor': 'attribute',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core.rebuild_index.bool': {'node': 'litesearch.core.rebuild_index.bool',
   'flavor': 'attribute',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core.rrf_merge.bool': {'node': 'litesearch.core.rrf_merge.bool',
   'flavor': 'attribute',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core.database.bool': {'node': 'litesearch.core.database.bool',
   'flavor': 'attribute',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core.search.bool': {'node': 'litesearch.core.search.bool',
   'flavor': 'attribute',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core.process_content.^^^argument^^^.insert_all': {'node': 'litesearch.core.process_content.^^^argument^^^.insert_all',
   'flavor': 'attribute',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core.get_store': {'node': 'litesearch.core.get_store',
   'flavor': 'function',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core.int': {'node': 'litesearch.core.int',
   'flavor': 'attribute',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core.vec_search.int': {'node': 'litesearch.core.vec_search.int',
   'flavor': 'attribute',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core.ann_search.int': {'node': 'litesearch.core.ann_search.int',
   'flavor': 'attribute',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core._sync_index.int': {'node': 'litesearch.core._sync_index.int',
   'flavor': 'attribute',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core.rebuild_index.int': {'node': 'litesearch.core.rebuild_index.int',
   'flavor': 'attribute',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core.search.int': {'node': 'litesearch.core.search.int',
   'flavor': 'attribute',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core.ann_search.lambda.0.float': {'node': 'litesearch.core.ann_search.lambda.0.float',
   'flavor': 'attribute',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core.rrf_merge.float': {'node': 'litesearch.core.rrf_merge.float',
   'flavor': 'attribute',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core.get_store.^^^argument^^^.t': {'node': 'litesearch.core.get_store.^^^argument^^^.t',
   'flavor': 'attribute',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core._register_ann.^^^argument^^^.t': {'node': 'litesearch.core._register_ann.^^^argument^^^.t',
   'flavor': 'attribute',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core._ann_meta.^^^argument^^^.t': {'node': 'litesearch.core._ann_meta.^^^argument^^^.t',
   'flavor': 'attribute',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core.search.^^^argument^^^.t': {'node': 'litesearch.core.search.^^^argument^^^.t',
   'flavor': 'attribute',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core.get_store.^^^argument^^^._register_ann': {'node': 'litesearch.core.get_store.^^^argument^^^._register_ann',
   'flavor': 'attribute',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core._register_ann': {'node': 'litesearch.core._register_ann',
   'flavor': 'function',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core._register_ann.^^^argument^^^.conn': {'node': 'litesearch.core._register_ann.^^^argument^^^.conn',
   'flavor': 'attribute',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'fastlite.Database.conn': {'node': 'fastlite.Database.conn',
   'flavor': 'attribute',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core.ann_indices': {'node': 'litesearch.core.ann_indices',
   'flavor': 'function',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core.get_index.^^^argument^^^.ann_indices': {'node': 'litesearch.core.get_index.^^^argument^^^.ann_indices',
   'flavor': 'attribute',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core._save_index.^^^argument^^^.ann_indices': {'node': 'litesearch.core._save_index.^^^argument^^^.ann_indices',
   'flavor': 'attribute',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core.ann_indices.^^^argument^^^._ann_indices': {'node': 'litesearch.core.ann_indices.^^^argument^^^._ann_indices',
   'flavor': 'attribute',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core._ann_meta': {'node': 'litesearch.core._ann_meta',
   'flavor': 'function',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core.get_index.^^^argument^^^._ann_meta': {'node': 'litesearch.core.get_index.^^^argument^^^._ann_meta',
   'flavor': 'attribute',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core._save_index.^^^argument^^^._ann_meta': {'node': 'litesearch.core._save_index.^^^argument^^^._ann_meta',
   'flavor': 'attribute',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core.get_index': {'node': 'litesearch.core.get_index',
   'flavor': 'function',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'usearch.index.Index': {'node': 'usearch.index.Index',
   'flavor': 'importeditem',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core.get_index.dictcomp.0': {'node': 'litesearch.core.get_index.dictcomp.0',
   'flavor': 'scope',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core.sync.dictcomp.0': {'node': 'litesearch.core.sync.dictcomp.0',
   'flavor': 'scope',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'usearch.index.Index.load': {'node': 'usearch.index.Index.load',
   'flavor': 'attribute',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core._save_index': {'node': 'litesearch.core._save_index',
   'flavor': 'function',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core.fts_search': {'node': 'litesearch.core.fts_search',
   'flavor': 'function',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core.fts_search.^^^argument^^^.db': {'node': 'litesearch.core.fts_search.^^^argument^^^.db',
   'flavor': 'attribute',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core.vec_search.^^^argument^^^.db': {'node': 'litesearch.core.vec_search.^^^argument^^^.db',
   'flavor': 'attribute',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core.ann_search.^^^argument^^^.db': {'node': 'litesearch.core.ann_search.^^^argument^^^.db',
   'flavor': 'attribute',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core._sync_index.^^^argument^^^.db': {'node': 'litesearch.core._sync_index.^^^argument^^^.db',
   'flavor': 'attribute',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core.sync.^^^argument^^^.db': {'node': 'litesearch.core.sync.^^^argument^^^.db',
   'flavor': 'attribute',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core.rebuild_index.^^^argument^^^.db': {'node': 'litesearch.core.rebuild_index.^^^argument^^^.db',
   'flavor': 'attribute',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core.fts_search.^^^argument^^^.search_sql': {'node': 'litesearch.core.fts_search.^^^argument^^^.search_sql',
   'flavor': 'attribute',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core.vec_search': {'node': 'litesearch.core.vec_search',
   'flavor': 'function',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core.vec_search.listcomp.0': {'node': 'litesearch.core.vec_search.listcomp.0',
   'flavor': 'scope',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core.ann_search.listcomp.0': {'node': 'litesearch.core.ann_search.listcomp.0',
   'flavor': 'scope',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core._idx_remove.listcomp.0': {'node': 'litesearch.core._idx_remove.listcomp.0',
   'flavor': 'scope',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core._sync_index.listcomp.0': {'node': 'litesearch.core._sync_index.listcomp.0',
   'flavor': 'scope',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core.rebuild_index.listcomp.0': {'node': 'litesearch.core.rebuild_index.listcomp.0',
   'flavor': 'scope',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core.rerank_hits.listcomp.0': {'node': 'litesearch.core.rerank_hits.listcomp.0',
   'flavor': 'scope',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core.vec_search.^^^argument^^^.name': {'node': 'litesearch.core.vec_search.^^^argument^^^.name',
   'flavor': 'attribute',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core.ann_search.^^^argument^^^.name': {'node': 'litesearch.core.ann_search.^^^argument^^^.name',
   'flavor': 'attribute',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core._sync_index.^^^argument^^^.name': {'node': 'litesearch.core._sync_index.^^^argument^^^.name',
   'flavor': 'attribute',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core.sync.^^^argument^^^.name': {'node': 'litesearch.core.sync.^^^argument^^^.name',
   'flavor': 'attribute',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core.rebuild_index.^^^argument^^^.name': {'node': 'litesearch.core.rebuild_index.^^^argument^^^.name',
   'flavor': 'attribute',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core._rid': {'node': 'litesearch.core._rid',
   'flavor': 'function',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core.ann_search': {'node': 'litesearch.core.ann_search',
   'flavor': 'function',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core.ann_search.^^^argument^^^.db.size': {'node': 'litesearch.core.ann_search.^^^argument^^^.db.size',
   'flavor': 'attribute',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core.rebuild_index.^^^argument^^^.db.size': {'node': 'litesearch.core.rebuild_index.^^^argument^^^.db.size',
   'flavor': 'attribute',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'numpy.frombuffer': {'node': 'numpy.frombuffer',
   'flavor': 'attribute',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core.ann_search.^^^argument^^^.db.search': {'node': 'litesearch.core.ann_search.^^^argument^^^.db.search',
   'flavor': 'attribute',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core.search': {'node': 'litesearch.core.search',
   'flavor': 'function',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core.ann_search.^^^argument^^^.db.search.keys': {'node': 'litesearch.core.ann_search.^^^argument^^^.db.search.keys',
   'flavor': 'attribute',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core.sync.dictcomp.0.keys': {'node': 'litesearch.core.sync.dictcomp.0.keys',
   'flavor': 'attribute',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'numpy.atleast_1d': {'node': 'numpy.atleast_1d',
   'flavor': 'attribute',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core.ann_search.^^^argument^^^.db.search.distances': {'node': 'litesearch.core.ann_search.^^^argument^^^.db.search.distances',
   'flavor': 'attribute',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core._idx_remove': {'node': 'litesearch.core._idx_remove',
   'flavor': 'function',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core._sync_index.^^^argument^^^._idx_remove': {'node': 'litesearch.core._sync_index.^^^argument^^^._idx_remove',
   'flavor': 'attribute',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core._idx_remove.^^^argument^^^.contains': {'node': 'litesearch.core._idx_remove.^^^argument^^^.contains',
   'flavor': 'attribute',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'numpy.int64': {'node': 'numpy.int64',
   'flavor': 'attribute',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'numpy.array': {'node': 'numpy.array',
   'flavor': 'attribute',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core._idx_remove.^^^argument^^^.remove': {'node': 'litesearch.core._idx_remove.^^^argument^^^.remove',
   'flavor': 'attribute',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core._sync_index': {'node': 'litesearch.core._sync_index',
   'flavor': 'function',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core.sync.^^^argument^^^._sync_index': {'node': 'litesearch.core.sync.^^^argument^^^._sync_index',
   'flavor': 'attribute',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'numpy.stack': {'node': 'numpy.stack',
   'flavor': 'attribute',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core._sync_index.^^^argument^^^.db.add': {'node': 'litesearch.core._sync_index.^^^argument^^^.db.add',
   'flavor': 'attribute',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core.rebuild_index.^^^argument^^^.db.add': {'node': 'litesearch.core.rebuild_index.^^^argument^^^.db.add',
   'flavor': 'attribute',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core.sync': {'node': 'litesearch.core.sync',
   'flavor': 'function',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core.sync.setcomp.0': {'node': 'litesearch.core.sync.setcomp.0',
   'flavor': 'scope',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core.sync.^^^argument^^^.delete_where': {'node': 'litesearch.core.sync.^^^argument^^^.delete_where',
   'flavor': 'attribute',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'fastcore.all.filter_keys.values': {'node': 'fastcore.all.filter_keys.values',
   'flavor': 'attribute',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core.rebuild_index': {'node': 'litesearch.core.rebuild_index',
   'flavor': 'function',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core.rebuild_index.^^^argument^^^.db.reset': {'node': 'litesearch.core.rebuild_index.^^^argument^^^.db.reset',
   'flavor': 'attribute',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core.rrf_merge': {'node': 'litesearch.core.rrf_merge',
   'flavor': 'function',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core.database': {'node': 'litesearch.core.database',
   'flavor': 'function',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'fastlite.Database.enable_wal': {'node': 'fastlite.Database.enable_wal',
   'flavor': 'attribute',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'usearch.sqlite_path': {'node': 'usearch.sqlite_path',
   'flavor': 'importeditem',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core._RERANKERS': {'node': 'litesearch.core._RERANKERS',
   'flavor': 'name',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core._get_reranker': {'node': 'litesearch.core._get_reranker',
   'flavor': 'function',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'flashrank.Ranker': {'node': 'flashrank.Ranker',
   'flavor': 'importeditem',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core.rerank_hits': {'node': 'litesearch.core.rerank_hits',
   'flavor': 'function',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'flashrank.RerankRequest': {'node': 'flashrank.RerankRequest',
   'flavor': 'importeditem',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core.rerank_hits.listcomp.1': {'node': 'litesearch.core.rerank_hits.listcomp.1',
   'flavor': 'scope',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core.search.^^^argument^^^.strip': {'node': 'litesearch.core.search.^^^argument^^^.strip',
   'flavor': 'attribute',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core.search.lambda.1': {'node': 'litesearch.core.search.lambda.1',
   'flavor': 'scope',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'},
  'litesearch.core.search.lambda.2': {'node': 'litesearch.core.search.lambda.2',
   'flavor': 'scope',
   'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py'}})

CodeGraph.from_sources

def from_sources(
    sources:dict, chunk_size:int=50
):

Build from {module_name: source_str}.

cg.db['graph_edges'].insert_all([
    {'caller':'A','callee':'B','kind':'static','confidence':1.0},
    {'caller':'B','callee':'C','kind':'static','confidence':1.0},
    {'caller':'A','callee':'C','kind':'static','confidence':1.0},
])
pr = _pagerank(cg.db)
print(pr)
assert 'C' in pr, "C should be in pagerank"
assert pr['C'] > pr['A'], f"C (most linked-to) should rank higher than A: {pr}"
print("pagerank ok:", pr)
{'A': 0.05000000000000001, 'B': 0.07125000000000001, 'C': 0.13181250000000003}
pagerank ok: {'A': 0.05000000000000001, 'B': 0.07125000000000001, 'C': 0.13181250000000003}
CodeGraph(':memory:').from_sources({'mod': 'def foo(): pass\ndef bar(): foo()\n'}).db.t.graph_nodes()
[{'node': 'mod.foo',
  'flavor': 'function',
  'file': 'mod',
  'pagerank': 0.06938,
  'in_degree': 1,
  'out_degree': 0},
 {'node': 'mod.foo.^^^argument^^^',
  'flavor': 'unspecified',
  'file': 'mod',
  'pagerank': 0.0375,
  'in_degree': 0,
  'out_degree': 0},
 {'node': 'mod.bar.^^^argument^^^',
  'flavor': 'unspecified',
  'file': 'mod',
  'pagerank': 0.0375,
  'in_degree': 0,
  'out_degree': 0},
 {'node': 'mod.bar',
  'flavor': 'function',
  'file': 'mod',
  'pagerank': 0.0375,
  'in_degree': 0,
  'out_degree': 1}]
_src = '''
import functools
from fastcore.all import bind

fasthtml_app = partial(create_app, debug=True)
wrapped     = functools.partial(handler, extra=1)
bound_fn    = bind(base_fn, 42)
plain       = lambda x: x + 1
not_a_fn    = {'key': 'value'}
'''
_nod = _lambda_nodes(sources={'mymod': _src})
assert 'mymod.fasthtml_app' in _nod, f'partial() not indexed: {list(_nod)}'
assert 'mymod.wrapped' in _nod, 'functools.partial() not indexed'
assert 'mymod.bound_fn' in _nod, 'bind() not indexed'
assert 'mymod.plain' in _nod, 'lambda still indexed'
assert 'mymod.not_a_fn' not in _nod, 'dict wrongly indexed'
assert all(v['flavor'] == 'function' for v in _nod.values())
print('_lambda_nodes partial/bind: all assertions pass')
_lambda_nodes partial/bind: all assertions pass

CodeGraph.from_pkg

def from_pkg(
    pkg:str, path:pathlib.Path | str='.', recursive:bool=True, maxdepth:int=None, symlinks:bool=True,
    file_glob:str=None, file_re:str=None, folder_re:str=None, skip_file_glob:str=None, skip_file_re:str=None,
    skip_folder_re:str=None, func:callable=walk_join, ret_folders:bool=False, sort:bool=True, types:str | list=None,
    exts:str | list=None
)->CodeGraph:

Build from an installed package. Uses pyan3 on the package source files.


CodeGraph.from_dir

def from_dir(
    dir:str | pathlib.Path, path:pathlib.Path | str='.', recursive:bool=True, maxdepth:int=None, symlinks:bool=True,
    file_glob:str=None, file_re:str=None, folder_re:str=None, skip_file_glob:str=None, skip_file_re:str=None,
    skip_folder_re:str=None, func:callable=walk_join, ret_folders:bool=False, sort:bool=True, types:str | list=None,
    exts:str | list=None
)->CodeGraph:

Build from .py files under path — pyan reads files directly.


CodeGraph.process_files

def process_files(
    files, # list of .py file paths to analyse
    root:NoneType=None, # package root; auto-detected via __init__.py walk if None
    sz:int=50, # max files per pyan3 pass; reduce for very large packages
)->CodeGraph:

Build call-graph edges for the given source files and recompute centrality.

_g = CodeGraph(':memory:')
_g.gn.insert({'node':'litesearch.core.search','flavor':'function','file':'','pagerank':0.,'in_degree':0,'out_degree':0})
_g.pa.insert({'caller':'mymod.env_context','method':'search','pkgs':'litesearch'})
_g.resolve_attr_calls()
_edges = list(_g.ge(where="kind='attr_call'"))
test_eq(len(_edges), 1)
test_eq(_edges[0]['caller'], 'mymod.env_context')
test_eq(_edges[0]['callee'], 'litesearch.core.search')
test_eq(_edges[0]['confidence'], 0.7)
# idempotent
_g.resolve_attr_calls()
test_eq(len(list(_g.ge(where="kind='attr_call'"))), 1)
_g.ge(where="kind='attr_call'")
[{'caller': 'mymod.env_context',
  'callee': 'litesearch.core.search',
  'kind': 'attr_call',
  'confidence': 0.7}]
_g2 = CodeGraph(':memory:')
_g2.gn.insert_all([{'node':'p1.mod.search','flavor':'function','file':'','pagerank':0.,'in_degree':0,'out_degree':0},
                   {'node':'p2.mod.search','flavor':'function','file':'','pagerank':0.,'in_degree':0,'out_degree':0}])
_g2.pa.insert({'caller':'mymod.f','method':'search','pkgs':'p1,p2'})
_g2.resolve_attr_calls()
test_eq(len(_g2.ge()), 1)
_g3 = CodeGraph(':memory:')
_g3.gn.insert({'node':'other.core.search','flavor':'function','file':'','pagerank':0.,'in_degree':0,'out_degree':0})
_g3.pa.insert({'caller':'mymod.f','method':'search','pkgs':'litesearch'})
_g3.resolve_attr_calls()
test_eq(len(list(_g3.ge())), 0)
cg=CodeGraph(':memory:')
cg.from_pkg('litesearch').from_pkg('fastlite').from_pkg('apswutils').from_pkg('fastcore')
<__main__.CodeGraph>
# eval: false
cg.from_pkg('protobuf')
<__main__.CodeGraph>
cg.gn(select='*', where='node like "%get_store%"')
[{'node': 'litesearch.core.get_store.str',
  'flavor': 'attribute',
  'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py',
  'pagerank': 0.00015,
  'in_degree': 0,
  'out_degree': 0},
 {'node': 'litesearch.core.get_store.^^^argument^^^',
  'flavor': 'unspecified',
  'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py',
  'pagerank': 0.00015,
  'in_degree': 0,
  'out_degree': 0},
 {'node': 'litesearch.core.get_store.bool',
  'flavor': 'attribute',
  'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py',
  'pagerank': 0.00015,
  'in_degree': 0,
  'out_degree': 0},
 {'node': 'litesearch.core.get_store',
  'flavor': 'function',
  'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py',
  'pagerank': 0.00017,
  'in_degree': 1,
  'out_degree': 3},
 {'node': 'litesearch.core.get_store.^^^argument^^^.t',
  'flavor': 'attribute',
  'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py',
  'pagerank': 0.00015,
  'in_degree': 0,
  'out_degree': 0},
 {'node': 'litesearch.core.get_store.^^^argument^^^._register_ann',
  'flavor': 'attribute',
  'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py',
  'pagerank': 0.00015,
  'in_degree': 0,
  'out_degree': 0}]
cg.from_dir('../kosha')
<__main__.CodeGraph>
cg.db.t.graph_nodes.count
14165
cg.gn('node like "%emb_doc%"')
[{'node': 'kosha.core.process_env.^^^argument^^^.emb_doc',
  'flavor': 'attribute',
  'file': '../kosha/core.py',
  'pagerank': 9e-05,
  'in_degree': 0,
  'out_degree': 0},
 {'node': 'kosha.core.update_pkg.^^^argument^^^.emb_doc',
  'flavor': 'attribute',
  'file': '../kosha/core.py',
  'pagerank': 9e-05,
  'in_degree': 0,
  'out_degree': 0},
 {'node': 'kosha.core.process_repo.^^^argument^^^.emb_doc',
  'flavor': 'attribute',
  'file': '../kosha/core.py',
  'pagerank': 9e-05,
  'in_degree': 0,
  'out_degree': 0},
 {'node': 'kosha.core.update_repo.^^^argument^^^.emb_doc',
  'flavor': 'attribute',
  'file': '../kosha/core.py',
  'pagerank': 9e-05,
  'in_degree': 0,
  'out_degree': 0}]

CodeGraph.node_info

def node_info(
    node:str, # fully-qualified node name
    with_kind:bool=False, # include edge kind in callers/callees tuples
)->dict:

Full node record: graph_nodes row merged with callers, callees, and co-dispatch peers.


CodeGraph.edge_kinds

def edge_kinds()->dict:

Count of each edge kind in the graph (static, decorator, patch, registration, etc.).


CodeGraph.short_paths

def short_paths(
    nodes, # iterable of fully-qualified node names
    k:int=10, # consider only the first k nodes
)->L:

Shortest paths between all pairs in top-k nodes — one BFS per source node.


CodeGraph.short_path

def short_path(
    src:str, # fully-qualified source node name
    tgt:str, # fully-qualified target node name
)->L:

Shortest path from src to tgt via BFS. Returns L of node names or empty L.


CodeGraph.ranked

def ranked(
    k:int=10, # number of top nodes to return
    module:str=None, # optional module prefix filter (e.g. 'fastcore.basics')
)->L:

Top-k nodes by pagerank, optionally filtered to a module prefix.


CodeGraph.co_dispatched

def co_dispatched(
    node:str, # fully-qualified node name
)->L:

Nodes registered in the same dispatch group as node (route list, handler table, etc.).


CodeGraph.neighbors

def neighbors(
    n:str, # fully-qualified node name
    depth:int=1, # number of hops to expand
)->L:

callers + callees up to depth hops.


CodeGraph.callees

def callees(
    n:str, # fully-qualified node name
    with_kind:bool=False, # if True, return (callee, edge_kind) tuples instead of plain names
)->L:

All nodes called by n, optionally with edge kind.


CodeGraph.callers

def callers(
    n:str, # fully-qualified node name (e.g. 'mymod.foo')
    with_kind:bool=False, # if True, return (caller, edge_kind) tuples instead of plain names
)->L:

All nodes that call n, optionally with edge kind.


CodeGraph.node_infos

def node_infos(
    nodes, # iterable of fully-qualified node names
    with_kind:bool=False, # include edge kind in callers/callees tuples
)->dict:

Batched node_info: {node: graph_nodes row + callers, callees, co_dispatched}. One IN-query per relation instead of per-node.

from fastcore.test import test_eq
# node_infos (batched) must match node_info (per-node) exactly
_tg = CodeGraph(':memory:').from_sources({'m': 'def a(): b()\ndef b(): c()\ndef c(): pass\n'})
_ns = L(_tg.gn(select='node')).attrgot('node')
_bat = _tg.node_infos(_ns)
for n in _ns:
    _si = _tg.node_info(n)
    test_eq(set(_bat[n]['callers']), set(_si['callers']))
    test_eq(set(_bat[n]['callees']), set(_si['callees']))
    test_eq(set(_bat[n]['co_dispatched']), set(_si['co_dispatched']))
test_eq(_tg.node_infos([]), {})
print('node_infos == node_info OK')
█

 |----------------------------------------| 0.00% [0/1 00:00<?]
 |████████████████████████████████████████| 100.00% [1/1 00:00<00:00]
                                                                     
node_infos == node_info OK
cg.db.t.graph_edges(where='caller like "%apswutils.db.Table.insert_all%" and callee like "%insert_chunk%"')
[{'caller': 'apswutils.db.Table.insert_all',
  'callee': 'apswutils.db.Table.insert_chunk',
  'kind': 'static',
  'confidence': 1.0}]
to_date_co = cg.co_dispatched('fastcore.basics.to_date')
assert all('fastcore' in n for n in to_date_co), \
    f"fastcore.basics.to_date co_dispatched leaked into httpx: {to_date_co}"
assert len(to_date_co) > 0, "fastcore.basics.to_date should have co_dispatched peers"
print("co_dispatched cross-package isolation ok:", to_date_co)
co_dispatched cross-package isolation ok: ['fastcore.basics.to_bool', 'fastcore.basics.to_int', 'fastcore.basics.to_float']
cg.node_info('fastcore.basics.to_date')
{'node': 'fastcore.basics.to_date',
 'flavor': 'function',
 'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/fastcore/basics.py',
 'pagerank': 3e-05,
 'in_degree': 0,
 'out_degree': 2,
 'callers': [],
 'callees': ['fastcore.basics._typeerr', 'fastcore.basics.str2date'],
 'co_dispatched': ['fastcore.basics.to_bool', 'fastcore.basics.to_int', 'fastcore.basics.to_float']}
n = cg.db.t.graph_nodes(where='node like "%core.env_context"')[0]['node']
cg.node_info(n)
{'node': 'kosha.core.env_context',
 'flavor': 'function',
 'file': '../kosha/core.py',
 'pagerank': 0.00469,
 'in_degree': 2,
 'out_degree': 7,
 'callers': ['kosha.cli', 'kosha.core.Kosha'],
 'callees': ['fastcore.all.L', 'fastcore.all.patch', 'fastcore.all.true', 'kosha.core.Kosha', 'kosha.core.filt2wh', 'kosha.core.parseq', 'litesearch.core.ann_search.^^^argument^^^.db.search'],
 'co_dispatched': []}
cg.short_path('kosha.graph.context', 'litesearch.core.search')
[]
path = cg.short_path('apswutils.db.Table.upsert', 'apswutils.db.Table.insert_chunk')
assert path[0] == 'apswutils.db.Table.upsert', f"wrong start: {path}"
assert path[-1] == 'apswutils.db.Table.insert_chunk', f"wrong end: {path}"
assert len(path) >= 2, f"path too short: {path}"
assert cg.short_path('apswutils.db.Table.upsert', 'apswutils.db.Table.upsert') == L(['apswutils.db.Table.upsert']), "src==tgt should return [src]"
assert cg.short_path('apswutils.db.Table.upsert', 'no.such.node') == L(), "missing tgt should return empty"
print("short_path ok:", path)
short_path ok: ['apswutils.db.Table.upsert', 'apswutils.db.Table.upsert_all', 'apswutils.db.Table.insert_all', 'apswutils.db.Table.insert_chunk']
cg.ranked(5, module='litesearch')
[{'node': 'litesearch.core._register_ann', 'pagerank': 0.01364}, {'node': 'litesearch.core.fts_search', 'pagerank': 0.01364}, {'node': 'litesearch.core.vec_search', 'pagerank': 0.01364}, {'node': 'litesearch.core.ann_search', 'pagerank': 0.01364}, {'node': 'litesearch.core._sync_index', 'pagerank': 0.01364}]
cg.callers('litesearch.data.kw')
['litesearch.core.embed_chunk', 'litesearch.core.process_content', 'litesearch.core.get_store', 'litesearch.core.database', 'litesearch.data.pdf_markdown', 'litesearch.data.pdf_markdown.lambda.0', 'litesearch.data.ocr_parse', 'litesearch.data.pkg2chunks', 'litesearch.data.pre', 'litesearch.utils.FastEncode.encode', 'litesearch.utils.FastEncode.encode.lambda.0', 'litesearch.utils.FastEncode.encode_document', 'litesearch.utils.FastEncode.encode_query', 'litesearch.utils.AutoLateChunkFastEncode.encode_auto', 'litesearch.utils.doc_encoder._', 'litesearch.utils.query_encoder._', 'litesearch.utils.FastEncodeImage.embed', 'litesearch.utils.FastEncodeImage.embed.lambda.0', 'litesearch.utils.FastEncodeMultimodal.encode_text', 'litesearch.utils.FastEncodeMultimodal.encode_image', 'litesearch.utils.encode_pdf_texts']

CodeGraph.file2nodes

def file2nodes(
    path:str
)->set:

Return set of node names whose file column matches path.

g_drop = CodeGraph(':memory:')
g_drop.db.t.graph_nodes.insert_all([
    {'node':'mod.foo','flavor':'function','file':'/proj/mod.py'},
    {'node':'mod.bar','flavor':'function','file':'/proj/mod.py'},
])
g_drop.db.t.graph_edges.insert({'caller':'mod.foo','callee':'mod.bar','kind':'static','confidence':1.0})
assert g_drop.file2nodes('/proj/mod.py') == {'mod.foo','mod.bar'}
g_drop._drop_file('/proj/mod.py')
assert g_drop.file2nodes('/proj/mod.py') == set()
assert not list(g_drop.db.execute("SELECT * FROM graph_edges"))
print("_drop_file + _nodes_for_file ok")
_drop_file + _nodes_for_file ok

CodeGraph.sync

def sync(
    dir:NoneType=None, pkgs:NoneType=None, force:bool=False
)->CodeGraph:

Incremental sync: from_dir per dir, from_pkg per pkg; manage file_index. Centrality recomputed once at the end.


CodeGraph.sync_pkgs

def sync_pkgs(
    pkgs:list
)->CodeGraph:

Incremental sync for packages: drop missing files, update changed files, add new files.


CodeGraph.sync_dir

def sync_dir(
    dir:str | pathlib.Path, force:bool=False
)->CodeGraph:

Incremental sync for a directory: drop missing files, update changed files, add new files.

import tempfile, time
with tempfile.TemporaryDirectory() as tmp:
    pa, pb = Path(f'{tmp}/a.py'), Path(f'{tmp}/b.py')
    pa.write_text('def foo(): pass\n'); pb.write_text('def bar(): pass\n')

    g = CodeGraph(':memory:')
    g.sync(dir=tmp)
    fi = {r['path']: r['last_analyzed_at'] for r in g.db.t.file_index.rows}
    assert str(pa) in fi and str(pb) in fi, fi

    # Modify b.py — mtime changes
    time.sleep(0.01)
    pb.write_text('def bar(): return 42\n')
    pb.touch()  # ensure mtime update
    g.sync(dir=tmp)
    fi2 = {r['path']: r['last_analyzed_at'] for r in g.db.t.file_index.rows}
    assert fi2[str(pa)] == fi[str(pa)], f"a.py should not be reprocessed: {fi2}"
    assert fi2[str(pb)] != fi[str(pb)], f"b.py should be reprocessed: {fi2}"

    # Delete a.py — should be removed from file_index
    pa.unlink()
    g.sync(dir=tmp)
    fi3 = {r['path'] for r in g.db.t.file_index.rows}
    assert str(pa) not in fi3, f"a.py should be removed: {fi3}"
    print("sync incremental ok, remaining files:", fi3)

    # add packages to codegraph
    g.sync(pkgs=['httpx', 'fastcore'])
    assert len(g.gn(where='node like "httpx.%"')) > 0, "httpx nodes should be in graph"
    assert len(g.gn(where='node like "fastcore.%"')) > 0, "fastcore nodes should be in graph"
sync incremental ok, remaining files: {'/var/folders/kg/9vdw4mdd1fs58svgh4k1qhr09x7dqh/T/tmp76wzzi0w/b.py'}
loading code graph for packages:   0%|          | 0/2 [00:00<?, ?pkg/s]
loading code graph for packages:  50%|█████     | 1/2 [00:00<00:00,  1.58pkg/s]
loading code graph for packages: 100%|██████████| 2/2 [00:01<00:00,  1.05pkg/s]

Kosha.short_paths

def short_paths():

Shortest paths helper: shortest paths between all pairs in top-k nodes.


Kosha.short_path

def short_path():

Shortest path helper: shortest path between two nodes.


Kosha.neighbors

def neighbors():

Neighbors helper: callers + callees up to depth hops.


Kosha.ni

def ni():

Node info helper: graph_nodes row + callers, callees, co-dispatched nodes.


Kosha.ge

def ge():

graph_edges table for direct queries.


Kosha.gn

def gn():

graph_nodes table for direct queries.


Kosha.graphdb

def graphdb():

Underlying graph.db database for direct queries.


Kosha.graph

def graph()->CodeGraph:

code graph for this kosha instance (memoized — opens graph.db once per Kosha instance).


Kosha.public_api

def public_api(
    pkg:str, # package or module to index (e.g. 'kosha', 'litesearch.data')
    meta_cols:str='mod_name,docstring', # metadata keys to extract
    limit:int=200, # max names to return
)->L:

Return public API: all public_api=1 entries + @patch-derived methods from the call graph from env and repo stores.

k=Kosha()
api = k.public_api('kosha')
names = {r['mod_name'] for r in api}
assert any('sync' in n for n in names), f"patched 'sync' missing from public_api: {names}"
/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/tqdm/auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html
  from .autonotebook import tqdm as notebook_tqdm
api_httpx = k.public_api('httpx')
assert len(api_httpx) > 0, 'httpx __all__-based entries should still be returned'
print('public_api patch-aware ok | kosha:', len(api), '| httpx:', len(api_httpx))
print('kosha sample:', sorted(names)[:8])
public_api patch-aware ok | kosha: 59 | httpx: 155
kosha sample: ['kosha.core._is_pkg_ingested', 'kosha.core.awatch_repo', 'kosha.core.env_context', 'kosha.core.nuke', 'kosha.core.pkg_context', 'kosha.core.pkgs2consider', 'kosha.core.pkgs_in_env', 'kosha.core.process_env']
k.public_api('litesearch.data')[:3]
[{'mod_name': 'litesearch.cli.install', 'docstring': 'Install SKILL.md to .agents/, .claude/, .Codex/ skill directories.'}, {'mod_name': 'litesearch.cli.main', 'docstring': None}, {'mod_name': 'litesearch.core.rrf_merge', 'docstring': 'Reciprocal Rank Fusion: merges FTS and vector results. Items in both lists score highest.'}]
k.public_api('fastlite', meta_cols='mod_name')
[{'mod_name': 'fastlite.core.t'}, {'mod_name': 'fastlite.core.c'}, {'mod_name': 'fastlite.core.c'}, {'mod_name': 'fastlite.core.__str__'}, {'mod_name': 'fastlite.core.__str__'}, {'mod_name': 'fastlite.core.q'}, {'mod_name': 'fastlite.core.all_dcs'}, {'mod_name': 'fastlite.core.create_mod'}, {'mod_name': 'fastlite.core.link_dcs'}, {'mod_name': 'fastlite.core.__call__'}, {'mod_name': 'fastlite.core.selectone'}, {'mod_name': 'fastlite.core.set_classes'}, {'mod_name': 'fastlite.core.get_tables'}, {'mod_name': 'fastlite.core.v'}, {'mod_name': 'fastlite.core.get_typ'}, {'mod_name': 'fastlite.core.create'}, {'mod_name': 'fastlite.core.import_file'}, {'mod_name': 'fastlite.core.diagram'}, {'mod_name': 'fastlite.kw.MissingPrimaryKey'}, {'mod_name': 'fastlite.kw.database'}, {'mod_name': 'fastlite.kw.xtra'}, {'mod_name': 'fastlite.kw.get_last'}, {'mod_name': 'fastlite.kw.ids_and_rows_where'}, {'mod_name': 'fastlite.kw.get'}, {'mod_name': 'fastlite.kw.__getitem__'}, {'mod_name': 'fastlite.kw.create'}, {'mod_name': 'fastlite.kw.transform'}, {'mod_name': 'fastlite.kw.transform_sql'}, {'mod_name': 'fastlite.kw.update'}, {'mod_name': 'fastlite.kw.insert_all'}, {'mod_name': 'fastlite.kw.insert'}, {'mod_name': 'fastlite.kw.upsert'}, {'mod_name': 'fastlite.kw.lookup'}]
k.ni('fastlite.kw.database')
{'node': 'fastlite.kw.database',
 'flavor': 'function',
 'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/fastlite/kw.py',
 'pagerank': 1e-05,
 'in_degree': 0,
 'out_degree': 18,
 'callers': [],
 'callees': ['typing.Any', 'apsw.Connection', 'apswutils.db.Database', 'typing.Any', 'apsw.Connection', 'apswutils.db.Database', 'apswutils.db.Database', 'typing.Any', 'apsw.Connection', 'apswutils.db.Database', 'typing.Any', 'apsw.Connection', 'apsw.Connection', 'typing.Any', 'apswutils.db.Database', 'apswutils.db.Database', 'apsw.Connection', 'typing.Any'],
 'co_dispatched': []}

Kosha.status

def status(
    pyproject:bool=True, depth:int=1
)->dict:

Index freshness: file/pkg/node counts and stale file count.


rank_results

def rank_results(
    results, query, soft_pkgs:NoneType=None, top_k:NoneType=None, penalise_paths:bool=True
)->L:

Rerank result dicts: query boosts + soft-package boost + semble-style path penalties.


is_symbol_query

def is_symbol_query(
    query:str
)->bool:

True if the query looks like a bare symbol or namespace-qualified identifier.

from fastcore.test import test_eq, test_fail

# is_symbol_query: symbols vs NL
for s in ['Client','Sinatra::Base','_private','StateManager','foo.bar']: assert is_symbol_query(s), s
for s in ['session','merge dicts','extract bytes from image']: assert not is_symbol_query(s), s

# path penalties: tests/__init__/examples/.d.ts penalised, plain source not
assert _file_penalty('kosha/core.py') == 1.0
assert _file_penalty('tests/test_core.py') < 1.0
assert _file_penalty('pkg/__init__.py') == _MODERATE_PENALTY
assert _file_penalty('examples/demo.py') == _STRONG_PENALTY
assert _file_penalty('types/foo.d.ts') == _MILD_PENALTY

def _r(content='x', path='a.py', pkg=None, rrf=0.01, **kw):
    md = {'path': path, 'package': pkg}
    return dict(content=content, metadata=md, path=path, _rrf_score=rrf, **kw)

# package boost: fastcore ranked above equal-base non-fastcore, but non-fastcore still present
res = [_r('a', 'other.py', pkg='numpy', rrf=0.01), _r('b', 'fc.py', pkg='fastcore', rrf=0.01)]
ranked = rank_results(res, 'extract bytes', soft_pkgs={'fastcore'})
test_eq(len(ranked), 2)
test_eq(_rk_pkg(ranked[0]), 'fastcore')

# empty / no-crash
test_eq(rank_results([], 'q'), L())
test_eq(len(rank_results([_r()], '')), 1)
print('ranking tests passed')
ranking tests passed

Kosha.context

def context(
    q:str, # query with optional key:value filters
    limit:int=50, repo:bool=True, env:bool=True, graph:bool=True, boost:bool=True,
    compact:bool=False, # return slim dicts (mod_name, signature, docstring, lineno) instead of full chunks
    columns:str='content,metadata', sys_wide:bool=True, **kw
)->L: # forwarded to env_context / repo_context

Fan-out semantic search: parse filters, run repo + env searches, merge with chained RRF, then rerank.


Kosha.sync

def sync(
    pkgs:NoneType=None, # list of package names to sync (e.g. ['httpx', 'fastcore']); if None, sync all env packages
    dir:NoneType=None, # directory to sync; if None, sync all of root
    verbose:bool=True, # print progress messages
    in_parallel:bool=True, # run repo, env, and graph sync in parallel; also fans env packages out across threads
    force:bool=False, # ignore file mtimes and reprocess all files
    sync_graph:bool=False, # whether to force graph recomputation even if no files changed; ignored if force=True
    pyproject:bool=True, # if True, auto-detect env packages from pyproject.toml; if False, use pkgs argument as-is
    depth:int=1, # depth for pyproject env package detection; ignored if pyproject=False
    embed:bool=True, # whether to embed
)->Kosha:

Sync code store, env store, and code graph. Runs in a daemon thread by default.

k = Kosha()
k.gn(select='*', where='node like "%get_store"')
[{'node': 'litesearch.core.get_store',
  'flavor': 'function',
  'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/litesearch/core.py',
  'pagerank': 0.00488,
  'in_degree': 1,
  'out_degree': 48}]
k.status()
{'files': 4,
 'packages': 145,
 'graph_nodes': 109201,
 'stale_files': 4,
 'stale_pkgs': {},
 'new_files': 0}
k.sync()
Syncing code graph for dir=/Users/71293/code/personal/orgs/kosha, pkgs=all env packages, graph sync = False
No packages to load.
syncing files [Path('/Users/71293/code/personal/orgs/kosha/kosha/cli.py'), Path('/Users/71293/code/personal/orgs/kosha/kosha/core.py'), Path('/Users/71293/code/personal/orgs/kosha/kosha/graph.py'), Path('/Users/71293/code/personal/orgs/kosha/kosha/mcp.py')] .....
parse files from /Users/71293/code/personal/orgs/kosha: 100%|██████████| 4/4 [00:00<00:00, 40.72it/s]
{'changed': 8, 'same': 146, 'removed': 8}
synced repo
[None, None, None]
'fossick' in env_pkg_versions()
False
first(k.context('how do I merge dicts package:fastcore path:basics', limit=1, graph=False, compact=False))
{ '_dist': np.float32(0.3338333),
  '_rrf_score': 0.016666666666666666,
  '_score': 0.030000000000000002,
  '_source': 'env',
  '_src_id': 'env:2908',
  'content': 'def merge(*ds):\n'
             '    "Merge all dictionaries in `ds`"\n'
             '    return {k:v for d in ds if d is not None for k,v in '
             'd.items()}',
  'metadata': { 'docstring': 'Merge all dictionaries in `ds`',
                'end_lineno': 662,
                'lang': '.py',
                'lineno': 660,
                'mod_name': 'fastcore.basics.merge',
                'name': 'merge',
                'package': 'fastcore',
                'path': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/fastcore/basics.py',
                'public_api': True,
                'type': 'FunctionDef',
                'uploaded_at': 1784759792.1085885,
                'version': '2.1.5'},
  'rowid': 2908}

Kosha.api_call_paths

def api_call_paths(
    from_pkg:str, # package whose public API is the call source
    to_pkg:str, # package whose public API is the call target
    k:int=15, # top-k API nodes per package to consider
)->dict:

Shortest call-graph paths from from_pkg public API nodes to to_pkg public API nodes.


Kosha.top_nodes

def top_nodes(
    pkg:str, k:int=5
)->L:

Top-k public API nodes for pkg ranked by pagerank in the code graph.


Kosha.dep_stack

def dep_stack(
    seeds:list=None, depth:int=1, no_sys_pkg:bool=True, allow:list=None
)->list:

BFS over pkg_deps, ordered by coupling strength.


is_sys_pkg

def is_sys_pkg(
    pkg:str
)->bool:

Return True if pkg is a system-wide package (e.g. in site-packages), False if likely user code.

rows = list(k.envdb.t.pkg_deps(where='from_pkg="fastlite"'))
assert rows, 'pkg_deps should have rows after update_pkg'
assert any(r['to_pkg'] in ('fastcore','fastlite') for r in rows), f'expected fastcore/fastlite: {rows[:3]}'
print('pkg_deps via update_pkg ok:', rows[:3])
pkg_deps via update_pkg ok: [{'from_pkg': 'fastlite', 'to_pkg': 'apsw', 'n_modules': 1}, {'from_pkg': 'fastlite', 'to_pkg': 'apswutils', 'n_modules': 2}, {'from_pkg': 'fastlite', 'to_pkg': 'dataclasses', 'n_modules': 2}]
layers = k.dep_stack(['fastlite'])
print(layers)
print('-------------------------------------------------')
stack = L(layers).flatten()
assert 'fastcore' in stack, f'fastcore should be in dep_stack: {stack}'
print('_dep_stack ok:', stack)
[['fastlite'], {'fastcore', 'apswutils', 'apsw'}]
-------------------------------------------------
_dep_stack ok: ['fastlite', 'fastcore', 'apswutils', 'apsw']
k.dep_stack(['fastlite'], allow=['fastcore'])
[['fastlite'], {'fastcore'}]
k.api_call_paths('fastlite', 'apswutils')
{'apswutils.utils.rows_from_file': ['fastlite.core.import_file', 'apswutils.utils.rows_from_file'],
 'apswutils.utils.TypeTracker': ['fastlite.core.import_file', 'apswutils.utils.TypeTracker']}
k.context('payments page monsterui fasthtml', repo=False)[0]
{ '_dist': np.float32(0.5530824),
  '_rrf_score': 0.016666666666666666,
  '_score': 0.024289017842133262,
  '_source': 'env',
  '_src_id': 'env:1854',
  'callees': ['fasthtml.xtend.Titled', 'fasthtml.xtend.A', 'fasthtml.svg.PathFT.A', 'fasthtml.xtend.Titled', 'fasthtml.xtend.A', 'fasthtml.svg.PathFT.A', 'fasthtml.svg.PathFT.A', 'fasthtml.xtend.A', 'fasthtml.xtend.Titled', 'fasthtml.xtend.Titled', 'fasthtml.svg.PathFT.A', 'fasthtml.xtend.A', 'fasthtml.xtend.Titled', 'fasthtml.svg.PathFT.A', 'fasthtml.xtend.A', 'fasthtml.xtend.A', 'fasthtml.xtend.Titled', 'fasthtml.svg.PathFT.A'],
  'callers': [],
  'co_dispatched': [],
  'content': 'def account_management(sess):\n'
             "    user_email = sess['auth']\n"
             '    user_payments = payments("email=?", (user_email,))\n'
             '    # Create table rows for each payment\n'
             '    payment_rows = []\n'
             '    for payment in user_payments:\n'
             '        action_button = ""\n'
             "        if payment.payment_status == 'paid':\n"
             '            action_button = Button("Request Refund", '
             'hx_post=f"/refund?checkout_sid={payment.checkout_session_id}",hx_target="#refund-status")\n'
             "        elif payment.payment_status == 'refunded': action_button "
             '= "Refunded"\n'
             '        \n'
             '        # Add row to table\n'
             '        payment_rows.append(\n'
             '            Tr(*map(Td, (payment.created_at, payment.amount, '
             'payment.payment_status, action_button))))\n'
             '    \n'
             '    # Create payment history table\n'
             '    payment_history = Table(\n'
             '        Thead(Tr(*map(Th, ("Date", "Amount", "Status", '
             '"Action")))),\n'
             '        Tbody(*payment_rows))\n'
             '    \n'
             '    return Titled(\n'
             '        "Account Management",\n'
             '        Div(H2(f"Account: {user_email}"),\n'
             '            H3("Payment History"),\n'
             '            payment_history,\n'
             '            Div(id="refund-status"),  # Target for refund status '
             'messages\n'
             '            A("Back to Home", href="/")))',
  'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/fasthtml/stripe_otp.py',
  'flavor': 'function',
  'in_degree': 0,
  'metadata': { 'docstring': None,
                'end_lineno': 211,
                'lang': '.py',
                'lineno': 185,
                'mod_name': 'fasthtml.stripe_otp.account_management',
                'name': 'account_management',
                'package': 'python-fasthtml',
                'path': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/fasthtml/stripe_otp.py',
                'public_api': True,
                'type': 'FunctionDef',
                'uploaded_at': 1784506465.2619212,
                'version': '0.14.9'},
  'node': 'fasthtml.stripe_otp.account_management',
  'out_degree': 18,
  'pagerank': 1e-05,
  'rowid': 1854}
k.context('payments page package:python-fasthtml')[0]
{ '_dist': np.float32(0.33909822),
  '_rrf_score': 0.01639344262295082,
  '_score': 0.02959016393442623,
  '_source': 'env',
  '_src_id': 'env:1851',
  'callees': ['fasthtml.xtend.Titled', 'fasthtml.svg.PathFT.A', 'fasthtml.xtend.A', 'fasthtml.svg.PathFT.A', 'fasthtml.xtend.A', 'fasthtml.xtend.Titled', 'fasthtml.xtend.A', 'fasthtml.svg.PathFT.A', 'fasthtml.xtend.Titled', 'fasthtml.xtend.Titled', 'fasthtml.svg.PathFT.A', 'fasthtml.xtend.A', 'fasthtml.xtend.A', 'fasthtml.xtend.Titled', 'fasthtml.svg.PathFT.A', 'fasthtml.xtend.A', 'fasthtml.xtend.Titled', 'fasthtml.svg.PathFT.A'],
  'callers': [],
  'co_dispatched': [],
  'content': 'def success(sess, checkout_sid:str):    \n'
             '    # Get payment record from database (saved in the webhook)\n'
             '    payment = payments[checkout_sid]\n'
             '\n'
             "    if not payment or payment.payment_status != 'paid': \n"
             '        return Titled("Error", P("Payment not found"))\n'
             '\n'
             '    return Titled(\n'
             '        "Success",\n'
             '        Div(H2("Payment Successful!"),\n'
             '            P(f"Thank you for your purchase, '
             '{sess[\'auth\']}"),\n'
             '            P(f"Amount Paid: ${payment.amount / 100:.2f}"),\n'
             '            P(f"Status: {payment.payment_status}"),\n'
             '            P(f"Transaction ID: '
             '{payment.checkout_session_id}"),\n'
             '            A("Back to Home", href="/")))',
  'file': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/fasthtml/stripe_otp.py',
  'flavor': 'function',
  'in_degree': 0,
  'metadata': { 'docstring': None,
                'end_lineno': 147,
                'lang': '.py',
                'lineno': 133,
                'mod_name': 'fasthtml.stripe_otp.success',
                'name': 'success',
                'package': 'python-fasthtml',
                'path': '/Users/71293/code/personal/orgs/kosha/.venv/lib/python3.13/site-packages/fasthtml/stripe_otp.py',
                'public_api': True,
                'type': 'FunctionDef',
                'uploaded_at': 1784506465.2619212,
                'version': '0.14.9'},
  'node': 'fasthtml.stripe_otp.success',
  'out_degree': 18,
  'pagerank': 1e-05,
  'rowid': 1851}
k.context('fetch a page using broswer session package:fossick', repo=False)
[]
k.update_pkgs(['fossick'])

Kosha.where_to_add

def where_to_add(
    description:str, limit:int=5, repo:bool=True, env:bool=True, graph:bool=True, boost:bool=True,
    compact:bool=False, columns:str='content,metadata', sys_wide:bool=True
)->L:

Likely insertion points for new code: file + line from top context results + co_dispatched peers.

pts = k.where_to_add('add a new way to search codebase', limit=3)
assert isinstance(pts, L)
if pts:
    assert all(k in pts[0] for k in ('node','path','insert_after','co_dispatched','pagerank'))
    print('where_to_add ok:', pts[0]['path'], 'line', pts[0]['insert_after'])
else: print('where_to_add ok: no results (index may be empty)')
where_to_add ok: /Users/71293/code/personal/orgs/kosha/kosha/graph.py line 749