voidaccess 1.7.0__tar.gz → 1.7.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 (206) hide show
  1. {voidaccess-1.7.0/voidaccess.egg-info → voidaccess-1.7.1}/PKG-INFO +11 -5
  2. {voidaccess-1.7.0 → voidaccess-1.7.1}/README.md +10 -4
  3. {voidaccess-1.7.0 → voidaccess-1.7.1}/api/routes/actors.py +32 -3
  4. {voidaccess-1.7.0 → voidaccess-1.7.1}/api/routes/investigations.py +3147 -3472
  5. {voidaccess-1.7.0 → voidaccess-1.7.1}/api/routes/search.py +77 -55
  6. {voidaccess-1.7.0 → voidaccess-1.7.1}/crawler/spider.py +30 -4
  7. {voidaccess-1.7.0 → voidaccess-1.7.1}/db/queries.py +14 -4
  8. {voidaccess-1.7.0 → voidaccess-1.7.1}/export/ioc_package.py +1 -1
  9. {voidaccess-1.7.0 → voidaccess-1.7.1}/export/stix.py +54 -20
  10. {voidaccess-1.7.0 → voidaccess-1.7.1}/extractor/ner.py +136 -1
  11. {voidaccess-1.7.0 → voidaccess-1.7.1}/extractor/normalizer.py +91 -89
  12. {voidaccess-1.7.0 → voidaccess-1.7.1}/extractor/pipeline.py +65 -13
  13. {voidaccess-1.7.0 → voidaccess-1.7.1}/graph/__init__.py +2 -0
  14. {voidaccess-1.7.0 → voidaccess-1.7.1}/graph/builder.py +8 -7
  15. {voidaccess-1.7.0 → voidaccess-1.7.1}/monitor/config.py +4 -0
  16. {voidaccess-1.7.0 → voidaccess-1.7.1}/monitor/jobs.py +68 -11
  17. {voidaccess-1.7.0 → voidaccess-1.7.1}/monitor/scheduler.py +4 -6
  18. {voidaccess-1.7.0 → voidaccess-1.7.1}/pyproject.toml +1 -1
  19. voidaccess-1.7.1/tests/test_confidence_calibration.py +108 -0
  20. voidaccess-1.7.1/tests/test_graph_integration.py +141 -0
  21. {voidaccess-1.7.0 → voidaccess-1.7.1}/tests/test_monitor.py +11 -8
  22. voidaccess-1.7.1/tests/test_monitor_integration.py +150 -0
  23. {voidaccess-1.7.0 → voidaccess-1.7.1}/tests/test_regex_patterns.py +39 -44
  24. voidaccess-1.7.1/tests/test_stix_export.py +281 -0
  25. {voidaccess-1.7.0 → voidaccess-1.7.1}/vector/__init__.py +2 -0
  26. {voidaccess-1.7.0 → voidaccess-1.7.1}/voidaccess/llm.py +87 -5
  27. {voidaccess-1.7.0 → voidaccess-1.7.1/voidaccess.egg-info}/PKG-INFO +11 -5
  28. {voidaccess-1.7.0 → voidaccess-1.7.1}/voidaccess.egg-info/SOURCES.txt +3 -0
  29. {voidaccess-1.7.0 → voidaccess-1.7.1}/voidaccess_cli/__init__.py +1 -1
  30. {voidaccess-1.7.0 → voidaccess-1.7.1}/voidaccess_cli/adapters/sqlite.py +95 -4
  31. voidaccess-1.7.0/tests/test_stix_export.py +0 -19
  32. {voidaccess-1.7.0 → voidaccess-1.7.1}/LICENSE +0 -0
  33. {voidaccess-1.7.0 → voidaccess-1.7.1}/analysis/__init__.py +0 -0
  34. {voidaccess-1.7.0 → voidaccess-1.7.1}/analysis/opsec.py +0 -0
  35. {voidaccess-1.7.0 → voidaccess-1.7.1}/analysis/patterns.py +0 -0
  36. {voidaccess-1.7.0 → voidaccess-1.7.1}/analysis/temporal.py +0 -0
  37. {voidaccess-1.7.0 → voidaccess-1.7.1}/api/__init__.py +0 -0
  38. {voidaccess-1.7.0 → voidaccess-1.7.1}/api/auth.py +0 -0
  39. {voidaccess-1.7.0 → voidaccess-1.7.1}/api/main.py +0 -0
  40. {voidaccess-1.7.0 → voidaccess-1.7.1}/api/routes/__init__.py +0 -0
  41. {voidaccess-1.7.0 → voidaccess-1.7.1}/api/routes/admin.py +0 -0
  42. {voidaccess-1.7.0 → voidaccess-1.7.1}/api/routes/auth.py +0 -0
  43. {voidaccess-1.7.0 → voidaccess-1.7.1}/api/routes/entities.py +0 -0
  44. {voidaccess-1.7.0 → voidaccess-1.7.1}/api/routes/export.py +0 -0
  45. {voidaccess-1.7.0 → voidaccess-1.7.1}/api/routes/monitors.py +0 -0
  46. {voidaccess-1.7.0 → voidaccess-1.7.1}/api/routes/settings.py +0 -0
  47. {voidaccess-1.7.0 → voidaccess-1.7.1}/auth/__init__.py +0 -0
  48. {voidaccess-1.7.0 → voidaccess-1.7.1}/auth/token_blacklist.py +0 -0
  49. {voidaccess-1.7.0 → voidaccess-1.7.1}/config.py +0 -0
  50. {voidaccess-1.7.0 → voidaccess-1.7.1}/crawler/__init__.py +0 -0
  51. {voidaccess-1.7.0 → voidaccess-1.7.1}/crawler/dedup.py +0 -0
  52. {voidaccess-1.7.0 → voidaccess-1.7.1}/crawler/frontier.py +0 -0
  53. {voidaccess-1.7.0 → voidaccess-1.7.1}/crawler/utils.py +0 -0
  54. {voidaccess-1.7.0 → voidaccess-1.7.1}/db/__init__.py +0 -0
  55. {voidaccess-1.7.0 → voidaccess-1.7.1}/db/migrations/__init__.py +0 -0
  56. {voidaccess-1.7.0 → voidaccess-1.7.1}/db/migrations/env.py +0 -0
  57. {voidaccess-1.7.0 → voidaccess-1.7.1}/db/migrations/versions/0001_initial_schema.py +0 -0
  58. {voidaccess-1.7.0 → voidaccess-1.7.1}/db/migrations/versions/0002_add_investigation_status_column.py +0 -0
  59. {voidaccess-1.7.0 → voidaccess-1.7.1}/db/migrations/versions/0002_add_missing_tables.py +0 -0
  60. {voidaccess-1.7.0 → voidaccess-1.7.1}/db/migrations/versions/0003_add_canonical_value_and_entity_links.py +0 -0
  61. {voidaccess-1.7.0 → voidaccess-1.7.1}/db/migrations/versions/0004_add_page_posted_at.py +0 -0
  62. {voidaccess-1.7.0 → voidaccess-1.7.1}/db/migrations/versions/0005_add_extraction_method.py +0 -0
  63. {voidaccess-1.7.0 → voidaccess-1.7.1}/db/migrations/versions/0006_add_monitor_alerts.py +0 -0
  64. {voidaccess-1.7.0 → voidaccess-1.7.1}/db/migrations/versions/0007_add_actor_style_profiles.py +0 -0
  65. {voidaccess-1.7.0 → voidaccess-1.7.1}/db/migrations/versions/0008_add_users_table.py +0 -0
  66. {voidaccess-1.7.0 → voidaccess-1.7.1}/db/migrations/versions/0009_add_investigation_id_to_relationships.py +0 -0
  67. {voidaccess-1.7.0 → voidaccess-1.7.1}/db/migrations/versions/0010_add_composite_index_entity_relationships.py +0 -0
  68. {voidaccess-1.7.0 → voidaccess-1.7.1}/db/migrations/versions/0011_add_page_extraction_cache.py +0 -0
  69. {voidaccess-1.7.0 → voidaccess-1.7.1}/db/migrations/versions/0013_add_graph_status.py +0 -0
  70. {voidaccess-1.7.0 → voidaccess-1.7.1}/db/migrations/versions/0015_add_progress_fields.py +0 -0
  71. {voidaccess-1.7.0 → voidaccess-1.7.1}/db/migrations/versions/0016_backfill_graph_status.py +0 -0
  72. {voidaccess-1.7.0 → voidaccess-1.7.1}/db/migrations/versions/0017_add_user_api_keys.py +0 -0
  73. {voidaccess-1.7.0 → voidaccess-1.7.1}/db/migrations/versions/0018_add_user_id_to_investigations.py +0 -0
  74. {voidaccess-1.7.0 → voidaccess-1.7.1}/db/migrations/versions/0019_add_content_safety_log.py +0 -0
  75. {voidaccess-1.7.0 → voidaccess-1.7.1}/db/migrations/versions/0020_add_entity_source_tracking.py +0 -0
  76. {voidaccess-1.7.0 → voidaccess-1.7.1}/db/migrations/versions/0021_add_search_engine_stats.py +0 -0
  77. {voidaccess-1.7.0 → voidaccess-1.7.1}/db/migrations/versions/0022_add_actor_profiles.py +0 -0
  78. {voidaccess-1.7.0 → voidaccess-1.7.1}/db/migrations/versions/0023_add_investigation_metadata.py +0 -0
  79. {voidaccess-1.7.0 → voidaccess-1.7.1}/db/models.py +0 -0
  80. {voidaccess-1.7.0 → voidaccess-1.7.1}/db/search_engine_stats.py +0 -0
  81. {voidaccess-1.7.0 → voidaccess-1.7.1}/db/session.py +0 -0
  82. {voidaccess-1.7.0 → voidaccess-1.7.1}/export/__init__.py +0 -0
  83. {voidaccess-1.7.0 → voidaccess-1.7.1}/export/misp.py +0 -0
  84. {voidaccess-1.7.0 → voidaccess-1.7.1}/export/sigma.py +0 -0
  85. {voidaccess-1.7.0 → voidaccess-1.7.1}/export/snort_export.py +0 -0
  86. {voidaccess-1.7.0 → voidaccess-1.7.1}/export/yara_export.py +0 -0
  87. {voidaccess-1.7.0 → voidaccess-1.7.1}/extractor/__init__.py +0 -0
  88. {voidaccess-1.7.0 → voidaccess-1.7.1}/extractor/llm_extract.py +0 -0
  89. {voidaccess-1.7.0 → voidaccess-1.7.1}/extractor/regex_patterns.py +0 -0
  90. {voidaccess-1.7.0 → voidaccess-1.7.1}/fingerprint/__init__.py +0 -0
  91. {voidaccess-1.7.0 → voidaccess-1.7.1}/fingerprint/profiler.py +0 -0
  92. {voidaccess-1.7.0 → voidaccess-1.7.1}/fingerprint/stylometry.py +0 -0
  93. {voidaccess-1.7.0 → voidaccess-1.7.1}/graph/export.py +0 -0
  94. {voidaccess-1.7.0 → voidaccess-1.7.1}/graph/model.py +0 -0
  95. {voidaccess-1.7.0 → voidaccess-1.7.1}/graph/queries.py +0 -0
  96. {voidaccess-1.7.0 → voidaccess-1.7.1}/graph/visualize.py +0 -0
  97. {voidaccess-1.7.0 → voidaccess-1.7.1}/i18n/__init__.py +0 -0
  98. {voidaccess-1.7.0 → voidaccess-1.7.1}/i18n/detect.py +0 -0
  99. {voidaccess-1.7.0 → voidaccess-1.7.1}/i18n/query_expand.py +0 -0
  100. {voidaccess-1.7.0 → voidaccess-1.7.1}/i18n/translate.py +0 -0
  101. {voidaccess-1.7.0 → voidaccess-1.7.1}/monitor/__init__.py +0 -0
  102. {voidaccess-1.7.0 → voidaccess-1.7.1}/monitor/_db.py +0 -0
  103. {voidaccess-1.7.0 → voidaccess-1.7.1}/monitor/alerts.py +0 -0
  104. {voidaccess-1.7.0 → voidaccess-1.7.1}/monitor/diff.py +0 -0
  105. {voidaccess-1.7.0 → voidaccess-1.7.1}/scraper/__init__.py +0 -0
  106. {voidaccess-1.7.0 → voidaccess-1.7.1}/scraper/scrape.py +0 -0
  107. {voidaccess-1.7.0 → voidaccess-1.7.1}/scraper/scrape_js.py +0 -0
  108. {voidaccess-1.7.0 → voidaccess-1.7.1}/search/__init__.py +0 -0
  109. {voidaccess-1.7.0 → voidaccess-1.7.1}/search/circuit_breaker.py +0 -0
  110. {voidaccess-1.7.0 → voidaccess-1.7.1}/search/query_builder.py +0 -0
  111. {voidaccess-1.7.0 → voidaccess-1.7.1}/search/search.py +0 -0
  112. {voidaccess-1.7.0 → voidaccess-1.7.1}/setup.cfg +0 -0
  113. {voidaccess-1.7.0 → voidaccess-1.7.1}/sources/__init__.py +0 -0
  114. {voidaccess-1.7.0 → voidaccess-1.7.1}/sources/actor_profiles.py +0 -0
  115. {voidaccess-1.7.0 → voidaccess-1.7.1}/sources/blockchain.py +0 -0
  116. {voidaccess-1.7.0 → voidaccess-1.7.1}/sources/cache.py +0 -0
  117. {voidaccess-1.7.0 → voidaccess-1.7.1}/sources/cisa.py +0 -0
  118. {voidaccess-1.7.0 → voidaccess-1.7.1}/sources/data/__init__.py +0 -0
  119. {voidaccess-1.7.0 → voidaccess-1.7.1}/sources/data/onion_seeds.json +0 -0
  120. {voidaccess-1.7.0 → voidaccess-1.7.1}/sources/dns_enrichment.py +0 -0
  121. {voidaccess-1.7.0 → voidaccess-1.7.1}/sources/domain_reputation.py +0 -0
  122. {voidaccess-1.7.0 → voidaccess-1.7.1}/sources/email_reputation.py +0 -0
  123. {voidaccess-1.7.0 → voidaccess-1.7.1}/sources/engines.py +0 -0
  124. {voidaccess-1.7.0 → voidaccess-1.7.1}/sources/enrichment.py +0 -0
  125. {voidaccess-1.7.0 → voidaccess-1.7.1}/sources/github_scraper.py +0 -0
  126. {voidaccess-1.7.0 → voidaccess-1.7.1}/sources/gitlab_scraper.py +0 -0
  127. {voidaccess-1.7.0 → voidaccess-1.7.1}/sources/hash_reputation.py +0 -0
  128. {voidaccess-1.7.0 → voidaccess-1.7.1}/sources/historical_intel.py +0 -0
  129. {voidaccess-1.7.0 → voidaccess-1.7.1}/sources/ip_reputation.py +0 -0
  130. {voidaccess-1.7.0 → voidaccess-1.7.1}/sources/paste_scraper.py +0 -0
  131. {voidaccess-1.7.0 → voidaccess-1.7.1}/sources/pastes.py +0 -0
  132. {voidaccess-1.7.0 → voidaccess-1.7.1}/sources/proxy_client.py +0 -0
  133. {voidaccess-1.7.0 → voidaccess-1.7.1}/sources/rss_scraper.py +0 -0
  134. {voidaccess-1.7.0 → voidaccess-1.7.1}/sources/seed_manager.py +0 -0
  135. {voidaccess-1.7.0 → voidaccess-1.7.1}/sources/seeds.py +0 -0
  136. {voidaccess-1.7.0 → voidaccess-1.7.1}/sources/shodan.py +0 -0
  137. {voidaccess-1.7.0 → voidaccess-1.7.1}/sources/telegram.py +0 -0
  138. {voidaccess-1.7.0 → voidaccess-1.7.1}/sources/virustotal.py +0 -0
  139. {voidaccess-1.7.0 → voidaccess-1.7.1}/tests/test_analysis_opsec.py +0 -0
  140. {voidaccess-1.7.0 → voidaccess-1.7.1}/tests/test_analysis_stylometry.py +0 -0
  141. {voidaccess-1.7.0 → voidaccess-1.7.1}/tests/test_analysis_temporal.py +0 -0
  142. {voidaccess-1.7.0 → voidaccess-1.7.1}/tests/test_api.py +0 -0
  143. {voidaccess-1.7.0 → voidaccess-1.7.1}/tests/test_api_monitors.py +0 -0
  144. {voidaccess-1.7.0 → voidaccess-1.7.1}/tests/test_blockchain.py +0 -0
  145. {voidaccess-1.7.0 → voidaccess-1.7.1}/tests/test_cli_proxy_config.py +0 -0
  146. {voidaccess-1.7.0 → voidaccess-1.7.1}/tests/test_config.py +0 -0
  147. {voidaccess-1.7.0 → voidaccess-1.7.1}/tests/test_crawler.py +0 -0
  148. {voidaccess-1.7.0 → voidaccess-1.7.1}/tests/test_db.py +0 -0
  149. {voidaccess-1.7.0 → voidaccess-1.7.1}/tests/test_dns_enrichment.py +0 -0
  150. {voidaccess-1.7.0 → voidaccess-1.7.1}/tests/test_domain_reputation.py +0 -0
  151. {voidaccess-1.7.0 → voidaccess-1.7.1}/tests/test_email_reputation.py +0 -0
  152. {voidaccess-1.7.0 → voidaccess-1.7.1}/tests/test_filter_e2e_manual.py +0 -0
  153. {voidaccess-1.7.0 → voidaccess-1.7.1}/tests/test_filter_parser_manual.py +0 -0
  154. {voidaccess-1.7.0 → voidaccess-1.7.1}/tests/test_fingerprint.py +0 -0
  155. {voidaccess-1.7.0 → voidaccess-1.7.1}/tests/test_github_scraper.py +0 -0
  156. {voidaccess-1.7.0 → voidaccess-1.7.1}/tests/test_gitlab_scraper.py +0 -0
  157. {voidaccess-1.7.0 → voidaccess-1.7.1}/tests/test_graph.py +0 -0
  158. {voidaccess-1.7.0 → voidaccess-1.7.1}/tests/test_hash_reputation.py +0 -0
  159. {voidaccess-1.7.0 → voidaccess-1.7.1}/tests/test_i18n.py +0 -0
  160. {voidaccess-1.7.0 → voidaccess-1.7.1}/tests/test_ip_reputation.py +0 -0
  161. {voidaccess-1.7.0 → voidaccess-1.7.1}/tests/test_llm.py +0 -0
  162. {voidaccess-1.7.0 → voidaccess-1.7.1}/tests/test_llm_utils.py +0 -0
  163. {voidaccess-1.7.0 → voidaccess-1.7.1}/tests/test_model_singleton.py +0 -0
  164. {voidaccess-1.7.0 → voidaccess-1.7.1}/tests/test_pagination.py +0 -0
  165. {voidaccess-1.7.0 → voidaccess-1.7.1}/tests/test_paste_scraper.py +0 -0
  166. {voidaccess-1.7.0 → voidaccess-1.7.1}/tests/test_proxy_client.py +0 -0
  167. {voidaccess-1.7.0 → voidaccess-1.7.1}/tests/test_rss_scraper.py +0 -0
  168. {voidaccess-1.7.0 → voidaccess-1.7.1}/tests/test_scrape_js.py +0 -0
  169. {voidaccess-1.7.0 → voidaccess-1.7.1}/tests/test_settings.py +0 -0
  170. {voidaccess-1.7.0 → voidaccess-1.7.1}/tests/test_snort_export.py +0 -0
  171. {voidaccess-1.7.0 → voidaccess-1.7.1}/tests/test_sources.py +0 -0
  172. {voidaccess-1.7.0 → voidaccess-1.7.1}/tests/test_sources_enrichment_new.py +0 -0
  173. {voidaccess-1.7.0 → voidaccess-1.7.1}/tests/test_vector.py +0 -0
  174. {voidaccess-1.7.0 → voidaccess-1.7.1}/tests/test_yara_export.py +0 -0
  175. {voidaccess-1.7.0 → voidaccess-1.7.1}/utils/__init__.py +0 -0
  176. {voidaccess-1.7.0 → voidaccess-1.7.1}/utils/async_utils.py +0 -0
  177. {voidaccess-1.7.0 → voidaccess-1.7.1}/utils/content_safety.py +0 -0
  178. {voidaccess-1.7.0 → voidaccess-1.7.1}/utils/defang.py +0 -0
  179. {voidaccess-1.7.0 → voidaccess-1.7.1}/utils/encryption.py +0 -0
  180. {voidaccess-1.7.0 → voidaccess-1.7.1}/utils/enrichment_cache.py +0 -0
  181. {voidaccess-1.7.0 → voidaccess-1.7.1}/utils/ioc_freshness.py +0 -0
  182. {voidaccess-1.7.0 → voidaccess-1.7.1}/utils/user_keys.py +0 -0
  183. {voidaccess-1.7.0 → voidaccess-1.7.1}/vector/embedder.py +0 -0
  184. {voidaccess-1.7.0 → voidaccess-1.7.1}/vector/model_singleton.py +0 -0
  185. {voidaccess-1.7.0 → voidaccess-1.7.1}/vector/search.py +0 -0
  186. {voidaccess-1.7.0 → voidaccess-1.7.1}/vector/store.py +0 -0
  187. {voidaccess-1.7.0 → voidaccess-1.7.1}/voidaccess/__init__.py +0 -0
  188. {voidaccess-1.7.0 → voidaccess-1.7.1}/voidaccess/config.py +0 -0
  189. {voidaccess-1.7.0 → voidaccess-1.7.1}/voidaccess/llm_utils.py +0 -0
  190. {voidaccess-1.7.0 → voidaccess-1.7.1}/voidaccess.egg-info/dependency_links.txt +0 -0
  191. {voidaccess-1.7.0 → voidaccess-1.7.1}/voidaccess.egg-info/entry_points.txt +0 -0
  192. {voidaccess-1.7.0 → voidaccess-1.7.1}/voidaccess.egg-info/requires.txt +0 -0
  193. {voidaccess-1.7.0 → voidaccess-1.7.1}/voidaccess.egg-info/top_level.txt +0 -0
  194. {voidaccess-1.7.0 → voidaccess-1.7.1}/voidaccess_cli/adapters/__init__.py +0 -0
  195. {voidaccess-1.7.0 → voidaccess-1.7.1}/voidaccess_cli/browser.py +0 -0
  196. {voidaccess-1.7.0 → voidaccess-1.7.1}/voidaccess_cli/commands/__init__.py +0 -0
  197. {voidaccess-1.7.0 → voidaccess-1.7.1}/voidaccess_cli/commands/actors.py +0 -0
  198. {voidaccess-1.7.0 → voidaccess-1.7.1}/voidaccess_cli/commands/configure.py +0 -0
  199. {voidaccess-1.7.0 → voidaccess-1.7.1}/voidaccess_cli/commands/enrich.py +0 -0
  200. {voidaccess-1.7.0 → voidaccess-1.7.1}/voidaccess_cli/commands/export.py +0 -0
  201. {voidaccess-1.7.0 → voidaccess-1.7.1}/voidaccess_cli/commands/investigate.py +0 -0
  202. {voidaccess-1.7.0 → voidaccess-1.7.1}/voidaccess_cli/commands/show.py +0 -0
  203. {voidaccess-1.7.0 → voidaccess-1.7.1}/voidaccess_cli/config.py +0 -0
  204. {voidaccess-1.7.0 → voidaccess-1.7.1}/voidaccess_cli/display.py +0 -0
  205. {voidaccess-1.7.0 → voidaccess-1.7.1}/voidaccess_cli/main.py +0 -0
  206. {voidaccess-1.7.0 → voidaccess-1.7.1}/voidaccess_cli/tor_detect.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: voidaccess
3
- Version: 1.7.0
3
+ Version: 1.7.1
4
4
  Summary: Dark web OSINT CLI — automated threat intelligence from query to report
5
5
  Author: VoidAccess
6
6
  License-Expression: MIT
@@ -104,7 +104,15 @@ Commercial threat intelligence platforms often charge prohibitive annual fees fo
104
104
 
105
105
  ---
106
106
 
107
- ## What's New in v1.7.0
107
+ ## What's New in v1.7.1
108
+ - STIX export now produces real bundles with entities and relationships again.
109
+ - Entity extraction on CVE/financial queries now returns the expected entity mix instead of collapsing to organization-name noise.
110
+ - Confidence scores now show multi-value spread that reflects source quality, extraction method, and corroboration.
111
+ - Entity readback now includes rows linked through `InvestigationEntityLink` and dedupes canonical collisions correctly.
112
+
113
+ ---
114
+
115
+ ## What's New in the Previous Release
108
116
 
109
117
  - **Dependency optional-extras split** — `sentence-transformers`, `torch`, `transformers`, `telethon`, and `playwright` are now optional extras: `voidaccess[nlp]`, `voidaccess[telegram]`, `voidaccess[js]`, and `voidaccess[all]`.
110
118
  - **Optional clearnet ScrapingAnt integration** — paste sites and RSS feeds can now be routed through ScrapingAnt. Affects clearnet scraping only; Tor, `.onion`, GitHub, and GitLab traffic are never affected.
@@ -310,7 +318,7 @@ Export formats:
310
318
 
311
319
  ## Actor Intelligence
312
320
 
313
- VoidAccess v1.7.0 persists actor profiles across investigations in `actor_profiles`, with linked aliases and infrastructure in `actor_aliases` and `actor_infrastructure`. Profiles are populated from threat actor, ransomware group, and handle entities, then enriched with co-occurring infrastructure and timeline events.
321
+ VoidAccess v1.7.1 persists actor profiles across investigations in `actor_profiles`, with linked aliases and infrastructure in `actor_aliases` and `actor_infrastructure`. Profiles are populated from threat actor, ransomware group, and handle entities, then enriched with co-occurring infrastructure and timeline events.
314
322
 
315
323
  Cross-alias resolution scores five signals: shared infrastructure, shared PGP, string similarity, temporal co-activity, and co-investigation. Use `voidaccess actors` to list profiles, `voidaccess actor <handle>` for the full profile, `voidaccess actor <handle> --timeline` for chronology, and `voidaccess actor <handle> --note "text"` for analyst notes.
316
324
 
@@ -578,5 +586,3 @@ To report a security vulnerability, see [docs/SECURITY.md](docs/SECURITY.md).
578
586
  MIT License. See [LICENSE](LICENSE) for details.
579
587
 
580
588
 
581
-
582
-
@@ -19,7 +19,15 @@ Commercial threat intelligence platforms often charge prohibitive annual fees fo
19
19
 
20
20
  ---
21
21
 
22
- ## What's New in v1.7.0
22
+ ## What's New in v1.7.1
23
+ - STIX export now produces real bundles with entities and relationships again.
24
+ - Entity extraction on CVE/financial queries now returns the expected entity mix instead of collapsing to organization-name noise.
25
+ - Confidence scores now show multi-value spread that reflects source quality, extraction method, and corroboration.
26
+ - Entity readback now includes rows linked through `InvestigationEntityLink` and dedupes canonical collisions correctly.
27
+
28
+ ---
29
+
30
+ ## What's New in the Previous Release
23
31
 
24
32
  - **Dependency optional-extras split** — `sentence-transformers`, `torch`, `transformers`, `telethon`, and `playwright` are now optional extras: `voidaccess[nlp]`, `voidaccess[telegram]`, `voidaccess[js]`, and `voidaccess[all]`.
25
33
  - **Optional clearnet ScrapingAnt integration** — paste sites and RSS feeds can now be routed through ScrapingAnt. Affects clearnet scraping only; Tor, `.onion`, GitHub, and GitLab traffic are never affected.
@@ -225,7 +233,7 @@ Export formats:
225
233
 
226
234
  ## Actor Intelligence
227
235
 
228
- VoidAccess v1.7.0 persists actor profiles across investigations in `actor_profiles`, with linked aliases and infrastructure in `actor_aliases` and `actor_infrastructure`. Profiles are populated from threat actor, ransomware group, and handle entities, then enriched with co-occurring infrastructure and timeline events.
236
+ VoidAccess v1.7.1 persists actor profiles across investigations in `actor_profiles`, with linked aliases and infrastructure in `actor_aliases` and `actor_infrastructure`. Profiles are populated from threat actor, ransomware group, and handle entities, then enriched with co-occurring infrastructure and timeline events.
229
237
 
230
238
  Cross-alias resolution scores five signals: shared infrastructure, shared PGP, string similarity, temporal co-activity, and co-investigation. Use `voidaccess actors` to list profiles, `voidaccess actor <handle>` for the full profile, `voidaccess actor <handle> --timeline` for chronology, and `voidaccess actor <handle> --note "text"` for analyst notes.
231
239
 
@@ -493,5 +501,3 @@ To report a security vulnerability, see [docs/SECURITY.md](docs/SECURITY.md).
493
501
  MIT License. See [LICENSE](LICENSE) for details.
494
502
 
495
503
 
496
-
497
-
@@ -17,6 +17,7 @@ from __future__ import annotations
17
17
 
18
18
  import logging
19
19
  import os
20
+ import uuid
20
21
  from typing import Optional
21
22
 
22
23
  from fastapi import APIRouter, Depends, HTTPException, Query
@@ -99,7 +100,7 @@ def _user_owned_investigation_ids_subq(session, user_id: int):
99
100
 
100
101
  def _profile_accessible(session, profile_id: str, user_id: int) -> bool:
101
102
  """True when at least one investigation linked to the profile is owned by the user."""
102
- from db.models import ActorAlias, ActorInfrastructure, Investigation
103
+ from db.models import ActorAlias, ActorInfrastructure
103
104
 
104
105
  inv_ids_subq = _user_owned_investigation_ids_subq(session, user_id)
105
106
  alias_match = (
@@ -151,7 +152,6 @@ async def list_actors(
151
152
  ActorProfile,
152
153
  ActorAlias,
153
154
  ActorInfrastructure,
154
- Investigation,
155
155
  )
156
156
 
157
157
  try:
@@ -258,6 +258,35 @@ async def get_actor(
258
258
  return profile
259
259
 
260
260
 
261
+ @router.get("/{node_id}/profile")
262
+ async def get_actor_profile_by_node(
263
+ node_id: str,
264
+ investigation_id: str = Query(..., description="Investigation ID"),
265
+ current_user: CurrentUser = Depends(get_current_user),
266
+ ) -> dict:
267
+ """Return the graph actor profile for a node inside one investigation."""
268
+ _db_required()
269
+ try:
270
+ inv_uuid = uuid.UUID(investigation_id)
271
+ except ValueError:
272
+ raise HTTPException(status_code=422, detail="Invalid investigation ID format")
273
+ from db.queries import get_investigation_by_id_or_run
274
+ from graph import build_graph_from_db_cached, get_actor_profile
275
+
276
+ with _session() as session:
277
+ inv = get_investigation_by_id_or_run(session, inv_uuid)
278
+ if inv is None:
279
+ raise HTTPException(status_code=404, detail="Investigation not found")
280
+ if str(inv.user_id) != str(current_user.user.id):
281
+ raise HTTPException(status_code=403, detail="Forbidden")
282
+ graph = build_graph_from_db_cached(investigation_id=inv.id)
283
+
284
+ profile = get_actor_profile(graph, node_id)
285
+ if not profile:
286
+ raise HTTPException(status_code=404, detail="Graph node not found")
287
+ return profile
288
+
289
+
261
290
  @router.get("/{handle}/investigations")
262
291
  async def get_actor_investigations(
263
292
  handle: str,
@@ -732,4 +761,4 @@ def uuid_value(s):
732
761
  import uuid as _uuid
733
762
  return _uuid.UUID(str(s))
734
763
  except (ValueError, TypeError):
735
- return None
764
+ return None