local-knowledge 0.2.0__tar.gz → 0.2.2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (19) hide show
  1. {local_knowledge-0.2.0 → local_knowledge-0.2.2}/PKG-INFO +3 -3
  2. {local_knowledge-0.2.0 → local_knowledge-0.2.2}/pyproject.toml +3 -3
  3. {local_knowledge-0.2.0 → local_knowledge-0.2.2}/src/local_knowledge/cli_local.py +11 -1
  4. {local_knowledge-0.2.0 → local_knowledge-0.2.2}/src/local_knowledge/crawl_local.py +13 -1
  5. {local_knowledge-0.2.0 → local_knowledge-0.2.2}/src/local_knowledge/server_local.py +7 -7
  6. {local_knowledge-0.2.0 → local_knowledge-0.2.2}/src/local_knowledge.egg-info/PKG-INFO +3 -3
  7. {local_knowledge-0.2.0 → local_knowledge-0.2.2}/src/local_knowledge.egg-info/requires.txt +2 -2
  8. {local_knowledge-0.2.0 → local_knowledge-0.2.2}/README.md +0 -0
  9. {local_knowledge-0.2.0 → local_knowledge-0.2.2}/setup.cfg +0 -0
  10. {local_knowledge-0.2.0 → local_knowledge-0.2.2}/src/local_knowledge/__init__.py +0 -0
  11. {local_knowledge-0.2.0 → local_knowledge-0.2.2}/src/local_knowledge/settings_local.py +0 -0
  12. {local_knowledge-0.2.0 → local_knowledge-0.2.2}/src/local_knowledge.egg-info/SOURCES.txt +0 -0
  13. {local_knowledge-0.2.0 → local_knowledge-0.2.2}/src/local_knowledge.egg-info/dependency_links.txt +0 -0
  14. {local_knowledge-0.2.0 → local_knowledge-0.2.2}/src/local_knowledge.egg-info/entry_points.txt +0 -0
  15. {local_knowledge-0.2.0 → local_knowledge-0.2.2}/src/local_knowledge.egg-info/top_level.txt +0 -0
  16. {local_knowledge-0.2.0 → local_knowledge-0.2.2}/tests/test_agent_doc_consistency.py +0 -0
  17. {local_knowledge-0.2.0 → local_knowledge-0.2.2}/tests/test_crawl_local.py +0 -0
  18. {local_knowledge-0.2.0 → local_knowledge-0.2.2}/tests/test_extract_files.py +0 -0
  19. {local_knowledge-0.2.0 → local_knowledge-0.2.2}/tests/test_server_flow_local.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: local-knowledge
3
- Version: 0.2.0
3
+ Version: 0.2.2
4
4
  Summary: Local file/folder indexer + grounded-Q&A MCP service — same engine as confluence-knowledge, no credentials needed
5
5
  License: MIT
6
6
  Project-URL: Repository, https://github.com/nkunal1992/agents
@@ -12,7 +12,7 @@ Classifier: License :: OSI Approved :: MIT License
12
12
  Classifier: Programming Language :: Python :: 3 :: Only
13
13
  Requires-Python: >=3.11
14
14
  Description-Content-Type: text/markdown
15
- Requires-Dist: confluence-knowledge>=0.5.0
15
+ Requires-Dist: confluence-knowledge>=0.5.1
16
16
  Requires-Dist: python-docx>=1.1
17
17
  Requires-Dist: pypdf>=4.0
18
18
  Requires-Dist: python-pptx>=1.0
@@ -20,7 +20,7 @@ Requires-Dist: openpyxl>=3.1
20
20
  Requires-Dist: mcp<2,>=1.6
21
21
  Requires-Dist: pip-system-certs>=5.0
22
22
  Provides-Extra: models
23
- Requires-Dist: confluence-knowledge[models]>=0.5.0; extra == "models"
23
+ Requires-Dist: confluence-knowledge[models]>=0.5.2; extra == "models"
24
24
  Provides-Extra: dev
25
25
  Requires-Dist: pytest>=8.0; extra == "dev"
26
26
  Requires-Dist: pytest-cov>=5.0; extra == "dev"
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "local-knowledge"
7
- version = "0.2.0"
7
+ version = "0.2.2"
8
8
  description = "Local file/folder indexer + grounded-Q&A MCP service — same engine as confluence-knowledge, no credentials needed"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.11"
@@ -16,7 +16,7 @@ classifiers = [
16
16
  "Programming Language :: Python :: 3 :: Only",
17
17
  ]
18
18
  dependencies = [
19
- "confluence-knowledge>=0.5.0",
19
+ "confluence-knowledge>=0.5.1",
20
20
  "python-docx>=1.1",
21
21
  "pypdf>=4.0",
22
22
  "python-pptx>=1.0",
@@ -27,7 +27,7 @@ dependencies = [
27
27
 
28
28
  [project.optional-dependencies]
29
29
  models = [
30
- "confluence-knowledge[models]>=0.5.0",
30
+ "confluence-knowledge[models]>=0.5.2",
31
31
  ]
32
32
  dev = [
33
33
  "pytest>=8.0",
@@ -30,6 +30,13 @@ def _doctor() -> int:
30
30
  from .server_local import status
31
31
  s = status()
32
32
  print(json.dumps(s, indent=2))
33
+ bad = [c for c in s.get("checks", []) if not c["ok"]]
34
+ if bad:
35
+ print("\nhealth flags:")
36
+ for c in bad:
37
+ print(f" ✗ {c['flag']}: {c['detail']}")
38
+ if c.get("remediation"):
39
+ print(f" → {c['remediation']}")
33
40
  upd = check("local-knowledge")
34
41
  if upd["installed"]:
35
42
  line = f"version: {upd['installed']}"
@@ -41,7 +48,7 @@ def _doctor() -> int:
41
48
  if upd["update_available"]:
42
49
  print("update available: run `local-knowledge update` "
43
50
  "(or pip install -U local-knowledge[models])")
44
- return 0
51
+ return 4 if bad else 0
45
52
 
46
53
 
47
54
  def main() -> None:
@@ -72,6 +79,9 @@ def main() -> None:
72
79
  import subprocess
73
80
  cmd = [sys.executable, "-m", "pip", "install", "-U",
74
81
  "local-knowledge[models]"]
82
+ # a running MCP server holds open files — quit the IDE first
83
+ print("note: quit the IDE (or stop the MCP server) before updating —"
84
+ " a running server can't be replaced cleanly", flush=True)
75
85
  if os.name == "nt":
76
86
  # this exe is the running process on Windows — pip can't replace
77
87
  # a file that's in use; hand the user the equivalent command
@@ -32,7 +32,7 @@ def resolve_root(path: str) -> Path:
32
32
  return p.resolve()
33
33
 
34
34
 
35
- from confluence_knowledge.retrieval import EMBED_MODEL_ID as _MODEL_ID
35
+ from confluence_knowledge.retrieval import MODEL_MARKER as _MODEL_ID
36
36
 
37
37
 
38
38
  class LocalCrawler:
@@ -133,6 +133,18 @@ class LocalCrawler:
133
133
 
134
134
  queue: list[str] = job["queue"]
135
135
  errors: list[str] = job["errors"]
136
+ # Mid-crawl model change: already-embedded pages live in the OLD
137
+ # vector space — finishing would publish mixed dims. Wipe + fail;
138
+ # start_crawl rebuilds under the new model.
139
+ stamped = self.index.model_id()
140
+ if stamped is not None and stamped != _MODEL_ID and queue:
141
+ self.index.clear_scope()
142
+ errors = errors + [
143
+ (f"model changed mid-crawl ({stamped} → {_MODEL_ID}) — "
144
+ "index cleared; run start_crawl")]
145
+ self.index.save_job(job_id, "error", [], errors)
146
+ return {"job_id": job_id, "state": "error",
147
+ "remaining": 0, "errors": errors}
136
148
  seen_raw = self.index.meta_get(f"seen:{job_id}")
137
149
  seen: set[str] = set(json.loads(seen_raw)) if seen_raw else set()
138
150
  levels_raw = self.index.meta_get(f"levels:{job_id}")
@@ -14,7 +14,9 @@ import threading
14
14
  from confluence_knowledge.client import AccessError, SecurityException
15
15
  from confluence_knowledge.index import Index
16
16
  from confluence_knowledge.retrieval import (
17
- EMBED_MODEL_ID,
17
+ MODEL_MARKER as EMBED_MODEL_ID,
18
+ )
19
+ from confluence_knowledge.retrieval import (
18
20
  LocalEmbedder,
19
21
  LocalReranker,
20
22
  LocalSparseEmbedder,
@@ -25,7 +27,7 @@ from confluence_knowledge.settings import SetupError
25
27
  from mcp.server.fastmcp import FastMCP
26
28
 
27
29
  from .crawl_local import LocalCrawler, resolve_root
28
- from .settings_local import APP_NAME, LocalProfile, home, index_root
30
+ from .settings_local import APP_NAME, LocalProfile, home, index_root, workdir
29
31
 
30
32
  mcp = FastMCP("local-knowledge")
31
33
 
@@ -113,19 +115,17 @@ def _scope(scope_handle: str) -> dict:
113
115
  @mcp.tool()
114
116
  def status() -> dict:
115
117
  """Report setup readiness — no credentials exist for this agent."""
116
- models = home() / "models"
117
118
  try:
118
119
  profile = LocalProfile.load()
119
120
  cfg = {"root": profile.root_path, "device": profile.device}
120
121
  except SetupError as e:
121
122
  cfg = {"error": str(e)}
123
+ from confluence_knowledge.health import health_checks
122
124
  return {
123
125
  "configured": "error" not in cfg,
124
126
  "profile": cfg,
125
- "embedding_model_ready": (models / "bge-m3").exists(),
126
- "reranker_model_ready": (models / "bge-reranker-v2-m3-ONNX").exists()
127
- or (models / "bge-reranker-base-ONNX").exists(),
128
- "sparse_model_ready": (models / "fastembed").exists(),
127
+ "checks": health_checks(home(), workdir(), APP_NAME, "local-knowledge",
128
+ index_root=index_root()),
129
129
  "models_loaded": _models_ready.is_set() and _EMBEDDER is not None,
130
130
  "index_root": str(index_root()),
131
131
  "live_scopes": sorted(_scopes),
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: local-knowledge
3
- Version: 0.2.0
3
+ Version: 0.2.2
4
4
  Summary: Local file/folder indexer + grounded-Q&A MCP service — same engine as confluence-knowledge, no credentials needed
5
5
  License: MIT
6
6
  Project-URL: Repository, https://github.com/nkunal1992/agents
@@ -12,7 +12,7 @@ Classifier: License :: OSI Approved :: MIT License
12
12
  Classifier: Programming Language :: Python :: 3 :: Only
13
13
  Requires-Python: >=3.11
14
14
  Description-Content-Type: text/markdown
15
- Requires-Dist: confluence-knowledge>=0.5.0
15
+ Requires-Dist: confluence-knowledge>=0.5.1
16
16
  Requires-Dist: python-docx>=1.1
17
17
  Requires-Dist: pypdf>=4.0
18
18
  Requires-Dist: python-pptx>=1.0
@@ -20,7 +20,7 @@ Requires-Dist: openpyxl>=3.1
20
20
  Requires-Dist: mcp<2,>=1.6
21
21
  Requires-Dist: pip-system-certs>=5.0
22
22
  Provides-Extra: models
23
- Requires-Dist: confluence-knowledge[models]>=0.5.0; extra == "models"
23
+ Requires-Dist: confluence-knowledge[models]>=0.5.2; extra == "models"
24
24
  Provides-Extra: dev
25
25
  Requires-Dist: pytest>=8.0; extra == "dev"
26
26
  Requires-Dist: pytest-cov>=5.0; extra == "dev"
@@ -1,4 +1,4 @@
1
- confluence-knowledge>=0.5.0
1
+ confluence-knowledge>=0.5.1
2
2
  python-docx>=1.1
3
3
  pypdf>=4.0
4
4
  python-pptx>=1.0
@@ -12,4 +12,4 @@ pytest-cov>=5.0
12
12
  ruff>=0.6
13
13
 
14
14
  [models]
15
- confluence-knowledge[models]>=0.5.0
15
+ confluence-knowledge[models]>=0.5.2