jevgraph 0.2.0a1__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.
- jevgraph-0.2.0a1/.github/workflows/ci.yml +35 -0
- jevgraph-0.2.0a1/.gitignore +12 -0
- jevgraph-0.2.0a1/CONTRIBUTING.md +22 -0
- jevgraph-0.2.0a1/DESIGN.md +87 -0
- jevgraph-0.2.0a1/LICENSE +22 -0
- jevgraph-0.2.0a1/PKG-INFO +94 -0
- jevgraph-0.2.0a1/PRODUCT.md +120 -0
- jevgraph-0.2.0a1/README.md +167 -0
- jevgraph-0.2.0a1/README_PYPI.md +73 -0
- jevgraph-0.2.0a1/examples/quickstart.py +17 -0
- jevgraph-0.2.0a1/package-lock.json +40 -0
- jevgraph-0.2.0a1/package.json +7 -0
- jevgraph-0.2.0a1/pyproject.toml +42 -0
- jevgraph-0.2.0a1/src/jevgraph/__init__.py +23 -0
- jevgraph-0.2.0a1/src/jevgraph/cli.py +104 -0
- jevgraph-0.2.0a1/src/jevgraph/client.py +55 -0
- jevgraph-0.2.0a1/src/jevgraph/demo.py +48 -0
- jevgraph-0.2.0a1/src/jevgraph/extension/background.js +113 -0
- jevgraph-0.2.0a1/src/jevgraph/extension/capture.js +34 -0
- jevgraph-0.2.0a1/src/jevgraph/extension/manifest.json +14 -0
- jevgraph-0.2.0a1/src/jevgraph/extension/panel.css +1 -0
- jevgraph-0.2.0a1/src/jevgraph/extension/panel.html +8 -0
- jevgraph-0.2.0a1/src/jevgraph/extension/panel.js +82 -0
- jevgraph-0.2.0a1/src/jevgraph/graph.py +385 -0
- jevgraph-0.2.0a1/src/jevgraph/judges.py +101 -0
- jevgraph-0.2.0a1/src/jevgraph/server.py +173 -0
- jevgraph-0.2.0a1/src/jevgraph/store.py +107 -0
- jevgraph-0.2.0a1/src/jevgraph/types.py +166 -0
- jevgraph-0.2.0a1/src/jevgraph/web/app.css +2 -0
- jevgraph-0.2.0a1/src/jevgraph/web/app.js +195 -0
- jevgraph-0.2.0a1/src/jevgraph/web/example-collection.json +7 -0
- jevgraph-0.2.0a1/src/jevgraph/web/index.html +45 -0
- jevgraph-0.2.0a1/src/jevgraph/workspace.py +317 -0
- jevgraph-0.2.0a1/tests/QA.md +22 -0
- jevgraph-0.2.0a1/tests/browser.mjs +159 -0
- jevgraph-0.2.0a1/tests/serve_fixture.py +49 -0
- jevgraph-0.2.0a1/tests/test_client.py +24 -0
- jevgraph-0.2.0a1/tests/test_graph.py +249 -0
- jevgraph-0.2.0a1/tests/test_judges.py +77 -0
- jevgraph-0.2.0a1/tests/test_workspace.py +201 -0
- jevgraph-0.2.0a1/uv.lock +428 -0
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
name: tests
|
|
2
|
+
on: [push, pull_request]
|
|
3
|
+
permissions:
|
|
4
|
+
contents: read
|
|
5
|
+
jobs:
|
|
6
|
+
test:
|
|
7
|
+
runs-on: ubuntu-latest
|
|
8
|
+
strategy:
|
|
9
|
+
matrix:
|
|
10
|
+
python-version: ["3.11", "3.12", "3.13"]
|
|
11
|
+
steps:
|
|
12
|
+
- uses: actions/checkout@v4
|
|
13
|
+
- uses: actions/setup-python@v5
|
|
14
|
+
with:
|
|
15
|
+
python-version: ${{ matrix.python-version }}
|
|
16
|
+
- run: python -m pip install -e '.[dev,server]'
|
|
17
|
+
- run: python -m pytest
|
|
18
|
+
- run: ruff check .
|
|
19
|
+
- run: python -m build
|
|
20
|
+
- run: jevgraph demo
|
|
21
|
+
browser:
|
|
22
|
+
runs-on: ubuntu-latest
|
|
23
|
+
steps:
|
|
24
|
+
- uses: actions/checkout@v4
|
|
25
|
+
- uses: actions/setup-python@v5
|
|
26
|
+
with:
|
|
27
|
+
python-version: "3.11"
|
|
28
|
+
- uses: actions/setup-node@v4
|
|
29
|
+
with:
|
|
30
|
+
node-version: "22"
|
|
31
|
+
- run: python -m venv .venv
|
|
32
|
+
- run: .venv/bin/pip install -e '.[dev,server]'
|
|
33
|
+
- run: npm ci
|
|
34
|
+
- run: npx playwright install --with-deps chromium
|
|
35
|
+
- run: npm run test:browser
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# Contributing
|
|
2
|
+
|
|
3
|
+
This is an early independent prototype. Start by running the offline demo and tests:
|
|
4
|
+
|
|
5
|
+
```bash
|
|
6
|
+
uv sync --extra dev --extra server
|
|
7
|
+
uv run jevgraph demo
|
|
8
|
+
uv run pytest
|
|
9
|
+
uv run ruff check .
|
|
10
|
+
uv build
|
|
11
|
+
npm ci
|
|
12
|
+
npx playwright install chromium
|
|
13
|
+
npm run test:browser
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
Keep relationship evidence separate from query relevance. Any change to relation prompts must bump the rubric version; a custom judge must change its `cache_key` when its behavior changes. Preserve original edge direction, negative/uncertain judgments, and source revisions. Add behavior tests for source invalidation, traversal or provider changes.
|
|
17
|
+
|
|
18
|
+
Use synthetic records in tests and examples. Tests must run without credentials. Label scripted judgments clearly. Live experiments should publish their dataset provenance, model version, budgets, unsuccessful requests, and cache conditions alongside any results. Never infer model quality from a scripted demo.
|
|
19
|
+
|
|
20
|
+
Priorities are a retriever protocol, measured candidate recall, a small public multi-hop evaluation, source-span adapters, and larger-store adapters. See DESIGN.md for the proposed research direction.
|
|
21
|
+
|
|
22
|
+
Before a public release, resolve the existing JevGraph name collision, choose the actual repository/distribution names, update metadata, and verify the source and wheel contents. Do not use another project's package name or imply affiliation.
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
# JEVGRAPH: search that builds reusable graph memory
|
|
2
|
+
|
|
3
|
+
This document describes the underlying graph engine. The product has expanded into a general workplace search app with Chrome capture and dump ingestion; see [PRODUCT.md](PRODUCT.md) for the current product scope and roadmap.
|
|
4
|
+
|
|
5
|
+
## Premise
|
|
6
|
+
|
|
7
|
+
Give an agent a dataset and a question. Let it create the part of a relationship graph needed to investigate that question. Preserve the relationship judgments, including their evidence and uncertainty, so the next investigation can reuse them.
|
|
8
|
+
|
|
9
|
+
The unit of memory is a **versioned relationship judgment**. It contains a directed claim, a relation definition, the source records evaluated, the judge version, and support/contradiction scores. A search is an ordered set of decisions over those judgments. Keeping those two objects separate prevents query relevance from gradually contaminating persistent memory.
|
|
10
|
+
|
|
11
|
+
Product sentence: **“JEVGRAPH turns your searches into reusable evidence graphs.”**
|
|
12
|
+
|
|
13
|
+
Developer promise: initialize a named graph, supply records and relation definitions, ask a bounded question, and inspect the path and evidence. No database service is required for the local alpha.
|
|
14
|
+
|
|
15
|
+
## Why this might matter
|
|
16
|
+
|
|
17
|
+
Consider an architecture investigation: “How could an identity outage affect checkout?” Text/vector retrieval can identify records mentioning identity or checkout. A relationship graph can connect records across service boundaries. Reusing previously judged edges may reduce repeated calls when later questions investigate payments, login, or the edge router.
|
|
18
|
+
|
|
19
|
+
Building the graph only where queries explore could also reduce unnecessary indexing work. That benefit depends on query distribution and candidate quality. A corpus that is fully explored, frequently changing, or poorly retrieved may receive little benefit; cold searches add relationship-evaluation latency. Repeated retrieval can reinforce bad judgments unless evidence and revisions remain inspectable.
|
|
20
|
+
|
|
21
|
+
The research question is whether this design improves supported answer recall per unit of evaluation work under realistic cold, warm, and source-update workloads.
|
|
22
|
+
|
|
23
|
+
## Four responsibilities
|
|
24
|
+
|
|
25
|
+
| Responsibility | Input | Output | Alpha implementation |
|
|
26
|
+
| --- | --- | --- | --- |
|
|
27
|
+
| Candidate retrieval | Query/current record, optional embedding | Bounded candidate records | Lexical + exact cosine, rank fusion |
|
|
28
|
+
| Relationship evaluation | Directed pair, predicate, source text | Support and contradiction judgments | JEV Noul; independent predicates |
|
|
29
|
+
| Graph memory | Versioned judgments | Reusable supported/uncertain/rejected edges | Named SQLite namespaces |
|
|
30
|
+
| Search control | Query, evidence path, supported neighbors | Relevance decisions and stopping judgment | Bounded best-first traversal |
|
|
31
|
+
|
|
32
|
+
The answering model can receive `SearchResult.to_dict()` and write a response with citations. Answer synthesis is intentionally an application responsibility in this version.
|
|
33
|
+
|
|
34
|
+
## Relationship lifecycle
|
|
35
|
+
|
|
36
|
+
1. The caller supplies a record with stable ID and exact source text.
|
|
37
|
+
2. Retrieval proposes a pair. Type constraints determine applicable predicates.
|
|
38
|
+
3. A matching cache entry reuses the original judgment. Otherwise, JEV evaluates the pair without seeing the user's query.
|
|
39
|
+
4. Deterministic thresholds classify the result. Only supported edges enter traversal; all statuses remain inspectable.
|
|
40
|
+
5. Query-specific routing determines which candidate path to explore next.
|
|
41
|
+
6. Source edits or deletions remove affected cached judgments. Model/rubric/schema changes select a different cache identity. Policy changes reinterpret stored scores.
|
|
42
|
+
|
|
43
|
+
Evidence currently means the supplied node records, not extracted sentence spans or independently verified truth. Cross-document entity resolution, aliases, temporal validity, and external verification are future work.
|
|
44
|
+
|
|
45
|
+
## Search behavior
|
|
46
|
+
|
|
47
|
+
Seed from explicit node IDs or local hybrid retrieval. On each expansion, judge whether the path is sufficient. If not, interleave known supported neighbors with nearby retrieved records. Evaluate missing candidate relationships in both directions, then independently score supported extensions for the query. Continue with the highest-priority queued path until the goal judgment passes or a budget/coverage limit is reached.
|
|
48
|
+
|
|
49
|
+
Paths do not revisit the same node. Different paths to the same node remain eligible because their evidence can differ. Edge direction stays explicit even when traversing backward. The bottleneck priority makes no independence assumption about multiple model scores; it is only a heuristic.
|
|
50
|
+
|
|
51
|
+
There is no completeness guarantee. Bounded candidates, greedy priorities, source omissions, ambiguous language, and judge errors can all cause misses. Call and question counts are recorded even on failed attempts. Reported token usage covers successful responses; failed requests may incur usage that is unavailable to this client.
|
|
52
|
+
|
|
53
|
+
## What could make the next version distinctive
|
|
54
|
+
|
|
55
|
+
These are proposed extensions, not current capabilities:
|
|
56
|
+
|
|
57
|
+
1. **Search over missing knowledge.** Expose unresolved relationship questions to an agent. It can fetch a targeted source, add evidence, and resume the frontier. Tool execution remains with the host application.
|
|
58
|
+
2. **Estimate the value of another hop.** Compare expected new evidence with latency/call cost. Measure whether this beats a fixed threshold before making it the default.
|
|
59
|
+
3. **Keep contradictory paths visible.** Return competing evidence branches and dates rather than flattening disagreement into one answer.
|
|
60
|
+
4. **Reuse work across related questions.** Distinguish relationship cache reuse from answer reuse; a previously useful path must still be evaluated for a new query.
|
|
61
|
+
5. **Support larger corpora through adapters.** Add a retriever interface for existing vector indexes and a graph-store interface for existing graph databases, with identical evidence and invalidation contracts.
|
|
62
|
+
6. **Give agents a small tool surface.** Proposed tools: `graph.search`, `graph.inspect_path`, `graph.add_evidence`, and `graph.unresolved`. Implement an MCP adapter after the Python contracts stabilize.
|
|
63
|
+
|
|
64
|
+
## Evaluation before performance claims
|
|
65
|
+
|
|
66
|
+
Use a held-out dataset of source records, dependency questions, answerable/unanswerable cases, and gold evidence paths. Include negation, reversed relations, distractors, conflicting versions, duplicate names, deleted records, cycles, and high-degree nodes. Ensure the question text never leaks into durable edge judgment prompts.
|
|
67
|
+
|
|
68
|
+
Compare the same records and embedding model across:
|
|
69
|
+
|
|
70
|
+
- text/vector retrieval alone;
|
|
71
|
+
- vector retrieval with JEV reranking;
|
|
72
|
+
- a fully precomputed relationship graph;
|
|
73
|
+
- JEVGRAPH with cold memory;
|
|
74
|
+
- JEVGRAPH with warm relationship memory;
|
|
75
|
+
- JEVGRAPH after a controlled source update.
|
|
76
|
+
|
|
77
|
+
Measure candidate recall separately from relationship precision/recall; then measure supported answer recall, incorrect-stop rate, abstention rate, citation correctness, p50/p95 latency, attempted calls/questions, reported tokens, and provider-reported cost where available. Run an ablation without JEV routing to determine whether navigation judgment adds value beyond graph traversal.
|
|
78
|
+
|
|
79
|
+
Record source/model/schema versions, budgets, failures, and cache states. Fix thresholds on a development split and evaluate on held-out records. Fixture tests prove mechanics; they are not evidence that JEV finds the right relationships.
|
|
80
|
+
|
|
81
|
+
## Scope of this first delivery
|
|
82
|
+
|
|
83
|
+
Implemented: Python package, local graph namespaces, user-supplied records and embeddings, local hybrid retrieval, pair-level relation judgments, lazy graph growth, persistent cache/invalidation, evidence paths, bounded search, JSON export, offline demo, live JEV adapter, tests, and build metadata.
|
|
84
|
+
|
|
85
|
+
The workspace layer now adds Chrome page capture, batch imports, authenticated local search, source previews, ingestion activity, and a browser-agent ingestion client. Still not implemented: automatic entity extraction, arbitrary graph-schema induction, an embedding provider, ANN indexing, native SaaS connectors, AST parsers, graph-store adapters, MCP serving, a graph visualization UI, answer synthesis, or production benchmarking.
|
|
86
|
+
|
|
87
|
+
The original references “gantas” and “JEVbase” remain unidentified. No code from assumed repositories has been incorporated. Public references used to verify this design are linked in the README.
|
jevgraph-0.2.0a1/LICENSE
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 JEVGRAPH contributors
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
22
|
+
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
Metadata-Version: 2.5
|
|
2
|
+
Name: jevgraph
|
|
3
|
+
Version: 0.2.0a1
|
|
4
|
+
Summary: Browser capture, workspace search, and reusable evidence graphs.
|
|
5
|
+
Author: JEVGRAPH contributors
|
|
6
|
+
License-Expression: MIT
|
|
7
|
+
License-File: LICENSE
|
|
8
|
+
Classifier: Development Status :: 3 - Alpha
|
|
9
|
+
Classifier: Programming Language :: Python :: 3
|
|
10
|
+
Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
|
|
11
|
+
Requires-Python: >=3.11
|
|
12
|
+
Provides-Extra: dev
|
|
13
|
+
Requires-Dist: build<2,>=1; extra == 'dev'
|
|
14
|
+
Requires-Dist: httpx<1,>=0.28; extra == 'dev'
|
|
15
|
+
Requires-Dist: pytest<9,>=8; extra == 'dev'
|
|
16
|
+
Requires-Dist: ruff<1,>=0.11; extra == 'dev'
|
|
17
|
+
Provides-Extra: server
|
|
18
|
+
Requires-Dist: fastapi<1,>=0.115; extra == 'server'
|
|
19
|
+
Requires-Dist: uvicorn<1,>=0.34; extra == 'server'
|
|
20
|
+
Description-Content-Type: text/markdown
|
|
21
|
+
|
|
22
|
+
# JEVGRAPH
|
|
23
|
+
|
|
24
|
+
**Capture in the browser. Search in one workspace. Follow the evidence.**
|
|
25
|
+
|
|
26
|
+
JEVGRAPH is an MIT-licensed Python graph engine with an optional local workplace search app and a bundled Chrome extension. It connects browser capture and agent ingestion to a searchable source library, with optional JEV relationship evaluation and bounded graph traversal.
|
|
27
|
+
|
|
28
|
+
Version **0.2.0a1 is an alpha release** for local evaluation. Python 3.11 or newer is required. This is an independent project; other projects also use the JevGraph name.
|
|
29
|
+
|
|
30
|
+
## Install and run
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
python -m pip install 'jevgraph[server]==0.2.0a1'
|
|
34
|
+
jevgraph serve
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
Open `http://127.0.0.1:8765`. The server creates an owner-readable `.jevgraph/access.json` file in your current directory. Copy its token into the workspace connection dialog. The server listens on loopback; it is not a production hosted service.
|
|
38
|
+
|
|
39
|
+
Choose **Get Chrome capture**, download and unzip the extension, and load that folder using **Load unpacked** at `chrome://extensions`. Open the extension's toolbar icon and connect it to the same workspace URL and token. Capture the current page or select up to 20 open tabs. Captures are private by default.
|
|
40
|
+
|
|
41
|
+
For just the dependency-free graph engine:
|
|
42
|
+
|
|
43
|
+
```bash
|
|
44
|
+
python -m pip install 'jevgraph==0.2.0a1'
|
|
45
|
+
jevgraph demo
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
The demo uses scripted fixture judgments and makes no network requests. It demonstrates traversal and caching, not live model accuracy.
|
|
49
|
+
|
|
50
|
+
## Ingest browser-agent records or JSON dumps
|
|
51
|
+
|
|
52
|
+
Use the workspace import dialog, `jevgraph ingest records.json`, or the Python client:
|
|
53
|
+
|
|
54
|
+
```python
|
|
55
|
+
import os
|
|
56
|
+
from jevgraph import IngestionClient
|
|
57
|
+
|
|
58
|
+
client = IngestionClient(
|
|
59
|
+
"http://127.0.0.1:8765",
|
|
60
|
+
os.environ["JEVGRAPH_ACCESS_TOKEN"],
|
|
61
|
+
)
|
|
62
|
+
receipt = client.ingest([{
|
|
63
|
+
"external_id": "project-42/handoff",
|
|
64
|
+
"title": "Project handoff",
|
|
65
|
+
"url": "https://example.com/projects/42",
|
|
66
|
+
"text": "The payment service depends on the identity service.",
|
|
67
|
+
"source_type": "agent",
|
|
68
|
+
"visibility": "private",
|
|
69
|
+
}])
|
|
70
|
+
print(receipt)
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
Stable external IDs update existing records instead of creating duplicates. Each batch accepts up to 50 records and 2 MB. The HTTP endpoint is `POST /api/ingest`, with a bearer token and a JSON object containing `records`.
|
|
74
|
+
|
|
75
|
+
## What it provides
|
|
76
|
+
|
|
77
|
+
- Local SQLite storage, scoped private/shared records, source previews, and import activity.
|
|
78
|
+
- Chrome page capture, selected-tab collection, persistent upload queues, explicit retries, JSON export, and workspace search.
|
|
79
|
+
- Keyword retrieval in the workspace; the engine also accepts caller-provided vectors.
|
|
80
|
+
- Optional JEV evaluation of explicit relationships, cached judgments tied to source revisions, bounded traversal, and inspectable evidence traces.
|
|
81
|
+
|
|
82
|
+
The central idea is to retain useful relationship judgments across searches instead of evaluating the same unchanged evidence repeatedly. Accuracy and cost improvements must be measured on your own workload; this release claims no benchmark advantage.
|
|
83
|
+
|
|
84
|
+
## Optional JEV exploration
|
|
85
|
+
|
|
86
|
+
Set `TYPESAFE_API_KEY` in the server environment and run `jevgraph serve --live`. Relationship exploration sends selected authorized evidence to TypeSafe. JEV is a separate API service; its model and service usage are not included in this package. Ordinary local ingestion and keyword search do not require that key.
|
|
87
|
+
|
|
88
|
+
## Current boundaries
|
|
89
|
+
|
|
90
|
+
Browser capture reads text loaded in the main frame. It is not a full export of paginated applications, PDFs, or canvas editors. It excludes form controls and editable/hidden regions and does not read browser cookies or browsing history.
|
|
91
|
+
|
|
92
|
+
Stored copies have local workspace permissions. They do not automatically inherit upstream permission changes or deletions. Managed hosting, native connectors, automatic source synchronization, workspace embedding jobs, generated answers, SSO, and billing are not included yet. Live JEV quality has not been validated for this release.
|
|
93
|
+
|
|
94
|
+
The source distribution includes `README.md`, `PRODUCT.md`, `DESIGN.md`, examples, and tests for further development. Licensed under MIT.
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
# JEVGRAPH Workspace
|
|
2
|
+
|
|
3
|
+
**Your work, connected.**
|
|
4
|
+
|
|
5
|
+
Build a horizontal workplace search product: one place to find knowledge across the tools a person uses, inspect its sources, and explore useful connections. Chrome capture is an ingestion surface and an everyday search surface. Industry-specific workflows come after the general workspace experience.
|
|
6
|
+
|
|
7
|
+
Glean is the product reference for cross-application search and browser access. Its [enterprise search](https://www.glean.com/enterprise-search) and [browser extension](https://docs.glean.com/user-guide/apps/installing-the-browser-extension) show the category. This is an independent implementation; Glean feature parity is not claimed.
|
|
8
|
+
|
|
9
|
+
## The three layers
|
|
10
|
+
|
|
11
|
+
| Layer | Product | Commercial direction | Delivered locally |
|
|
12
|
+
| --- | --- | --- | --- |
|
|
13
|
+
| Open-source engine | Records, graph judgments, evidence, retrieval, ingestion contracts | MIT engine for developers and self-hosting | Python engine, SQLite, optional workspace API, browser/agent ingestion |
|
|
14
|
+
| Hosted workspace | Search, capture, source library, managed indexing and administration | Workspace subscription plus metered ingestion/model usage | Local workspace UI/API; hosting, subscription billing and production administration remain planned |
|
|
15
|
+
| Industry products | Curated connectors, templates, permissions and workflow experiences | Packaged workspace editions and integrations | Reusable record contracts; no industry package is shipped yet |
|
|
16
|
+
|
|
17
|
+
The initial target is a small team whose useful knowledge is scattered across browser-accessible tools. The first useful moment is saving two relevant pages and finding them together in a single search. The second is following a source-supported relationship between them.
|
|
18
|
+
|
|
19
|
+
## First complete workflow
|
|
20
|
+
|
|
21
|
+
1. Start a workspace and connect the browser companion using a workspace-scoped token.
|
|
22
|
+
2. Capture the current page or explicitly select up to 20 open tabs. Chrome requests access to the selected sites when necessary.
|
|
23
|
+
3. The extension reads loaded DOM text, attaches a title and source locator, and queues each record.
|
|
24
|
+
4. The server validates and atomically upserts the batch, recording added/updated/unchanged counts. Stable external IDs prevent duplicate records on retry.
|
|
25
|
+
5. Search in the workspace app or directly in the extension. Inspect the captured source text and open the original page.
|
|
26
|
+
6. Optionally request JEV connection exploration. Only the caller's currently accessible records enter the graph or model request.
|
|
27
|
+
7. Export captured JSON or send records from a browser agent through the same ingestion API.
|
|
28
|
+
|
|
29
|
+
This version does not crawl links, click through arbitrary business applications, read browser cookies/history, or run continuously over all browsing. A page capture includes text currently loaded in the main frame; it is not a complete export of a paginated application, embedded PDF, canvas-based editor, or unopened record.
|
|
30
|
+
|
|
31
|
+
## Permission model
|
|
32
|
+
|
|
33
|
+
An access token resolves to a server-controlled `subject` and `workspace`. The ingestion payload cannot select an owner or workspace. Captures default to private; the extension always writes private records. JSON/API callers can explicitly mark a record `workspace` to share its copy within their workspace. Search, source previews, counts, and activity are scoped to the authenticated identity; only owners can delete their records.
|
|
34
|
+
|
|
35
|
+
Browser visibility is not proof of team-wide access. The local permissions model controls access to the stored copy, not the upstream application's permissions. Browser snapshots do not automatically disappear when upstream access is revoked. Production connected sources need source ACL ingestion, membership sync, revocation propagation, retention policy, and deletion processing before promising permissions parity with the original systems.
|
|
36
|
+
|
|
37
|
+
## What is implemented
|
|
38
|
+
|
|
39
|
+
- Responsive workspace UI: search, source filtering, library, previews, deletion, source inventory, and import activity.
|
|
40
|
+
- Chrome MV3 side panel: current-page capture, selected-tab collection, persistent queue, explicit failure retry, JSON export, and workspace search.
|
|
41
|
+
- Browser capture excludes form controls, editable regions, hidden DOM text, navigation and footer elements. URL cleanup drops most query parameters; explicit external IDs support records identified by route fragments.
|
|
42
|
+
- Batch ingestion API and Python client/CLI for browser agents and data dumps; up to 50 records / 2 MB per batch.
|
|
43
|
+
- Idempotent source updates, private/shared record access, per-user graph synchronization, removal of stale chunks before search.
|
|
44
|
+
- Keyword retrieval in the workspace, with optional JEV graph exploration. The underlying engine supports caller-provided vectors; the workspace does not yet provision embeddings.
|
|
45
|
+
- Attempt/usage traces for graph evaluation, ingestion receipts and local activity. These are not a subscription billing system.
|
|
46
|
+
|
|
47
|
+
## Next releases, in order
|
|
48
|
+
|
|
49
|
+
1. **Reliable connected ingestion.** Add native Drive/Slack/Notion-style connectors with durable checkpoints, source IDs, revisions, deletions, and verified ACLs. Prefer native export APIs for large collections; use browser collection where a suitable API is unavailable.
|
|
50
|
+
2. **Hybrid enterprise search.** Add embedding jobs, a vector index, incremental indexing, title/body/source ranking, and evaluations on permission-scoped queries. Preserve deterministic source relationships without paying a model to rediscover them.
|
|
51
|
+
3. **Answers with citations.** Add a separate answer-generation model over retrieved evidence, inspectable citations, unresolved questions and contradiction handling. JEV continues to evaluate relationships and retrieval choices.
|
|
52
|
+
4. **Hosted operations.** Organization accounts, SSO, team/group membership, scoped credentials, background jobs, retries, quotas, ingestion dashboards, retention, backups, monitoring and usage metering. Add paid plans after pilot workloads establish unit costs.
|
|
53
|
+
5. **Browser agent collections.** User-defined collections with a bounded URL/record worklist, approved origins, page limits, source-specific pagination, resume checkpoints and a receipt per record. Agents submit normalized records through the existing API; website credentials need not be sent to JEVGRAPH.
|
|
54
|
+
6. **Industry editions.** Package source mappings, vocabularies and workflow interfaces for legal operations, support and engineering on the same workspace foundation.
|
|
55
|
+
|
|
56
|
+
## Product validation
|
|
57
|
+
|
|
58
|
+
For the first pilot, measure capture success, time from capture to search, duplicate/update behavior, permission leakage, source freshness, search success on known questions, and weekly repeat use. For JEV exploration, measure supported-path recall, incorrect stopping, latency, attempted calls, and provider usage separately from basic search.
|
|
59
|
+
|
|
60
|
+
The initial advantage to test is quick browser-to-workspace ingestion plus reusable relationship judgments. The long-term product depends on connector quality, access correctness, retrieval quality, and a useful everyday interface.
|
|
61
|
+
|
|
62
|
+
## Running the local product
|
|
63
|
+
|
|
64
|
+
```bash
|
|
65
|
+
uv sync --extra server --extra dev
|
|
66
|
+
uv run jevgraph serve
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
Open `http://127.0.0.1:8765`. The command writes a token mapping to `.jevgraph/access.json` with owner-only file permissions. Copy your token into the workspace connection dialog. The server binds to loopback and is intended for local evaluation, not public deployment.
|
|
70
|
+
|
|
71
|
+
For Chrome, download the extension from **Get Chrome capture**, unzip it, and use **Load unpacked** on `chrome://extensions`. You can also load `src/jevgraph/extension` directly. In the side panel, set the workspace URL and token. Click the toolbar icon on the page before using **Capture this page**; selected-tab capture requests the required site access separately.
|
|
72
|
+
|
|
73
|
+
To enable optional model-backed exploration:
|
|
74
|
+
|
|
75
|
+
```bash
|
|
76
|
+
export TYPESAFE_API_KEY="your-server-side-key"
|
|
77
|
+
uv run jevgraph serve --live
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
Ordinary ingestion/search stays local. Requesting an exploration sends selected authorized evidence to TypeSafe. The live key stays on the server, never in the extension.
|
|
81
|
+
|
|
82
|
+
## Browser agents and JSON dumps
|
|
83
|
+
|
|
84
|
+
```json
|
|
85
|
+
{
|
|
86
|
+
"records": [
|
|
87
|
+
{
|
|
88
|
+
"external_id": "docs/project-42/record-7",
|
|
89
|
+
"title": "Project handoff",
|
|
90
|
+
"url": "https://example.com/project/42",
|
|
91
|
+
"text": "The source text collected by the browser agent…",
|
|
92
|
+
"source_type": "agent",
|
|
93
|
+
"visibility": "private"
|
|
94
|
+
}
|
|
95
|
+
]
|
|
96
|
+
}
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
`external_id` should remain stable across updates. If omitted, the cleaned URL is used. Supply it explicitly for single-page apps whose records share a URL. Each record may contain up to 100,000 characters; the server chunks its text for retrieval.
|
|
100
|
+
|
|
101
|
+
Use the import dialog, `POST /api/ingest` with `Authorization: Bearer ...`, or:
|
|
102
|
+
|
|
103
|
+
```bash
|
|
104
|
+
# Uses the single local token in .jevgraph/access.json, or JEVGRAPH_ACCESS_TOKEN.
|
|
105
|
+
uv run jevgraph ingest captured-records.json --server http://127.0.0.1:8765
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
```python
|
|
109
|
+
import os
|
|
110
|
+
from jevgraph import IngestionClient
|
|
111
|
+
|
|
112
|
+
client = IngestionClient("http://127.0.0.1:8765", os.environ["JEVGRAPH_ACCESS_TOKEN"])
|
|
113
|
+
receipt = client.ingest(records) # dictionaries in the format above
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
The extension retains its latest 20 capture jobs locally for retry/export. **Clear finished** removes completed/failed queue records. Failed HTTP requests are explicitly retried by the user; repeated batches update the same records. Site permissions remain in Chrome until revoked through extension settings.
|
|
117
|
+
|
|
118
|
+
## Delivery boundaries
|
|
119
|
+
|
|
120
|
+
The current product runs locally. It has not been deployed as a hosted service or submitted to the Chrome Web Store. This independent project shares the JevGraph name with other projects. Real MV3 capture-to-ingestion-to-search is tested with synthetic local pages; live JEV quality and production connector behavior need separate evaluation. A Python package release distributes the engine, local app, and extension files; it does not deploy a cloud workspace.
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
# JEVGRAPH
|
|
2
|
+
|
|
3
|
+
**Your work, connected. Capture in the browser. Search in one workspace.**
|
|
4
|
+
|
|
5
|
+
JEVGRAPH includes a workspace search app, a Chrome capture extension, and a Python graph engine. Collect browser pages or import data dumps, search your private workspace, and optionally use JEV to explore relationships between source records.
|
|
6
|
+
|
|
7
|
+
Start the product with `uv sync --extra server --extra dev`, then `uv run jevgraph serve`. Open the local URL printed by the server and connect using the token in `.jevgraph/access.json`. Download Chrome capture from the workspace, or load `src/jevgraph/extension` as an unpacked extension. [PRODUCT.md](PRODUCT.md) covers setup, browser-agent ingestion, access controls, and the open-source/hosted/industry product plan.
|
|
8
|
+
|
|
9
|
+
The core premise: **every search can leave behind a small, reusable graph of evidence.** Vectors and text retrieval find candidate records. JEV judges explicit relationships. A bounded search follows useful connections and returns the path, source records, uncertainty, and decision trace to an answering agent.
|
|
10
|
+
|
|
11
|
+
Status: local alpha, version `0.2.0a1`. The code is MIT licensed. Other projects already use the JevGraph name, including [chenmingtang830/jevgraph](https://github.com/chenmingtang830/jevgraph); this project is independent. `README_PYPI.md` contains the distribution's installation instructions and current boundaries. The source-checkout instructions below also work without a registry release.
|
|
12
|
+
|
|
13
|
+
```mermaid
|
|
14
|
+
flowchart LR
|
|
15
|
+
Q[Question] --> R[Text and vector candidates]
|
|
16
|
+
R --> J[JEV relationship judgments]
|
|
17
|
+
J --> G[Reusable graph memory]
|
|
18
|
+
G --> N[JEV guides traversal]
|
|
19
|
+
N --> R
|
|
20
|
+
N --> P[Evidence paths and search trace]
|
|
21
|
+
P --> A[Your answering agent]
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
## The product idea
|
|
25
|
+
|
|
26
|
+
An agent investigating a failing identity service should be able to start at a checkout endpoint, find the payment service it calls, follow that service's identity dependency, and hand back the complete evidence trail. A second question should reuse the relationship work already done. If the architecture changes, affected judgments must be invalidated.
|
|
27
|
+
|
|
28
|
+
Two distinct kinds of information make this possible:
|
|
29
|
+
|
|
30
|
+
- **Relationship memory:** source A supports the directed claim that service X depends on service Y. This judgment is reusable across questions, within the same source revisions, schema, and judge version.
|
|
31
|
+
- **Search decisions:** this particular relationship looks useful for the current question. These scores stay in the query trace and never become durable relationship facts.
|
|
32
|
+
|
|
33
|
+
The intended benefit is less repeated relationship evaluation and better inspection of multi-hop retrieval. These are hypotheses to measure; this alpha makes no comparative accuracy, cost, speed, or novelty claims. See [DESIGN.md](DESIGN.md) for the premise, boundaries, and evaluation plan.
|
|
34
|
+
|
|
35
|
+
## Run it in a minute
|
|
36
|
+
|
|
37
|
+
Requires Python 3.11 or later. From this directory:
|
|
38
|
+
|
|
39
|
+
```bash
|
|
40
|
+
python3.11 -m pip install -e .
|
|
41
|
+
jevgraph demo
|
|
42
|
+
python3.11 examples/quickstart.py
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
Or with uv:
|
|
46
|
+
|
|
47
|
+
```bash
|
|
48
|
+
uv sync --extra dev --extra server
|
|
49
|
+
uv run jevgraph demo
|
|
50
|
+
uv run python examples/quickstart.py
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
The default demo uses **hard-coded fixture judgments**, no API key and no network. It exercises a three-hop path:
|
|
54
|
+
|
|
55
|
+
```text
|
|
56
|
+
edgerouter -> checkout -> payments -> identity
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
It also includes a rejected dependency on LegacyAuth. The cold/warm example demonstrates cache behavior, not model quality or an end-to-end performance benchmark.
|
|
60
|
+
|
|
61
|
+
Persist the graph and inspect a full trace:
|
|
62
|
+
|
|
63
|
+
```bash
|
|
64
|
+
jevgraph demo --db demo.sqlite --out runs/first.json
|
|
65
|
+
jevgraph demo --db demo.sqlite --out runs/second.json
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
Run those same synthetic records through real JEV:
|
|
69
|
+
|
|
70
|
+
```bash
|
|
71
|
+
export TYPESAFE_API_KEY="your-key"
|
|
72
|
+
jevgraph demo --live --db live-demo.sqlite --out runs/live.json
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
`--live` sends the synthetic node text, query, and selected paths to TypeSafe. It uses at most 32 attempted evaluations and 100 typed questions for the demo. Live results can differ from the scripted path. The prototype has no automatic retries, and failures return a partial trace with `provider_error`.
|
|
76
|
+
|
|
77
|
+
## Python API
|
|
78
|
+
|
|
79
|
+
```python
|
|
80
|
+
from jevgraph import Budget, Graph, JevJudge, Node, Relation
|
|
81
|
+
|
|
82
|
+
with Graph(
|
|
83
|
+
"knowledge.sqlite",
|
|
84
|
+
name="architecture",
|
|
85
|
+
judge=JevJudge(), # reads TYPESAFE_API_KEY; pinned model by default
|
|
86
|
+
relations=[Relation(
|
|
87
|
+
"depends_on",
|
|
88
|
+
"The source service requires the target service to perform its function.",
|
|
89
|
+
source_kind="service",
|
|
90
|
+
target_kind="service",
|
|
91
|
+
)],
|
|
92
|
+
) as graph:
|
|
93
|
+
graph.add(Node(
|
|
94
|
+
"checkout", "Checkout sends card charges to Payments and depends on it.",
|
|
95
|
+
kind="service", source="architecture.md#checkout",
|
|
96
|
+
))
|
|
97
|
+
graph.add(Node(
|
|
98
|
+
"payments", "Payments authenticates through Identity and depends on it.",
|
|
99
|
+
kind="service", source="architecture.md#payments",
|
|
100
|
+
))
|
|
101
|
+
graph.add(Node(
|
|
102
|
+
"identity", "Identity issues tokens for signed-in sessions.",
|
|
103
|
+
kind="service", source="architecture.md#identity",
|
|
104
|
+
))
|
|
105
|
+
|
|
106
|
+
result = graph.search(
|
|
107
|
+
"Find the service dependency path from Checkout to Identity.",
|
|
108
|
+
start=["checkout"],
|
|
109
|
+
budget=Budget(max_calls=12, max_questions=40, max_hops=3),
|
|
110
|
+
)
|
|
111
|
+
print(result.stop_reason)
|
|
112
|
+
print(result.to_dict()) # evidence, paths, judgments, usage, and stop reason
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
Each `Node` is a supplied record, passage, or entity with supporting text. You choose stable IDs and relation definitions. Node text is capped at 6000 characters; chunk larger sources before adding them. Entity extraction, source-code parsing, document conversion, and answer writing belong in upstream/downstream adapters.
|
|
116
|
+
|
|
117
|
+
`graph.relate(source_id, target_id)` judges a specific pair for every applicable predicate in one call; it is useful when an existing parser already produces candidate pairs. Predicates are judged independently, so a pair can have more than one relationship. Multiple named graphs can share a SQLite file.
|
|
118
|
+
|
|
119
|
+
## Vectors
|
|
120
|
+
|
|
121
|
+
Supply embeddings in `Node(..., vector=...)`, declare their model/version as `Graph(..., embedding_space="your-model-version")`, and pass a query embedding to `search(..., vector=...)` or `retrieve(..., vector=...)`.
|
|
122
|
+
|
|
123
|
+
The prototype fuses lexical and cosine rankings using reciprocal-rank fusion. It performs exact, exhaustive local retrieval; it does not ship an embedding model, approximate-nearest-neighbor index, or hosted database. All vectors in a graph must use one declared embedding space and dimension. You are responsible for using the same embedding model for records and queries. Updating a node without its vector explicitly removes that vector.
|
|
124
|
+
|
|
125
|
+
## Relationship and search contracts
|
|
126
|
+
|
|
127
|
+
- Each directed predicate receives independent JEV Noul questions for **support** and **contradiction**, with only its two source records as evidence. The query is excluded.
|
|
128
|
+
- Judgments are `supported`, `contradicted`, `unsupported`, or `uncertain`. Only `supported` judgments are traversed. A high score for both support and contradiction remains uncertain.
|
|
129
|
+
- Every judgment stores the exact supplied record text, source reference, content revision, relation, scores, and model. Source references are caller supplied; no byte offsets into an original file are invented.
|
|
130
|
+
- Cache keys include source revisions, relationship definition, judge identity, graph namespace, and rubric revision. Updating/deleting a node invalidates its incident judgments. Changed thresholds reclassify cached scores.
|
|
131
|
+
- JEV scores proposed path extensions and checks whether the current path answers the query. Search can follow edges in either direction while retaining the original directed claim.
|
|
132
|
+
- Calls, typed questions, candidates per node, hops, and expanded paths are bounded. `goal_reached` is a model judgment; `no_seeds`, `frontier_exhausted`, `budget_exhausted`, `max_hops`, `max_expansions`, and `provider_error` describe other outcomes.
|
|
133
|
+
- Path priority uses the minimum of edge-support and route scores along the path. It is a ranking heuristic, not a calibrated probability for the whole answer.
|
|
134
|
+
|
|
135
|
+
JEV exposes typed decisions through its [System One API](https://docs.typesafe.ai/api). Noul returns a yes-probability; it does not have the separate confidence field used by Choice/Score. Defaults here are starting policies, not measured calibration. See TypeSafe's [confidence guidance](https://docs.typesafe.ai/confidence).
|
|
136
|
+
|
|
137
|
+
## Current limits
|
|
138
|
+
|
|
139
|
+
This is a small-corpus, synchronous reference implementation. It scans local records, considers a bounded candidate pool, and may miss relationships that retrieval never proposes. It cannot discover unnamed entities, guarantee exhaustive dependency impact, infer arbitrary new predicates, or prove source claims are true. Text is retained locally in SQLite and included in exported traces. Live JEV evaluates the selected text externally.
|
|
140
|
+
|
|
141
|
+
The low-level graph namespaces are not an authentication boundary. The optional workspace server adds authenticated owner/workspace access checks before retrieval; it is a local prototype, not production enterprise identity management. There is no autonomous browser crawler, MCP server, distributed ingestion, temporal conflict resolver, or answer-generation model yet. Existing sources with conflicting claims remain evidence to inspect. A JEV request may be rejected by the 32 KB payload cap rather than truncated. Treat `Graph` as a single-threaded object.
|
|
142
|
+
|
|
143
|
+
## Development
|
|
144
|
+
|
|
145
|
+
```bash
|
|
146
|
+
uv sync --extra dev --extra server
|
|
147
|
+
uv run pytest
|
|
148
|
+
uv run ruff check .
|
|
149
|
+
uv build
|
|
150
|
+
npm ci
|
|
151
|
+
npx playwright install chromium
|
|
152
|
+
npm run test:browser
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
Python tests cover the engine, access scopes, batch ingestion, updates/deletions, source filtering, and the JEV HTTP contract. JEV responses are simulated. Browser QA runs the actual MV3 extension against synthetic local pages and the real ingestion server, including a failed-upload retry, export/reimport, and desktop/mobile UI checks. [CONTRIBUTING.md](CONTRIBUTING.md) describes contribution expectations.
|
|
156
|
+
|
|
157
|
+
## Related work
|
|
158
|
+
|
|
159
|
+
- [neo4jev](https://github.com/jexp/neo4jev) explores JEV-guided traversal over existing Neo4j graphs.
|
|
160
|
+
- [chenmingtang830/jevgraph](https://github.com/chenmingtang830/jevgraph) builds candidate knowledge graphs from documents using schema-guided relation decisions.
|
|
161
|
+
- [neo4j-field/jev-graphrag](https://github.com/neo4j-field/jev-graphrag) explores JEV decisions in GraphRAG workflows.
|
|
162
|
+
|
|
163
|
+
These are research references, not bundled dependencies. This package's experiment combines lazy relationship discovery, reusable judgments, and query-scoped traversal in a local Python API. It is an independent community prototype, with no claimed affiliation with TypeSafe or the projects above.
|
|
164
|
+
|
|
165
|
+
## License
|
|
166
|
+
|
|
167
|
+
[MIT](LICENSE). The package's license does not cover the external JEV service, embedding providers, or user-supplied source data.
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
# JEVGRAPH
|
|
2
|
+
|
|
3
|
+
**Capture in the browser. Search in one workspace. Follow the evidence.**
|
|
4
|
+
|
|
5
|
+
JEVGRAPH is an MIT-licensed Python graph engine with an optional local workplace search app and a bundled Chrome extension. It connects browser capture and agent ingestion to a searchable source library, with optional JEV relationship evaluation and bounded graph traversal.
|
|
6
|
+
|
|
7
|
+
Version **0.2.0a1 is an alpha release** for local evaluation. Python 3.11 or newer is required. This is an independent project; other projects also use the JevGraph name.
|
|
8
|
+
|
|
9
|
+
## Install and run
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
python -m pip install 'jevgraph[server]==0.2.0a1'
|
|
13
|
+
jevgraph serve
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
Open `http://127.0.0.1:8765`. The server creates an owner-readable `.jevgraph/access.json` file in your current directory. Copy its token into the workspace connection dialog. The server listens on loopback; it is not a production hosted service.
|
|
17
|
+
|
|
18
|
+
Choose **Get Chrome capture**, download and unzip the extension, and load that folder using **Load unpacked** at `chrome://extensions`. Open the extension's toolbar icon and connect it to the same workspace URL and token. Capture the current page or select up to 20 open tabs. Captures are private by default.
|
|
19
|
+
|
|
20
|
+
For just the dependency-free graph engine:
|
|
21
|
+
|
|
22
|
+
```bash
|
|
23
|
+
python -m pip install 'jevgraph==0.2.0a1'
|
|
24
|
+
jevgraph demo
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
The demo uses scripted fixture judgments and makes no network requests. It demonstrates traversal and caching, not live model accuracy.
|
|
28
|
+
|
|
29
|
+
## Ingest browser-agent records or JSON dumps
|
|
30
|
+
|
|
31
|
+
Use the workspace import dialog, `jevgraph ingest records.json`, or the Python client:
|
|
32
|
+
|
|
33
|
+
```python
|
|
34
|
+
import os
|
|
35
|
+
from jevgraph import IngestionClient
|
|
36
|
+
|
|
37
|
+
client = IngestionClient(
|
|
38
|
+
"http://127.0.0.1:8765",
|
|
39
|
+
os.environ["JEVGRAPH_ACCESS_TOKEN"],
|
|
40
|
+
)
|
|
41
|
+
receipt = client.ingest([{
|
|
42
|
+
"external_id": "project-42/handoff",
|
|
43
|
+
"title": "Project handoff",
|
|
44
|
+
"url": "https://example.com/projects/42",
|
|
45
|
+
"text": "The payment service depends on the identity service.",
|
|
46
|
+
"source_type": "agent",
|
|
47
|
+
"visibility": "private",
|
|
48
|
+
}])
|
|
49
|
+
print(receipt)
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
Stable external IDs update existing records instead of creating duplicates. Each batch accepts up to 50 records and 2 MB. The HTTP endpoint is `POST /api/ingest`, with a bearer token and a JSON object containing `records`.
|
|
53
|
+
|
|
54
|
+
## What it provides
|
|
55
|
+
|
|
56
|
+
- Local SQLite storage, scoped private/shared records, source previews, and import activity.
|
|
57
|
+
- Chrome page capture, selected-tab collection, persistent upload queues, explicit retries, JSON export, and workspace search.
|
|
58
|
+
- Keyword retrieval in the workspace; the engine also accepts caller-provided vectors.
|
|
59
|
+
- Optional JEV evaluation of explicit relationships, cached judgments tied to source revisions, bounded traversal, and inspectable evidence traces.
|
|
60
|
+
|
|
61
|
+
The central idea is to retain useful relationship judgments across searches instead of evaluating the same unchanged evidence repeatedly. Accuracy and cost improvements must be measured on your own workload; this release claims no benchmark advantage.
|
|
62
|
+
|
|
63
|
+
## Optional JEV exploration
|
|
64
|
+
|
|
65
|
+
Set `TYPESAFE_API_KEY` in the server environment and run `jevgraph serve --live`. Relationship exploration sends selected authorized evidence to TypeSafe. JEV is a separate API service; its model and service usage are not included in this package. Ordinary local ingestion and keyword search do not require that key.
|
|
66
|
+
|
|
67
|
+
## Current boundaries
|
|
68
|
+
|
|
69
|
+
Browser capture reads text loaded in the main frame. It is not a full export of paginated applications, PDFs, or canvas editors. It excludes form controls and editable/hidden regions and does not read browser cookies or browsing history.
|
|
70
|
+
|
|
71
|
+
Stored copies have local workspace permissions. They do not automatically inherit upstream permission changes or deletions. Managed hosting, native connectors, automatic source synchronization, workspace embedding jobs, generated answers, SSO, and billing are not included yet. Live JEV quality has not been validated for this release.
|
|
72
|
+
|
|
73
|
+
The source distribution includes `README.md`, `PRODUCT.md`, `DESIGN.md`, examples, and tests for further development. Licensed under MIT.
|