torbot 4.3.0__tar.gz → 4.3.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (69) hide show
  1. torbot-4.3.1/.github/workflows/flake8.yml +33 -0
  2. torbot-4.3.1/.github/workflows/pytest.yml +37 -0
  3. {torbot-4.3.0 → torbot-4.3.1}/PKG-INFO +32 -5
  4. {torbot-4.3.0 → torbot-4.3.1}/README.md +29 -1
  5. torbot-4.3.1/docs/ANALYST.md +82 -0
  6. {torbot-4.3.0 → torbot-4.3.1}/docs/CHANGELOG.md +19 -0
  7. torbot-4.3.1/docs/CRAWL_RESULT.md +41 -0
  8. {torbot-4.3.0 → torbot-4.3.1}/pyproject.toml +5 -3
  9. {torbot-4.3.0 → torbot-4.3.1}/requirements.txt +5 -5
  10. torbot-4.3.1/schemas/crawl-result.v1.schema.json +33 -0
  11. torbot-4.3.1/schemas/investigation-report.v1.schema.json +26 -0
  12. torbot-4.3.1/src/torbot/analyst.py +486 -0
  13. {torbot-4.3.0 → torbot-4.3.1}/src/torbot/cli.py +82 -3
  14. torbot-4.3.1/src/torbot/crawl_result.py +193 -0
  15. {torbot-4.3.0 → torbot-4.3.1}/src/torbot/modules/linktree.py +65 -3
  16. torbot-4.3.1/tests/fixtures/analyst-safe-crawl.json +34 -0
  17. torbot-4.3.1/tests/fixtures/gotor-v1-success.json +13 -0
  18. torbot-4.3.1/tests/fixtures/torbot-v1-cancelled.json +1 -0
  19. torbot-4.3.1/tests/fixtures/torbot-v1-invalid.json +1 -0
  20. torbot-4.3.1/tests/fixtures/torbot-v1-partial.json +1 -0
  21. torbot-4.3.1/tests/fixtures/torbot-v1-skipped.json +1 -0
  22. torbot-4.3.1/tests/test_analyst.py +182 -0
  23. {torbot-4.3.0 → torbot-4.3.1}/tests/test_cli_and_crawler.py +20 -0
  24. torbot-4.3.1/tests/test_crawl_result.py +83 -0
  25. torbot-4.3.1/tests/test_export_paths.py +38 -0
  26. torbot-4.3.0/.env +0 -1
  27. torbot-4.3.0/.github/workflows/flake8.yml +0 -26
  28. torbot-4.3.0/.github/workflows/pytest.yml +0 -34
  29. {torbot-4.3.0 → torbot-4.3.1}/.flake8 +0 -0
  30. {torbot-4.3.0 → torbot-4.3.1}/.gitattributes +0 -0
  31. {torbot-4.3.0 → torbot-4.3.1}/.github/FUNDING.yml +0 -0
  32. {torbot-4.3.0 → torbot-4.3.1}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  33. {torbot-4.3.0 → torbot-4.3.1}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  34. {torbot-4.3.0 → torbot-4.3.1}/.github/pull_request_template.md +0 -0
  35. {torbot-4.3.0 → torbot-4.3.1}/.gitignore +0 -0
  36. {torbot-4.3.0 → torbot-4.3.1}/CITATION.cff +0 -0
  37. {torbot-4.3.0 → torbot-4.3.1}/Dockerfile +0 -0
  38. {torbot-4.3.0 → torbot-4.3.1}/LICENSE.md +0 -0
  39. {torbot-4.3.0 → torbot-4.3.1}/TESTING.md +0 -0
  40. {torbot-4.3.0 → torbot-4.3.1}/docs/CODE_OF_CONDUCT.md +0 -0
  41. {torbot-4.3.0 → torbot-4.3.1}/docs/DESKTOP_APP.md +0 -0
  42. {torbot-4.3.0 → torbot-4.3.1}/docs/Tor.md +0 -0
  43. {torbot-4.3.0 → torbot-4.3.1}/main.py +0 -0
  44. {torbot-4.3.0 → torbot-4.3.1}/run_tests.py +0 -0
  45. {torbot-4.3.0 → torbot-4.3.1}/scripts/build.sh +0 -0
  46. {torbot-4.3.0 → torbot-4.3.1}/scripts/install.sh +0 -0
  47. {torbot-4.3.0 → torbot-4.3.1}/scripts/publish.sh +0 -0
  48. {torbot-4.3.0 → torbot-4.3.1}/scripts/remove.sh +0 -0
  49. {torbot-4.3.0 → torbot-4.3.1}/scripts/update-requirements.sh +0 -0
  50. {torbot-4.3.0 → torbot-4.3.1}/src/torbot/__init__.py +0 -0
  51. {torbot-4.3.0 → torbot-4.3.1}/src/torbot/modules/__init__.py +0 -0
  52. {torbot-4.3.0 → torbot-4.3.1}/src/torbot/modules/api.py +0 -0
  53. {torbot-4.3.0 → torbot-4.3.1}/src/torbot/modules/app_launcher.py +0 -0
  54. {torbot-4.3.0 → torbot-4.3.1}/src/torbot/modules/color.py +0 -0
  55. {torbot-4.3.0 → torbot-4.3.1}/src/torbot/modules/config.py +0 -0
  56. {torbot-4.3.0 → torbot-4.3.1}/src/torbot/modules/info.py +0 -0
  57. {torbot-4.3.0 → torbot-4.3.1}/src/torbot/modules/nlp/README.md +0 -0
  58. {torbot-4.3.0 → torbot-4.3.1}/src/torbot/modules/nlp/__init__.py +0 -0
  59. {torbot-4.3.0 → torbot-4.3.1}/src/torbot/modules/nlp/gather_data.py +0 -0
  60. {torbot-4.3.0 → torbot-4.3.1}/src/torbot/modules/nlp/main.py +0 -0
  61. {torbot-4.3.0 → torbot-4.3.1}/src/torbot/modules/nlp/website_classification.csv +0 -0
  62. {torbot-4.3.0 → torbot-4.3.1}/src/torbot/modules/updater.py +0 -0
  63. {torbot-4.3.0 → torbot-4.3.1}/tests/__init__.py +0 -0
  64. {torbot-4.3.0 → torbot-4.3.1}/tests/conftest.py +0 -0
  65. {torbot-4.3.0 → torbot-4.3.1}/tests/test_api.py +0 -0
  66. {torbot-4.3.0 → torbot-4.3.1}/tests/test_linktree.py +0 -0
  67. {torbot-4.3.0 → torbot-4.3.1}/tests/test_linktree_extra.py +0 -0
  68. {torbot-4.3.0 → torbot-4.3.1}/tests/test_linktree_tree.py +0 -0
  69. {torbot-4.3.0 → torbot-4.3.1}/tests/test_nlp.py +0 -0
@@ -0,0 +1,33 @@
1
+ name: Flake8
2
+
3
+ on:
4
+ push:
5
+ branches: [ "dev" ]
6
+ pull_request:
7
+ branches: [ "dev" ]
8
+
9
+ permissions:
10
+ contents: read
11
+
12
+ jobs:
13
+ lint:
14
+ runs-on: ubuntu-latest
15
+ strategy:
16
+ fail-fast: false
17
+ matrix:
18
+ python-version: ["3.10", "3.11", "3.12"]
19
+ steps:
20
+ - name: Check out repository
21
+ uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
22
+ - name: Set up Python ${{ matrix.python-version }}
23
+ uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
24
+ with:
25
+ python-version: ${{ matrix.python-version }}
26
+ cache: pip
27
+ cache-dependency-path: pyproject.toml
28
+ - name: Install dependencies
29
+ run: |
30
+ python -m pip install --upgrade pip
31
+ python -m pip install flake8
32
+ - name: Analysing the code with flake8
33
+ run: flake8 --per-file-ignores="__init__.py:F401" .
@@ -0,0 +1,37 @@
1
+ name: Pytest
2
+
3
+ on:
4
+ push:
5
+ branches: [ "dev" ]
6
+ pull_request:
7
+ branches: [ "dev" ]
8
+
9
+ permissions:
10
+ contents: read
11
+
12
+ jobs:
13
+ test:
14
+ runs-on: ubuntu-latest
15
+ strategy:
16
+ fail-fast: false
17
+ matrix:
18
+ python-version: ["3.10", "3.11", "3.12"]
19
+
20
+ steps:
21
+ - name: Check out repository
22
+ uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
23
+ - name: Set up Python ${{ matrix.python-version }}
24
+ uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
25
+ with:
26
+ python-version: ${{ matrix.python-version }}
27
+ cache: pip
28
+ cache-dependency-path: |
29
+ requirements.txt
30
+ pyproject.toml
31
+ - name: Install dependencies
32
+ run: |
33
+ python -m pip install --upgrade pip
34
+ python -m pip install -r requirements.txt
35
+ python -m pip install --no-deps -e .
36
+ - name: Test with pytest
37
+ run: pytest
@@ -1,16 +1,15 @@
1
- Metadata-Version: 2.4
1
+ Metadata-Version: 2.5
2
2
  Name: torbot
3
- Version: 4.3.0
3
+ Version: 4.3.1
4
4
  Summary: TorBot is an OSINT tool for the dark web.
5
5
  Author-email: Akeem King <akeemtlking@gmail.com>, PS Narayanan <thepsnarayanan@gmail.com>
6
6
  License-File: LICENSE.md
7
7
  Classifier: Operating System :: OS Independent
8
8
  Classifier: Programming Language :: Python :: 3
9
- Classifier: Programming Language :: Python :: 3.9
10
9
  Classifier: Programming Language :: Python :: 3.10
11
10
  Classifier: Programming Language :: Python :: 3.11
12
11
  Classifier: Programming Language :: Python :: 3.12
13
- Requires-Python: >=3.9
12
+ Requires-Python: >=3.10
14
13
  Requires-Dist: altgraph>=0.17.4
15
14
  Requires-Dist: beautifulsoup4>=4.12.3
16
15
  Requires-Dist: certifi>=2024.7.4
@@ -95,7 +94,7 @@ Description-Content-Type: text/markdown
95
94
 
96
95
  ### Dependencies
97
96
  - Tor (Optional)
98
- - Python 3.9+
97
+ - Python 3.10+
99
98
  - pip
100
99
 
101
100
  ## Quick start
@@ -109,6 +108,16 @@ python -m pip install -r requirements.txt
109
108
  python -m pip install -e .
110
109
  ```
111
110
 
111
+ ### Install with OTinstaller (Linux)
112
+ [OTinstaller](https://github.com/OSINTVerseHQ/OTinstaller) is a third-party tool manager that installs the `torbot` PyPI release into its own virtualenv. It is not maintained by the TorBot team, so please report problems with it [on the OTinstaller tracker](https://github.com/OSINTVerseHQ/OTinstaller/issues).
113
+ ```sh
114
+ pipx install otinstaller
115
+ otinstaller init
116
+ otinstaller install torbot
117
+ # url:... is passed to TorBot as -u; the other flags go through unchanged
118
+ otinstaller run torbot -- url:https://example.com --depth 2 --visualize table
119
+ ```
120
+
112
121
  ### Run the CLI
113
122
  ```sh
114
123
  python main.py --help
@@ -131,6 +140,24 @@ python main.py -u https://example.com --disable-socks5 --visualize tree
131
140
  torbot app
132
141
  ```
133
142
 
143
+ ### Evidence-first AI analysis
144
+
145
+ Save a versioned crawl result and turn it into a cited investigation bundle:
146
+
147
+ ```sh
148
+ torbot --url https://example.com --disable-socks5 \
149
+ --save result --result-file crawl-result.json
150
+ torbot analyze crawl-result.json --provider ollama --model qwen3 \
151
+ --output investigation/
152
+ ```
153
+
154
+ Analyst defaults to a local Ollama endpoint. Remote OpenAI-compatible
155
+ providers require the explicit `--allow-remote` flag. Every supported finding
156
+ must cite captured evidence, and a provider outage never prevents the
157
+ deterministic evidence bundle from being written. See
158
+ [TorBot Analyst](docs/ANALYST.md) for the offline quick start, output formats,
159
+ privacy boundary, and schemas.
160
+
134
161
  ### Options
135
162
  ```text
136
163
  usage: Gather and analyze data from Tor sites.
@@ -48,7 +48,7 @@
48
48
 
49
49
  ### Dependencies
50
50
  - Tor (Optional)
51
- - Python 3.9+
51
+ - Python 3.10+
52
52
  - pip
53
53
 
54
54
  ## Quick start
@@ -62,6 +62,16 @@ python -m pip install -r requirements.txt
62
62
  python -m pip install -e .
63
63
  ```
64
64
 
65
+ ### Install with OTinstaller (Linux)
66
+ [OTinstaller](https://github.com/OSINTVerseHQ/OTinstaller) is a third-party tool manager that installs the `torbot` PyPI release into its own virtualenv. It is not maintained by the TorBot team, so please report problems with it [on the OTinstaller tracker](https://github.com/OSINTVerseHQ/OTinstaller/issues).
67
+ ```sh
68
+ pipx install otinstaller
69
+ otinstaller init
70
+ otinstaller install torbot
71
+ # url:... is passed to TorBot as -u; the other flags go through unchanged
72
+ otinstaller run torbot -- url:https://example.com --depth 2 --visualize table
73
+ ```
74
+
65
75
  ### Run the CLI
66
76
  ```sh
67
77
  python main.py --help
@@ -84,6 +94,24 @@ python main.py -u https://example.com --disable-socks5 --visualize tree
84
94
  torbot app
85
95
  ```
86
96
 
97
+ ### Evidence-first AI analysis
98
+
99
+ Save a versioned crawl result and turn it into a cited investigation bundle:
100
+
101
+ ```sh
102
+ torbot --url https://example.com --disable-socks5 \
103
+ --save result --result-file crawl-result.json
104
+ torbot analyze crawl-result.json --provider ollama --model qwen3 \
105
+ --output investigation/
106
+ ```
107
+
108
+ Analyst defaults to a local Ollama endpoint. Remote OpenAI-compatible
109
+ providers require the explicit `--allow-remote` flag. Every supported finding
110
+ must cite captured evidence, and a provider outage never prevents the
111
+ deterministic evidence bundle from being written. See
112
+ [TorBot Analyst](docs/ANALYST.md) for the offline quick start, output formats,
113
+ privacy boundary, and schemas.
114
+
87
115
  ### Options
88
116
  ```text
89
117
  usage: Gather and analyze data from Tor sites.
@@ -0,0 +1,82 @@
1
+ # TorBot Analyst
2
+
3
+ TorBot Analyst turns a versioned crawl result into a local investigation
4
+ bundle. It records stable evidence IDs and content hashes, maps page and
5
+ contact relationships, and requires every supported finding to reference
6
+ captured evidence.
7
+
8
+ ## Five-minute quick start
9
+
10
+ Create a deterministic report without an AI provider:
11
+
12
+ ```sh
13
+ torbot analyze tests/fixtures/analyst-safe-crawl.json \
14
+ --provider none \
15
+ --keyword example \
16
+ --output investigation/
17
+ ```
18
+
19
+ The output contains:
20
+
21
+ - `report.md` with supported, conflicted, and unsupported findings
22
+ - `evidence.jsonl` with captured URLs, excerpts, timestamps, and hashes
23
+ - `graph.json` with evidence-linked page and contact relationships
24
+ - `run.json` with reproducibility metadata and provider warnings
25
+
26
+ ## Capture a crawl result
27
+
28
+ The existing tree and JSON outputs are unchanged. Save the new versioned
29
+ result explicitly:
30
+
31
+ ```sh
32
+ torbot --url https://example.com \
33
+ --disable-socks5 \
34
+ --save result \
35
+ --result-file crawl-result.json
36
+ ```
37
+
38
+ The versioned result contains bounded visible text, not raw HTML, scripts,
39
+ styles, cookies, headers, credentials, or arbitrary exception messages.
40
+
41
+ ## Local AI analysis
42
+
43
+ Ollama is the default provider and is contacted only on localhost:
44
+
45
+ ```sh
46
+ torbot analyze crawl-result.json \
47
+ --provider ollama \
48
+ --model qwen3 \
49
+ --output investigation/
50
+ ```
51
+
52
+ If Ollama or the model is unavailable, TorBot still writes the deterministic
53
+ evidence bundle and records a warning in `run.json` and `report.md`.
54
+
55
+ ## Remote OpenAI-compatible providers
56
+
57
+ Remote transmission is fail-closed. Both an explicit provider and
58
+ `--allow-remote` are required. The API key is read from `OPENAI_API_KEY` and is
59
+ never written to an output file. Email addresses and phone numbers are
60
+ redacted before remote transmission. Repeat `--redact-pattern` to add
61
+ case-specific regular expressions.
62
+
63
+ ```sh
64
+ export OPENAI_API_KEY=your-key
65
+ torbot analyze crawl-result.json \
66
+ --provider openai-compatible \
67
+ --base-url https://api.openai.com/v1 \
68
+ --model your-model \
69
+ --allow-remote \
70
+ --redact-pattern 'CASE-[0-9]+' \
71
+ --output investigation/
72
+ ```
73
+
74
+ Captured page text is untrusted data. Analyst exposes no tools to the model,
75
+ does not execute page instructions, discards unknown evidence references, and
76
+ never promotes an uncited model statement to `supported`.
77
+
78
+ ## Schemas
79
+
80
+ Machine-readable schemas live in `schemas/crawl-result.v1.schema.json` and
81
+ `schemas/investigation-report.v1.schema.json`. Consumers must reject schema
82
+ versions they do not understand.
@@ -2,6 +2,25 @@
2
2
  --------------------
3
3
  All notable changes to this project will be documented in this file.
4
4
 
5
+ ## 4.3.1 - 2026-11-12
6
+
7
+ ### Added
8
+ - Added `--save result` for analysis-ready crawl-result v1 files with bounded visible text and content hashes.
9
+ - Added `torbot analyze` for deterministic evidence bundles and optional local or remote OpenAI-compatible analysis.
10
+ - Added stable evidence IDs, claim citation validation, an evidence graph, JSON schemas, and a safe surface-web fixture.
11
+
12
+ ### Changed
13
+ - Requires Python 3.10 or newer, with CI coverage for Python 3.10, 3.11, and 3.12.
14
+ - Updated pinned AnyIO, Soup Sieve, urllib3, certifi, and setuptools dependencies.
15
+ - Documented installation with OTinstaller.
16
+ - Excluded environment files from package builds.
17
+
18
+ ### Security
19
+ - Fixed path traversal in tree, JSON, and HTML export filenames by sanitizing untrusted page titles. Thanks to Artur Chlebicki (@Artur12555) for reporting GHSA-5888-59xj-84pf.
20
+ - Added regression tests for relative and absolute paths, Windows separators, encoded separators, reserved names, and long titles.
21
+ - Remote evidence transmission now requires `--allow-remote`, redacts contact data by default, and never stores API keys.
22
+ - Crawled content is treated as untrusted data, model calls receive no tools, and uncited model output cannot become a supported finding.
23
+
5
24
  ## 4.3.0 - 2026-07-28
6
25
 
7
26
  ### Changed
@@ -0,0 +1,41 @@
1
+ # Shared crawl-result contract
2
+
3
+ TorBot exposes a versioned, machine-readable crawl result through
4
+ `LinkTree.to_crawl_result()`. It is an integration contract, not a replacement
5
+ for the existing tree JSON saved by `--save json`; that legacy format remains
6
+ available through the 4.x series. Consumers must feature-detect
7
+ `schemaVersion` and reject versions they do not understand.
8
+
9
+ ## Version 1
10
+
11
+ The top-level object contains `schemaVersion`, a unique `runId`, `engine` and
12
+ `engineVersion`, normalized `target`, effective `settings`, terminal status,
13
+ timestamps, `durationMs`, `pages`, and privacy-safe `diagnostics`.
14
+
15
+ Each page records `url`, `parentUrl`, `depth`, `outcome`, HTTP `status`,
16
+ `skippedReason`, bounded `errorCategory`, extracted `links`, and `contacts`.
17
+ `outcome` is `fetched` or `failed`; failures expose one of `cancelled`,
18
+ `invalid_input`, `network`, `parse`, or `unknown`, never an exception message.
19
+ Links and contacts include their source (`anchor`, `mailto`, or `tel`). Raw
20
+ HTML, headers, cookies, credentials, and arbitrary exception strings are not
21
+ part of the contract.
22
+
23
+ When a caller explicitly requests analysis-ready output, a fetched page may
24
+ also include a `title`, deterministic classification metadata, and `content`.
25
+ Content contains bounded visible plain text and its SHA-256 digest. Scripts,
26
+ styles, templates, and raw markup are excluded. The CLI exposes this form only
27
+ through `--save result`; legacy `--save json` behavior is unchanged.
28
+
29
+ GoTor's versioned report is the compatibility baseline: both projects use
30
+ `schemaVersion: 1`, `engine`, `target`, depth/settings, timestamps, duration,
31
+ and per-page URL/parent/depth/status/link information. TorBot's fields are
32
+ additive where GoTor's current report has no equivalent (`runId`, terminal
33
+ state, provenance, bounded errors, and diagnostics). Consumers should retain
34
+ unknown fields and branch only on the schema version, not on engine-specific
35
+ internals.
36
+
37
+ ## Deprecation path
38
+
39
+ No existing CLI output changes in this issue. A future major release may mark
40
+ the legacy tree JSON as deprecated only after the shared result is available
41
+ from an explicit CLI/API surface and downstream consumers have migrated.
@@ -4,17 +4,16 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "torbot"
7
- version = "4.3.0"
7
+ version = "4.3.1"
8
8
  authors = [
9
9
  { name="Akeem King", email="akeemtlking@gmail.com" },
10
10
  { name="PS Narayanan", email="thepsnarayanan@gmail.com" },
11
11
  ]
12
12
  description = "TorBot is an OSINT tool for the dark web."
13
13
  readme = "README.md"
14
- requires-python = ">=3.9"
14
+ requires-python = ">=3.10"
15
15
  classifiers = [
16
16
  "Programming Language :: Python :: 3",
17
- "Programming Language :: Python :: 3.9",
18
17
  "Programming Language :: Python :: 3.10",
19
18
  "Programming Language :: Python :: 3.11",
20
19
  "Programming Language :: Python :: 3.12",
@@ -57,3 +56,6 @@ dependencies = [
57
56
 
58
57
  [project.scripts]
59
58
  torbot = "torbot.cli:main"
59
+
60
+ [tool.hatch.build]
61
+ exclude = [".env", ".env.*"]
@@ -1,7 +1,7 @@
1
1
  altgraph==0.17.4
2
- anyio==4.3.0
2
+ anyio==4.14.2
3
3
  beautifulsoup4==4.12.3
4
- certifi==2024.7.4
4
+ certifi==2026.10.19
5
5
  charset-normalizer==3.3.2
6
6
  colorama==0.4.6 ; sys_platform == "win32"
7
7
  decorator==5.1.1
@@ -27,11 +27,11 @@ python-dotenv==1.2.2
27
27
  pywin32-ctypes==0.2.2 ; sys_platform == "win32"
28
28
  scikit-learn==1.5.0
29
29
  scipy==1.13.0
30
- setuptools==83.0.0
30
+ setuptools==84.1.0
31
31
  six==1.16.0
32
32
  sniffio==1.3.1
33
33
  socksio==1.0.0
34
- soupsieve==2.8.4
34
+ soupsieve==2.9
35
35
  tabulate==0.9.0
36
36
  termcolor==2.4.0
37
37
  texttable==1.7.0
@@ -40,6 +40,6 @@ toml==0.10.2
40
40
  tomli==2.0.1
41
41
  treelib==1.7.1
42
42
  unipath==1.1
43
- urllib3==2.7.0
43
+ urllib3==2.8.0
44
44
  validators==0.22.0
45
45
  yattag==1.15.2
@@ -0,0 +1,33 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://github.com/DedSecInside/TorBot/schemas/crawl-result.v1.schema.json",
4
+ "title": "TorBot crawl-result v1",
5
+ "type": "object",
6
+ "required": ["schemaVersion", "target", "pages"],
7
+ "properties": {
8
+ "schemaVersion": {"const": 1},
9
+ "runId": {"type": "string"},
10
+ "target": {"type": "string", "minLength": 1},
11
+ "pages": {
12
+ "type": "array",
13
+ "items": {
14
+ "type": "object",
15
+ "required": ["url", "outcome"],
16
+ "properties": {
17
+ "url": {"type": "string", "minLength": 1},
18
+ "outcome": {"enum": ["fetched", "failed", "skipped"]},
19
+ "content": {
20
+ "type": "object",
21
+ "required": ["mediaType", "text", "sha256"],
22
+ "properties": {
23
+ "mediaType": {"const": "text/plain"},
24
+ "text": {"type": "string"},
25
+ "sha256": {"type": "string", "pattern": "^[a-f0-9]{64}$"}
26
+ },
27
+ "additionalProperties": false
28
+ }
29
+ }
30
+ }
31
+ }
32
+ }
33
+ }
@@ -0,0 +1,26 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://github.com/DedSecInside/TorBot/schemas/investigation-report.v1.schema.json",
4
+ "title": "TorBot investigation-report v1",
5
+ "type": "object",
6
+ "required": ["schema", "createdAt", "source", "claims", "evidenceIds", "warnings"],
7
+ "properties": {
8
+ "schema": {"const": "investigation-report.v1"},
9
+ "claims": {
10
+ "type": "array",
11
+ "items": {
12
+ "type": "object",
13
+ "required": ["text", "status", "evidenceIds", "source"],
14
+ "properties": {
15
+ "text": {"type": "string"},
16
+ "status": {"enum": ["supported", "unsupported", "conflicted"]},
17
+ "evidenceIds": {"type": "array", "items": {"type": "string"}},
18
+ "source": {"enum": ["deterministic", "model"]}
19
+ },
20
+ "additionalProperties": false
21
+ }
22
+ },
23
+ "evidenceIds": {"type": "array", "items": {"type": "string"}},
24
+ "warnings": {"type": "array", "items": {"type": "string"}}
25
+ }
26
+ }