From d4d4eb0bca3e0e3bbf682e6cd6ce3217bfea220f Mon Sep 17 00:00:00 2001 From: Tanishqa Sharma Date: Wed, 14 Jan 2026 12:22:25 +0530 Subject: [PATCH] save --- .vscode/PythonImportHelper-v2-Completion.json | 17362 ++++++++++++++++ README.md | 389 +- i.png | Bin 0 -> 1643284 bytes i1.png | Bin 0 -> 1323961 bytes i2.png | Bin 0 -> 1057853 bytes i3.png | Bin 0 -> 823058 bytes i4.png | Bin 0 -> 1207676 bytes i5.png | Bin 0 -> 730811 bytes 8 files changed, 17709 insertions(+), 42 deletions(-) create mode 100644 .vscode/PythonImportHelper-v2-Completion.json create mode 100644 i.png create mode 100644 i1.png create mode 100644 i2.png create mode 100644 i3.png create mode 100644 i4.png create mode 100644 i5.png diff --git a/.vscode/PythonImportHelper-v2-Completion.json b/.vscode/PythonImportHelper-v2-Completion.json new file mode 100644 index 0000000..c95f8d7 --- /dev/null +++ b/.vscode/PythonImportHelper-v2-Completion.json @@ -0,0 +1,17362 @@ +[ + { + "label": "Sequence", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Union", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Sequence", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Union", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Sequence", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Union", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Sequence", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Union", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Sequence", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Union", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Sequence", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Union", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Sequence", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Union", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Sequence", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Union", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Sequence", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Union", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Sequence", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Union", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Sequence", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Union", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Sequence", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Union", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Sequence", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Union", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Sequence", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Union", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Sequence", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Union", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Sequence", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Union", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Sequence", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Union", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Sequence", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Union", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Sequence", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Union", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Sequence", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Union", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Sequence", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Union", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Sequence", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Union", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Sequence", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Union", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Sequence", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Union", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Sequence", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Union", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "List", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Optional", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Dict", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "List", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Optional", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "List", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Dict", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "List", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Any", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Optional", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "List", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "List", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "List", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Literal", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "List", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Optional", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Dict", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Any", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "List", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Any", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Optional", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Any", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Dict", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Optional", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Type", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Optional", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Any", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "List", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "List", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Optional", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Any", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Optional", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Dict", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Any", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Optional", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Optional", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "List", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Optional", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Dict", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Any", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Optional", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Optional", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Optional", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "List", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Optional", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Any", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Optional", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Optional", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Optional", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "List", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Optional", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Dict", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Any", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Callable", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Any", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Dict", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Type", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Any", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Dict", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Dict", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Any", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "List", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Type", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Any", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Dict", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Type", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Dict", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Set", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Optional", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Dict", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Any", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "List", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Dict", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Any", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "List", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Optional", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Tuple", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Any", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Dict", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "List", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Dict", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Any", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Optional", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Protocol", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Any", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Dict", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Union", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "List", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Dict", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Any", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Dict", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Optional", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Type", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "List", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Any", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "List", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Dict", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Any", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Optional", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Dict", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Any", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Dict", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "List", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Any", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Optional", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Literal", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Protocol", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Optional", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Optional", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "List", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Dict", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Any", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "BinaryIO", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Union", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Optional", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Optional", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Dict", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Any", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "List", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Dict", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "List", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Optional", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "List", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Optional", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Dict", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Any", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "List", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Type", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Any", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Dict", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Type", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "List", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Dict", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Any", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "List", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Dict", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Any", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Union", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Optional", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Any", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Dict", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "List", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Optional", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Union", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "List", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Dict", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Any", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Optional", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Union", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "List", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Dict", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Any", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Optional", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Union", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Any", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Dict", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "List", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Optional", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Union", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Any", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "List", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Union", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Dict", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Set", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Optional", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "List", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Union", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "List", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Union", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "List", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Union", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "List", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Union", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "List", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Union", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Any", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "List", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Union", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Dict", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Set", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Optional", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "List", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Union", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Any", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Dict", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "List", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Optional", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Union", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Any", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "List", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Union", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Dict", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Set", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Optional", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "List", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Dict", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Union", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Set", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Any", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Dict", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "List", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Optional", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Union", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "List", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Union", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "List", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Dict", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Any", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "TypeAlias", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Union", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Dict", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Any", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "List", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Union", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Optional", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "List", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Dict", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Any", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Optional", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "List", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Dict", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Any", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Union", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Any", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "List", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Union", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Dict", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Set", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Optional", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "List", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Dict", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Any", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Union", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Dict", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Any", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "List", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Union", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Any", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Dict", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "List", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Optional", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Union", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Dict", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "List", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Any", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Optional", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "List", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Union", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "List", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Union", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "List", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Optional", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Union", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "List", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Union", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "List", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Union", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "List", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Union", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "List", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Dict", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Any", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Union", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Optional", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Dict", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Any", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "List", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Type", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Any", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Dict", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Type", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Any", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Literal", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Any", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "List", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Any", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "List", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "List", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Any", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Dict", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Any", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "List", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Dict", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Dict", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Any", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Dict", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "List", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Dict", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "List", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Literal", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Union", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Any", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Optional", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Optional", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "List", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Optional", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "List", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "List", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Optional", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Optional", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "List", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "List", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Optional", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Dict", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Optional", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "List", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Optional", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "List", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Optional", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "List", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Optional", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "List", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Optional", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "List", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Optional", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Optional", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "List", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Optional", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "List", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Optional", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Literal", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "List", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Optional", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "List", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Dict", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Optional", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Optional", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "List", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Optional", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "List", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Any", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Optional", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "List", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Optional", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Any", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Optional", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "List", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Optional", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "List", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Optional", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "List", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Optional", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "List", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Optional", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Optional", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "List", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Optional", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "List", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Optional", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Literal", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Optional", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "List", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Optional", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "List", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "List", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Optional", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "Optional", + "importPath": "typing", + "description": "typing", + "isExtraImport": true, + "detail": "typing", + "documentation": {} + }, + { + "label": "op", + "importPath": "alembic", + "description": "alembic", + "isExtraImport": true, + "detail": "alembic", + "documentation": {} + }, + { + "label": "op", + "importPath": "alembic", + "description": "alembic", + "isExtraImport": true, + "detail": "alembic", + "documentation": {} + }, + { + "label": "op", + "importPath": "alembic", + "description": "alembic", + "isExtraImport": true, + "detail": "alembic", + "documentation": {} + }, + { + "label": "op", + "importPath": "alembic", + "description": "alembic", + "isExtraImport": true, + "detail": "alembic", + "documentation": {} + }, + { + "label": "op", + "importPath": "alembic", + "description": "alembic", + "isExtraImport": true, + "detail": "alembic", + "documentation": {} + }, + { + "label": "op", + "importPath": "alembic", + "description": "alembic", + "isExtraImport": true, + "detail": "alembic", + "documentation": {} + }, + { + "label": "op", + "importPath": "alembic", + "description": "alembic", + "isExtraImport": true, + "detail": "alembic", + "documentation": {} + }, + { + "label": "op", + "importPath": "alembic", + "description": "alembic", + "isExtraImport": true, + "detail": "alembic", + "documentation": {} + }, + { + "label": "op", + "importPath": "alembic", + "description": "alembic", + "isExtraImport": true, + "detail": "alembic", + "documentation": {} + }, + { + "label": "op", + "importPath": "alembic", + "description": "alembic", + "isExtraImport": true, + "detail": "alembic", + "documentation": {} + }, + { + "label": "op", + "importPath": "alembic", + "description": "alembic", + "isExtraImport": true, + "detail": "alembic", + "documentation": {} + }, + { + "label": "op", + "importPath": "alembic", + "description": "alembic", + "isExtraImport": true, + "detail": "alembic", + "documentation": {} + }, + { + "label": "op", + "importPath": "alembic", + "description": "alembic", + "isExtraImport": true, + "detail": "alembic", + "documentation": {} + }, + { + "label": "op", + "importPath": "alembic", + "description": "alembic", + "isExtraImport": true, + "detail": "alembic", + "documentation": {} + }, + { + "label": "op", + "importPath": "alembic", + "description": "alembic", + "isExtraImport": true, + "detail": "alembic", + "documentation": {} + }, + { + "label": "op", + "importPath": "alembic", + "description": "alembic", + "isExtraImport": true, + "detail": "alembic", + "documentation": {} + }, + { + "label": "op", + "importPath": "alembic", + "description": "alembic", + "isExtraImport": true, + "detail": "alembic", + "documentation": {} + }, + { + "label": "op", + "importPath": "alembic", + "description": "alembic", + "isExtraImport": true, + "detail": "alembic", + "documentation": {} + }, + { + "label": "op", + "importPath": "alembic", + "description": "alembic", + "isExtraImport": true, + "detail": "alembic", + "documentation": {} + }, + { + "label": "op", + "importPath": "alembic", + "description": "alembic", + "isExtraImport": true, + "detail": "alembic", + "documentation": {} + }, + { + "label": "op", + "importPath": "alembic", + "description": "alembic", + "isExtraImport": true, + "detail": "alembic", + "documentation": {} + }, + { + "label": "op", + "importPath": "alembic", + "description": "alembic", + "isExtraImport": true, + "detail": "alembic", + "documentation": {} + }, + { + "label": "op", + "importPath": "alembic", + "description": "alembic", + "isExtraImport": true, + "detail": "alembic", + "documentation": {} + }, + { + "label": "op", + "importPath": "alembic", + "description": "alembic", + "isExtraImport": true, + "detail": "alembic", + "documentation": {} + }, + { + "label": "op", + "importPath": "alembic", + "description": "alembic", + "isExtraImport": true, + "detail": "alembic", + "documentation": {} + }, + { + "label": "context", + "importPath": "alembic", + "description": "alembic", + "isExtraImport": true, + "detail": "alembic", + "documentation": {} + }, + { + "label": "sqlalchemy", + "kind": 6, + "isExtraImport": true, + "importPath": "sqlalchemy", + "description": "sqlalchemy", + "detail": "sqlalchemy", + "documentation": {} + }, + { + "label": "engine_from_config", + "importPath": "sqlalchemy", + "description": "sqlalchemy", + "isExtraImport": true, + "detail": "sqlalchemy", + "documentation": {} + }, + { + "label": "pool", + "importPath": "sqlalchemy", + "description": "sqlalchemy", + "isExtraImport": true, + "detail": "sqlalchemy", + "documentation": {} + }, + { + "label": "or_", + "importPath": "sqlalchemy", + "description": "sqlalchemy", + "isExtraImport": true, + "detail": "sqlalchemy", + "documentation": {} + }, + { + "label": "func", + "importPath": "sqlalchemy", + "description": "sqlalchemy", + "isExtraImport": true, + "detail": "sqlalchemy", + "documentation": {} + }, + { + "label": "or_", + "importPath": "sqlalchemy", + "description": "sqlalchemy", + "isExtraImport": true, + "detail": "sqlalchemy", + "documentation": {} + }, + { + "label": "func", + "importPath": "sqlalchemy", + "description": "sqlalchemy", + "isExtraImport": true, + "detail": "sqlalchemy", + "documentation": {} + }, + { + "label": "text", + "importPath": "sqlalchemy", + "description": "sqlalchemy", + "isExtraImport": true, + "detail": "sqlalchemy", + "documentation": {} + }, + { + "label": "String", + "importPath": "sqlalchemy", + "description": "sqlalchemy", + "isExtraImport": true, + "detail": "sqlalchemy", + "documentation": {} + }, + { + "label": "Text", + "importPath": "sqlalchemy", + "description": "sqlalchemy", + "isExtraImport": true, + "detail": "sqlalchemy", + "documentation": {} + }, + { + "label": "DateTime", + "importPath": "sqlalchemy", + "description": "sqlalchemy", + "isExtraImport": true, + "detail": "sqlalchemy", + "documentation": {} + }, + { + "label": "ForeignKey", + "importPath": "sqlalchemy", + "description": "sqlalchemy", + "isExtraImport": true, + "detail": "sqlalchemy", + "documentation": {} + }, + { + "label": "Index", + "importPath": "sqlalchemy", + "description": "sqlalchemy", + "isExtraImport": true, + "detail": "sqlalchemy", + "documentation": {} + }, + { + "label": "func", + "importPath": "sqlalchemy", + "description": "sqlalchemy", + "isExtraImport": true, + "detail": "sqlalchemy", + "documentation": {} + }, + { + "label": "JSON", + "importPath": "sqlalchemy", + "description": "sqlalchemy", + "isExtraImport": true, + "detail": "sqlalchemy", + "documentation": {} + }, + { + "label": "Column", + "importPath": "sqlalchemy", + "description": "sqlalchemy", + "isExtraImport": true, + "detail": "sqlalchemy", + "documentation": {} + }, + { + "label": "Enum", + "importPath": "sqlalchemy", + "description": "sqlalchemy", + "isExtraImport": true, + "detail": "sqlalchemy", + "documentation": {} + }, + { + "label": "LargeBinary", + "importPath": "sqlalchemy", + "description": "sqlalchemy", + "isExtraImport": true, + "detail": "sqlalchemy", + "documentation": {} + }, + { + "label": "UniqueConstraint", + "importPath": "sqlalchemy", + "description": "sqlalchemy", + "isExtraImport": true, + "detail": "sqlalchemy", + "documentation": {} + }, + { + "label": "create_engine", + "importPath": "sqlalchemy", + "description": "sqlalchemy", + "isExtraImport": true, + "detail": "sqlalchemy", + "documentation": {} + }, + { + "label": "text", + "importPath": "sqlalchemy", + "description": "sqlalchemy", + "isExtraImport": true, + "detail": "sqlalchemy", + "documentation": {} + }, + { + "label": "select", + "importPath": "sqlalchemy", + "description": "sqlalchemy", + "isExtraImport": true, + "detail": "sqlalchemy", + "documentation": {} + }, + { + "label": "postgresql", + "importPath": "sqlalchemy.dialects", + "description": "sqlalchemy.dialects", + "isExtraImport": true, + "detail": "sqlalchemy.dialects", + "documentation": {} + }, + { + "label": "postgresql", + "importPath": "sqlalchemy.dialects", + "description": "sqlalchemy.dialects", + "isExtraImport": true, + "detail": "sqlalchemy.dialects", + "documentation": {} + }, + { + "label": "postgresql", + "importPath": "sqlalchemy.dialects", + "description": "sqlalchemy.dialects", + "isExtraImport": true, + "detail": "sqlalchemy.dialects", + "documentation": {} + }, + { + "label": "postgresql", + "importPath": "sqlalchemy.dialects", + "description": "sqlalchemy.dialects", + "isExtraImport": true, + "detail": "sqlalchemy.dialects", + "documentation": {} + }, + { + "label": "postgresql", + "importPath": "sqlalchemy.dialects", + "description": "sqlalchemy.dialects", + "isExtraImport": true, + "detail": "sqlalchemy.dialects", + "documentation": {} + }, + { + "label": "postgresql", + "importPath": "sqlalchemy.dialects", + "description": "sqlalchemy.dialects", + "isExtraImport": true, + "detail": "sqlalchemy.dialects", + "documentation": {} + }, + { + "label": "postgresql", + "importPath": "sqlalchemy.dialects", + "description": "sqlalchemy.dialects", + "isExtraImport": true, + "detail": "sqlalchemy.dialects", + "documentation": {} + }, + { + "label": "postgresql", + "importPath": "sqlalchemy.dialects", + "description": "sqlalchemy.dialects", + "isExtraImport": true, + "detail": "sqlalchemy.dialects", + "documentation": {} + }, + { + "label": "postgresql", + "importPath": "sqlalchemy.dialects", + "description": "sqlalchemy.dialects", + "isExtraImport": true, + "detail": "sqlalchemy.dialects", + "documentation": {} + }, + { + "label": "os", + "kind": 6, + "isExtraImport": true, + "importPath": "os", + "description": "os", + "detail": "os", + "documentation": {} + }, + { + "label": "sys", + "kind": 6, + "isExtraImport": true, + "importPath": "sys", + "description": "sys", + "detail": "sys", + "documentation": {} + }, + { + "label": "fileConfig", + "importPath": "logging.config", + "description": "logging.config", + "isExtraImport": true, + "detail": "logging.config", + "documentation": {} + }, + { + "label": "load_dotenv", + "importPath": "dotenv", + "description": "dotenv", + "isExtraImport": true, + "detail": "dotenv", + "documentation": {} + }, + { + "label": "load_dotenv", + "importPath": "dotenv", + "description": "dotenv", + "isExtraImport": true, + "detail": "dotenv", + "documentation": {} + }, + { + "label": "load_dotenv", + "importPath": "dotenv", + "description": "dotenv", + "isExtraImport": true, + "detail": "dotenv", + "documentation": {} + }, + { + "label": "load_dotenv", + "importPath": "dotenv", + "description": "dotenv", + "isExtraImport": true, + "detail": "dotenv", + "documentation": {} + }, + { + "label": "load_dotenv", + "importPath": "dotenv", + "description": "dotenv", + "isExtraImport": true, + "detail": "dotenv", + "documentation": {} + }, + { + "label": "load_dotenv", + "importPath": "dotenv", + "description": "dotenv", + "isExtraImport": true, + "detail": "dotenv", + "documentation": {} + }, + { + "label": "load_dotenv", + "importPath": "dotenv", + "description": "dotenv", + "isExtraImport": true, + "detail": "dotenv", + "documentation": {} + }, + { + "label": "load_dotenv", + "importPath": "dotenv", + "description": "dotenv", + "isExtraImport": true, + "detail": "dotenv", + "documentation": {} + }, + { + "label": "load_dotenv", + "importPath": "dotenv", + "description": "dotenv", + "isExtraImport": true, + "detail": "dotenv", + "documentation": {} + }, + { + "label": "load_dotenv", + "importPath": "dotenv", + "description": "dotenv", + "isExtraImport": true, + "detail": "dotenv", + "documentation": {} + }, + { + "label": "load_dotenv", + "importPath": "dotenv", + "description": "dotenv", + "isExtraImport": true, + "detail": "dotenv", + "documentation": {} + }, + { + "label": "load_dotenv", + "importPath": "dotenv", + "description": "dotenv", + "isExtraImport": true, + "detail": "dotenv", + "documentation": {} + }, + { + "label": "load_dotenv", + "importPath": "dotenv", + "description": "dotenv", + "isExtraImport": true, + "detail": "dotenv", + "documentation": {} + }, + { + "label": "load_dotenv", + "importPath": "dotenv", + "description": "dotenv", + "isExtraImport": true, + "detail": "dotenv", + "documentation": {} + }, + { + "label": "load_dotenv", + "importPath": "dotenv", + "description": "dotenv", + "isExtraImport": true, + "detail": "dotenv", + "documentation": {} + }, + { + "label": "load_dotenv", + "importPath": "dotenv", + "description": "dotenv", + "isExtraImport": true, + "detail": "dotenv", + "documentation": {} + }, + { + "label": "load_dotenv", + "importPath": "dotenv", + "description": "dotenv", + "isExtraImport": true, + "detail": "dotenv", + "documentation": {} + }, + { + "label": "load_dotenv", + "importPath": "dotenv", + "description": "dotenv", + "isExtraImport": true, + "detail": "dotenv", + "documentation": {} + }, + { + "label": "load_dotenv", + "importPath": "dotenv", + "description": "dotenv", + "isExtraImport": true, + "detail": "dotenv", + "documentation": {} + }, + { + "label": "*", + "importPath": "spectragraph_core.core.models", + "description": "spectragraph_core.core.models", + "isExtraImport": true, + "detail": "spectragraph_core.core.models", + "documentation": {} + }, + { + "label": "Analysis", + "importPath": "spectragraph_core.core.models", + "description": "spectragraph_core.core.models", + "isExtraImport": true, + "detail": "spectragraph_core.core.models", + "documentation": {} + }, + { + "label": "Profile", + "importPath": "spectragraph_core.core.models", + "description": "spectragraph_core.core.models", + "isExtraImport": true, + "detail": "spectragraph_core.core.models", + "documentation": {} + }, + { + "label": "Profile", + "importPath": "spectragraph_core.core.models", + "description": "spectragraph_core.core.models", + "isExtraImport": true, + "detail": "spectragraph_core.core.models", + "documentation": {} + }, + { + "label": "Chat", + "importPath": "spectragraph_core.core.models", + "description": "spectragraph_core.core.models", + "isExtraImport": true, + "detail": "spectragraph_core.core.models", + "documentation": {} + }, + { + "label": "ChatMessage", + "importPath": "spectragraph_core.core.models", + "description": "spectragraph_core.core.models", + "isExtraImport": true, + "detail": "spectragraph_core.core.models", + "documentation": {} + }, + { + "label": "Profile", + "importPath": "spectragraph_core.core.models", + "description": "spectragraph_core.core.models", + "isExtraImport": true, + "detail": "spectragraph_core.core.models", + "documentation": {} + }, + { + "label": "CustomType", + "importPath": "spectragraph_core.core.models", + "description": "spectragraph_core.core.models", + "isExtraImport": true, + "detail": "spectragraph_core.core.models", + "documentation": {} + }, + { + "label": "Profile", + "importPath": "spectragraph_core.core.models", + "description": "spectragraph_core.core.models", + "isExtraImport": true, + "detail": "spectragraph_core.core.models", + "documentation": {} + }, + { + "label": "Log", + "importPath": "spectragraph_core.core.models", + "description": "spectragraph_core.core.models", + "isExtraImport": true, + "detail": "spectragraph_core.core.models", + "documentation": {} + }, + { + "label": "Sketch", + "importPath": "spectragraph_core.core.models", + "description": "spectragraph_core.core.models", + "isExtraImport": true, + "detail": "spectragraph_core.core.models", + "documentation": {} + }, + { + "label": "Profile", + "importPath": "spectragraph_core.core.models", + "description": "spectragraph_core.core.models", + "isExtraImport": true, + "detail": "spectragraph_core.core.models", + "documentation": {} + }, + { + "label": "Sketch", + "importPath": "spectragraph_core.core.models", + "description": "spectragraph_core.core.models", + "isExtraImport": true, + "detail": "spectragraph_core.core.models", + "documentation": {} + }, + { + "label": "Flow", + "importPath": "spectragraph_core.core.models", + "description": "spectragraph_core.core.models", + "isExtraImport": true, + "detail": "spectragraph_core.core.models", + "documentation": {} + }, + { + "label": "Profile", + "importPath": "spectragraph_core.core.models", + "description": "spectragraph_core.core.models", + "isExtraImport": true, + "detail": "spectragraph_core.core.models", + "documentation": {} + }, + { + "label": "CustomType", + "importPath": "spectragraph_core.core.models", + "description": "spectragraph_core.core.models", + "isExtraImport": true, + "detail": "spectragraph_core.core.models", + "documentation": {} + }, + { + "label": "Analysis", + "importPath": "spectragraph_core.core.models", + "description": "spectragraph_core.core.models", + "isExtraImport": true, + "detail": "spectragraph_core.core.models", + "documentation": {} + }, + { + "label": "Investigation", + "importPath": "spectragraph_core.core.models", + "description": "spectragraph_core.core.models", + "isExtraImport": true, + "detail": "spectragraph_core.core.models", + "documentation": {} + }, + { + "label": "InvestigationUserRole", + "importPath": "spectragraph_core.core.models", + "description": "spectragraph_core.core.models", + "isExtraImport": true, + "detail": "spectragraph_core.core.models", + "documentation": {} + }, + { + "label": "Profile", + "importPath": "spectragraph_core.core.models", + "description": "spectragraph_core.core.models", + "isExtraImport": true, + "detail": "spectragraph_core.core.models", + "documentation": {} + }, + { + "label": "Sketch", + "importPath": "spectragraph_core.core.models", + "description": "spectragraph_core.core.models", + "isExtraImport": true, + "detail": "spectragraph_core.core.models", + "documentation": {} + }, + { + "label": "Profile", + "importPath": "spectragraph_core.core.models", + "description": "spectragraph_core.core.models", + "isExtraImport": true, + "detail": "spectragraph_core.core.models", + "documentation": {} + }, + { + "label": "Key", + "importPath": "spectragraph_core.core.models", + "description": "spectragraph_core.core.models", + "isExtraImport": true, + "detail": "spectragraph_core.core.models", + "documentation": {} + }, + { + "label": "Scan", + "importPath": "spectragraph_core.core.models", + "description": "spectragraph_core.core.models", + "isExtraImport": true, + "detail": "spectragraph_core.core.models", + "documentation": {} + }, + { + "label": "Profile", + "importPath": "spectragraph_core.core.models", + "description": "spectragraph_core.core.models", + "isExtraImport": true, + "detail": "spectragraph_core.core.models", + "documentation": {} + }, + { + "label": "Sketch", + "importPath": "spectragraph_core.core.models", + "description": "spectragraph_core.core.models", + "isExtraImport": true, + "detail": "spectragraph_core.core.models", + "documentation": {} + }, + { + "label": "Profile", + "importPath": "spectragraph_core.core.models", + "description": "spectragraph_core.core.models", + "isExtraImport": true, + "detail": "spectragraph_core.core.models", + "documentation": {} + }, + { + "label": "CustomType", + "importPath": "spectragraph_core.core.models", + "description": "spectragraph_core.core.models", + "isExtraImport": true, + "detail": "spectragraph_core.core.models", + "documentation": {} + }, + { + "label": "Profile", + "importPath": "spectragraph_core.core.models", + "description": "spectragraph_core.core.models", + "isExtraImport": true, + "detail": "spectragraph_core.core.models", + "documentation": {} + }, + { + "label": "CustomType", + "importPath": "spectragraph_core.core.models", + "description": "spectragraph_core.core.models", + "isExtraImport": true, + "detail": "spectragraph_core.core.models", + "documentation": {} + }, + { + "label": "Profile", + "importPath": "spectragraph_core.core.models", + "description": "spectragraph_core.core.models", + "isExtraImport": true, + "detail": "spectragraph_core.core.models", + "documentation": {} + }, + { + "label": "Profile", + "importPath": "spectragraph_core.core.models", + "description": "spectragraph_core.core.models", + "isExtraImport": true, + "detail": "spectragraph_core.core.models", + "documentation": {} + }, + { + "label": "Sketch", + "importPath": "spectragraph_core.core.models", + "description": "spectragraph_core.core.models", + "isExtraImport": true, + "detail": "spectragraph_core.core.models", + "documentation": {} + }, + { + "label": "Investigation", + "importPath": "spectragraph_core.core.models", + "description": "spectragraph_core.core.models", + "isExtraImport": true, + "detail": "spectragraph_core.core.models", + "documentation": {} + }, + { + "label": "InvestigationUserRole", + "importPath": "spectragraph_core.core.models", + "description": "spectragraph_core.core.models", + "isExtraImport": true, + "detail": "spectragraph_core.core.models", + "documentation": {} + }, + { + "label": "Key", + "importPath": "spectragraph_core.core.models", + "description": "spectragraph_core.core.models", + "isExtraImport": true, + "detail": "spectragraph_core.core.models", + "documentation": {} + }, + { + "label": "uuid", + "kind": 6, + "isExtraImport": true, + "importPath": "uuid", + "description": "uuid", + "detail": "uuid", + "documentation": {} + }, + { + "label": "UUID", + "importPath": "uuid", + "description": "uuid", + "isExtraImport": true, + "detail": "uuid", + "documentation": {} + }, + { + "label": "uuid4", + "importPath": "uuid", + "description": "uuid", + "isExtraImport": true, + "detail": "uuid", + "documentation": {} + }, + { + "label": "UUID", + "importPath": "uuid", + "description": "uuid", + "isExtraImport": true, + "detail": "uuid", + "documentation": {} + }, + { + "label": "uuid4", + "importPath": "uuid", + "description": "uuid", + "isExtraImport": true, + "detail": "uuid", + "documentation": {} + }, + { + "label": "UUID", + "importPath": "uuid", + "description": "uuid", + "isExtraImport": true, + "detail": "uuid", + "documentation": {} + }, + { + "label": "UUID", + "importPath": "uuid", + "description": "uuid", + "isExtraImport": true, + "detail": "uuid", + "documentation": {} + }, + { + "label": "uuid4", + "importPath": "uuid", + "description": "uuid", + "isExtraImport": true, + "detail": "uuid", + "documentation": {} + }, + { + "label": "UUID", + "importPath": "uuid", + "description": "uuid", + "isExtraImport": true, + "detail": "uuid", + "documentation": {} + }, + { + "label": "uuid4", + "importPath": "uuid", + "description": "uuid", + "isExtraImport": true, + "detail": "uuid", + "documentation": {} + }, + { + "label": "UUID", + "importPath": "uuid", + "description": "uuid", + "isExtraImport": true, + "detail": "uuid", + "documentation": {} + }, + { + "label": "uuid4", + "importPath": "uuid", + "description": "uuid", + "isExtraImport": true, + "detail": "uuid", + "documentation": {} + }, + { + "label": "UUID", + "importPath": "uuid", + "description": "uuid", + "isExtraImport": true, + "detail": "uuid", + "documentation": {} + }, + { + "label": "UUID", + "importPath": "uuid", + "description": "uuid", + "isExtraImport": true, + "detail": "uuid", + "documentation": {} + }, + { + "label": "uuid4", + "importPath": "uuid", + "description": "uuid", + "isExtraImport": true, + "detail": "uuid", + "documentation": {} + }, + { + "label": "UUID", + "importPath": "uuid", + "description": "uuid", + "isExtraImport": true, + "detail": "uuid", + "documentation": {} + }, + { + "label": "UUID", + "importPath": "uuid", + "description": "uuid", + "isExtraImport": true, + "detail": "uuid", + "documentation": {} + }, + { + "label": "UUID", + "importPath": "uuid", + "description": "uuid", + "isExtraImport": true, + "detail": "uuid", + "documentation": {} + }, + { + "label": "UUID", + "importPath": "uuid", + "description": "uuid", + "isExtraImport": true, + "detail": "uuid", + "documentation": {} + }, + { + "label": "UUID", + "importPath": "uuid", + "description": "uuid", + "isExtraImport": true, + "detail": "uuid", + "documentation": {} + }, + { + "label": "UUID", + "importPath": "uuid", + "description": "uuid", + "isExtraImport": true, + "detail": "uuid", + "documentation": {} + }, + { + "label": "check_investigation_permission", + "importPath": "app.security.permissions", + "description": "app.security.permissions", + "isExtraImport": true, + "detail": "app.security.permissions", + "documentation": {} + }, + { + "label": "check_investigation_permission", + "importPath": "app.security.permissions", + "description": "app.security.permissions", + "isExtraImport": true, + "detail": "app.security.permissions", + "documentation": {} + }, + { + "label": "check_investigation_permission", + "importPath": "app.security.permissions", + "description": "app.security.permissions", + "isExtraImport": true, + "detail": "app.security.permissions", + "documentation": {} + }, + { + "label": "APIRouter", + "importPath": "fastapi", + "description": "fastapi", + "isExtraImport": true, + "detail": "fastapi", + "documentation": {} + }, + { + "label": "HTTPException", + "importPath": "fastapi", + "description": "fastapi", + "isExtraImport": true, + "detail": "fastapi", + "documentation": {} + }, + { + "label": "Depends", + "importPath": "fastapi", + "description": "fastapi", + "isExtraImport": true, + "detail": "fastapi", + "documentation": {} + }, + { + "label": "status", + "importPath": "fastapi", + "description": "fastapi", + "isExtraImport": true, + "detail": "fastapi", + "documentation": {} + }, + { + "label": "APIRouter", + "importPath": "fastapi", + "description": "fastapi", + "isExtraImport": true, + "detail": "fastapi", + "documentation": {} + }, + { + "label": "Depends", + "importPath": "fastapi", + "description": "fastapi", + "isExtraImport": true, + "detail": "fastapi", + "documentation": {} + }, + { + "label": "HTTPException", + "importPath": "fastapi", + "description": "fastapi", + "isExtraImport": true, + "detail": "fastapi", + "documentation": {} + }, + { + "label": "APIRouter", + "importPath": "fastapi", + "description": "fastapi", + "isExtraImport": true, + "detail": "fastapi", + "documentation": {} + }, + { + "label": "HTTPException", + "importPath": "fastapi", + "description": "fastapi", + "isExtraImport": true, + "detail": "fastapi", + "documentation": {} + }, + { + "label": "APIRouter", + "importPath": "fastapi", + "description": "fastapi", + "isExtraImport": true, + "detail": "fastapi", + "documentation": {} + }, + { + "label": "HTTPException", + "importPath": "fastapi", + "description": "fastapi", + "isExtraImport": true, + "detail": "fastapi", + "documentation": {} + }, + { + "label": "Depends", + "importPath": "fastapi", + "description": "fastapi", + "isExtraImport": true, + "detail": "fastapi", + "documentation": {} + }, + { + "label": "status", + "importPath": "fastapi", + "description": "fastapi", + "isExtraImport": true, + "detail": "fastapi", + "documentation": {} + }, + { + "label": "APIRouter", + "importPath": "fastapi", + "description": "fastapi", + "isExtraImport": true, + "detail": "fastapi", + "documentation": {} + }, + { + "label": "HTTPException", + "importPath": "fastapi", + "description": "fastapi", + "isExtraImport": true, + "detail": "fastapi", + "documentation": {} + }, + { + "label": "Depends", + "importPath": "fastapi", + "description": "fastapi", + "isExtraImport": true, + "detail": "fastapi", + "documentation": {} + }, + { + "label": "status", + "importPath": "fastapi", + "description": "fastapi", + "isExtraImport": true, + "detail": "fastapi", + "documentation": {} + }, + { + "label": "APIRouter", + "importPath": "fastapi", + "description": "fastapi", + "isExtraImport": true, + "detail": "fastapi", + "documentation": {} + }, + { + "label": "Depends", + "importPath": "fastapi", + "description": "fastapi", + "isExtraImport": true, + "detail": "fastapi", + "documentation": {} + }, + { + "label": "HTTPException", + "importPath": "fastapi", + "description": "fastapi", + "isExtraImport": true, + "detail": "fastapi", + "documentation": {} + }, + { + "label": "Request", + "importPath": "fastapi", + "description": "fastapi", + "isExtraImport": true, + "detail": "fastapi", + "documentation": {} + }, + { + "label": "APIRouter", + "importPath": "fastapi", + "description": "fastapi", + "isExtraImport": true, + "detail": "fastapi", + "documentation": {} + }, + { + "label": "HTTPException", + "importPath": "fastapi", + "description": "fastapi", + "isExtraImport": true, + "detail": "fastapi", + "documentation": {} + }, + { + "label": "Depends", + "importPath": "fastapi", + "description": "fastapi", + "isExtraImport": true, + "detail": "fastapi", + "documentation": {} + }, + { + "label": "status", + "importPath": "fastapi", + "description": "fastapi", + "isExtraImport": true, + "detail": "fastapi", + "documentation": {} + }, + { + "label": "Query", + "importPath": "fastapi", + "description": "fastapi", + "isExtraImport": true, + "detail": "fastapi", + "documentation": {} + }, + { + "label": "APIRouter", + "importPath": "fastapi", + "description": "fastapi", + "isExtraImport": true, + "detail": "fastapi", + "documentation": {} + }, + { + "label": "HTTPException", + "importPath": "fastapi", + "description": "fastapi", + "isExtraImport": true, + "detail": "fastapi", + "documentation": {} + }, + { + "label": "Depends", + "importPath": "fastapi", + "description": "fastapi", + "isExtraImport": true, + "detail": "fastapi", + "documentation": {} + }, + { + "label": "status", + "importPath": "fastapi", + "description": "fastapi", + "isExtraImport": true, + "detail": "fastapi", + "documentation": {} + }, + { + "label": "APIRouter", + "importPath": "fastapi", + "description": "fastapi", + "isExtraImport": true, + "detail": "fastapi", + "documentation": {} + }, + { + "label": "HTTPException", + "importPath": "fastapi", + "description": "fastapi", + "isExtraImport": true, + "detail": "fastapi", + "documentation": {} + }, + { + "label": "Depends", + "importPath": "fastapi", + "description": "fastapi", + "isExtraImport": true, + "detail": "fastapi", + "documentation": {} + }, + { + "label": "status", + "importPath": "fastapi", + "description": "fastapi", + "isExtraImport": true, + "detail": "fastapi", + "documentation": {} + }, + { + "label": "APIRouter", + "importPath": "fastapi", + "description": "fastapi", + "isExtraImport": true, + "detail": "fastapi", + "documentation": {} + }, + { + "label": "HTTPException", + "importPath": "fastapi", + "description": "fastapi", + "isExtraImport": true, + "detail": "fastapi", + "documentation": {} + }, + { + "label": "Depends", + "importPath": "fastapi", + "description": "fastapi", + "isExtraImport": true, + "detail": "fastapi", + "documentation": {} + }, + { + "label": "status", + "importPath": "fastapi", + "description": "fastapi", + "isExtraImport": true, + "detail": "fastapi", + "documentation": {} + }, + { + "label": "APIRouter", + "importPath": "fastapi", + "description": "fastapi", + "isExtraImport": true, + "detail": "fastapi", + "documentation": {} + }, + { + "label": "HTTPException", + "importPath": "fastapi", + "description": "fastapi", + "isExtraImport": true, + "detail": "fastapi", + "documentation": {} + }, + { + "label": "Depends", + "importPath": "fastapi", + "description": "fastapi", + "isExtraImport": true, + "detail": "fastapi", + "documentation": {} + }, + { + "label": "status", + "importPath": "fastapi", + "description": "fastapi", + "isExtraImport": true, + "detail": "fastapi", + "documentation": {} + }, + { + "label": "UploadFile", + "importPath": "fastapi", + "description": "fastapi", + "isExtraImport": true, + "detail": "fastapi", + "documentation": {} + }, + { + "label": "File", + "importPath": "fastapi", + "description": "fastapi", + "isExtraImport": true, + "detail": "fastapi", + "documentation": {} + }, + { + "label": "Form", + "importPath": "fastapi", + "description": "fastapi", + "isExtraImport": true, + "detail": "fastapi", + "documentation": {} + }, + { + "label": "BackgroundTasks", + "importPath": "fastapi", + "description": "fastapi", + "isExtraImport": true, + "detail": "fastapi", + "documentation": {} + }, + { + "label": "APIRouter", + "importPath": "fastapi", + "description": "fastapi", + "isExtraImport": true, + "detail": "fastapi", + "documentation": {} + }, + { + "label": "HTTPException", + "importPath": "fastapi", + "description": "fastapi", + "isExtraImport": true, + "detail": "fastapi", + "documentation": {} + }, + { + "label": "Depends", + "importPath": "fastapi", + "description": "fastapi", + "isExtraImport": true, + "detail": "fastapi", + "documentation": {} + }, + { + "label": "Query", + "importPath": "fastapi", + "description": "fastapi", + "isExtraImport": true, + "detail": "fastapi", + "documentation": {} + }, + { + "label": "APIRouter", + "importPath": "fastapi", + "description": "fastapi", + "isExtraImport": true, + "detail": "fastapi", + "documentation": {} + }, + { + "label": "Depends", + "importPath": "fastapi", + "description": "fastapi", + "isExtraImport": true, + "detail": "fastapi", + "documentation": {} + }, + { + "label": "Depends", + "importPath": "fastapi", + "description": "fastapi", + "isExtraImport": true, + "detail": "fastapi", + "documentation": {} + }, + { + "label": "HTTPException", + "importPath": "fastapi", + "description": "fastapi", + "isExtraImport": true, + "detail": "fastapi", + "documentation": {} + }, + { + "label": "status", + "importPath": "fastapi", + "description": "fastapi", + "isExtraImport": true, + "detail": "fastapi", + "documentation": {} + }, + { + "label": "BackgroundTasks", + "importPath": "fastapi", + "description": "fastapi", + "isExtraImport": true, + "detail": "fastapi", + "documentation": {} + }, + { + "label": "HTTPException", + "importPath": "fastapi", + "description": "fastapi", + "isExtraImport": true, + "detail": "fastapi", + "documentation": {} + }, + { + "label": "HTTPException", + "importPath": "fastapi", + "description": "fastapi", + "isExtraImport": true, + "detail": "fastapi", + "documentation": {} + }, + { + "label": "HTTPException", + "importPath": "fastapi", + "description": "fastapi", + "isExtraImport": true, + "detail": "fastapi", + "documentation": {} + }, + { + "label": "Request", + "importPath": "fastapi", + "description": "fastapi", + "isExtraImport": true, + "detail": "fastapi", + "documentation": {} + }, + { + "label": "status", + "importPath": "fastapi", + "description": "fastapi", + "isExtraImport": true, + "detail": "fastapi", + "documentation": {} + }, + { + "label": "FastAPI", + "importPath": "fastapi", + "description": "fastapi", + "isExtraImport": true, + "detail": "fastapi", + "documentation": {} + }, + { + "label": "FastAPI", + "importPath": "fastapi", + "description": "fastapi", + "isExtraImport": true, + "detail": "fastapi", + "documentation": {} + }, + { + "label": "datetime", + "importPath": "datetime", + "description": "datetime", + "isExtraImport": true, + "detail": "datetime", + "documentation": {} + }, + { + "label": "datetime", + "importPath": "datetime", + "description": "datetime", + "isExtraImport": true, + "detail": "datetime", + "documentation": {} + }, + { + "label": "datetime", + "importPath": "datetime", + "description": "datetime", + "isExtraImport": true, + "detail": "datetime", + "documentation": {} + }, + { + "label": "timedelta", + "importPath": "datetime", + "description": "datetime", + "isExtraImport": true, + "detail": "datetime", + "documentation": {} + }, + { + "label": "datetime", + "importPath": "datetime", + "description": "datetime", + "isExtraImport": true, + "detail": "datetime", + "documentation": {} + }, + { + "label": "datetime", + "importPath": "datetime", + "description": "datetime", + "isExtraImport": true, + "detail": "datetime", + "documentation": {} + }, + { + "label": "datetime", + "importPath": "datetime", + "description": "datetime", + "isExtraImport": true, + "detail": "datetime", + "documentation": {} + }, + { + "label": "timezone", + "importPath": "datetime", + "description": "datetime", + "isExtraImport": true, + "detail": "datetime", + "documentation": {} + }, + { + "label": "datetime", + "importPath": "datetime", + "description": "datetime", + "isExtraImport": true, + "detail": "datetime", + "documentation": {} + }, + { + "label": "datetime", + "importPath": "datetime", + "description": "datetime", + "isExtraImport": true, + "detail": "datetime", + "documentation": {} + }, + { + "label": "datetime", + "importPath": "datetime", + "description": "datetime", + "isExtraImport": true, + "detail": "datetime", + "documentation": {} + }, + { + "label": "datetime", + "importPath": "datetime", + "description": "datetime", + "isExtraImport": true, + "detail": "datetime", + "documentation": {} + }, + { + "label": "datetime", + "importPath": "datetime", + "description": "datetime", + "isExtraImport": true, + "detail": "datetime", + "documentation": {} + }, + { + "label": "datetime", + "importPath": "datetime", + "description": "datetime", + "isExtraImport": true, + "detail": "datetime", + "documentation": {} + }, + { + "label": "datetime", + "importPath": "datetime", + "description": "datetime", + "isExtraImport": true, + "detail": "datetime", + "documentation": {} + }, + { + "label": "datetime", + "importPath": "datetime", + "description": "datetime", + "isExtraImport": true, + "detail": "datetime", + "documentation": {} + }, + { + "label": "datetime", + "importPath": "datetime", + "description": "datetime", + "isExtraImport": true, + "detail": "datetime", + "documentation": {} + }, + { + "label": "datetime", + "importPath": "datetime", + "description": "datetime", + "isExtraImport": true, + "detail": "datetime", + "documentation": {} + }, + { + "label": "datetime", + "importPath": "datetime", + "description": "datetime", + "isExtraImport": true, + "detail": "datetime", + "documentation": {} + }, + { + "label": "timedelta", + "importPath": "datetime", + "description": "datetime", + "isExtraImport": true, + "detail": "datetime", + "documentation": {} + }, + { + "label": "datetime", + "importPath": "datetime", + "description": "datetime", + "isExtraImport": true, + "detail": "datetime", + "documentation": {} + }, + { + "label": "timezone", + "importPath": "datetime", + "description": "datetime", + "isExtraImport": true, + "detail": "datetime", + "documentation": {} + }, + { + "label": "datetime", + "importPath": "datetime", + "description": "datetime", + "isExtraImport": true, + "detail": "datetime", + "documentation": {} + }, + { + "label": "datetime", + "importPath": "datetime", + "description": "datetime", + "isExtraImport": true, + "detail": "datetime", + "documentation": {} + }, + { + "label": "datetime", + "importPath": "datetime", + "description": "datetime", + "isExtraImport": true, + "detail": "datetime", + "documentation": {} + }, + { + "label": "datetime", + "importPath": "datetime", + "description": "datetime", + "isExtraImport": true, + "detail": "datetime", + "documentation": {} + }, + { + "label": "datetime", + "importPath": "datetime", + "description": "datetime", + "isExtraImport": true, + "detail": "datetime", + "documentation": {} + }, + { + "label": "timedelta", + "importPath": "datetime", + "description": "datetime", + "isExtraImport": true, + "detail": "datetime", + "documentation": {} + }, + { + "label": "datetime", + "importPath": "datetime", + "description": "datetime", + "isExtraImport": true, + "detail": "datetime", + "documentation": {} + }, + { + "label": "datetime", + "importPath": "datetime", + "description": "datetime", + "isExtraImport": true, + "detail": "datetime", + "documentation": {} + }, + { + "label": "datetime", + "importPath": "datetime", + "description": "datetime", + "isExtraImport": true, + "detail": "datetime", + "documentation": {} + }, + { + "label": "datetime", + "importPath": "datetime", + "description": "datetime", + "isExtraImport": true, + "detail": "datetime", + "documentation": {} + }, + { + "label": "Session", + "importPath": "sqlalchemy.orm", + "description": "sqlalchemy.orm", + "isExtraImport": true, + "detail": "sqlalchemy.orm", + "documentation": {} + }, + { + "label": "Session", + "importPath": "sqlalchemy.orm", + "description": "sqlalchemy.orm", + "isExtraImport": true, + "detail": "sqlalchemy.orm", + "documentation": {} + }, + { + "label": "Session", + "importPath": "sqlalchemy.orm", + "description": "sqlalchemy.orm", + "isExtraImport": true, + "detail": "sqlalchemy.orm", + "documentation": {} + }, + { + "label": "Session", + "importPath": "sqlalchemy.orm", + "description": "sqlalchemy.orm", + "isExtraImport": true, + "detail": "sqlalchemy.orm", + "documentation": {} + }, + { + "label": "Session", + "importPath": "sqlalchemy.orm", + "description": "sqlalchemy.orm", + "isExtraImport": true, + "detail": "sqlalchemy.orm", + "documentation": {} + }, + { + "label": "Session", + "importPath": "sqlalchemy.orm", + "description": "sqlalchemy.orm", + "isExtraImport": true, + "detail": "sqlalchemy.orm", + "documentation": {} + }, + { + "label": "Session", + "importPath": "sqlalchemy.orm", + "description": "sqlalchemy.orm", + "isExtraImport": true, + "detail": "sqlalchemy.orm", + "documentation": {} + }, + { + "label": "selectinload", + "importPath": "sqlalchemy.orm", + "description": "sqlalchemy.orm", + "isExtraImport": true, + "detail": "sqlalchemy.orm", + "documentation": {} + }, + { + "label": "Session", + "importPath": "sqlalchemy.orm", + "description": "sqlalchemy.orm", + "isExtraImport": true, + "detail": "sqlalchemy.orm", + "documentation": {} + }, + { + "label": "Session", + "importPath": "sqlalchemy.orm", + "description": "sqlalchemy.orm", + "isExtraImport": true, + "detail": "sqlalchemy.orm", + "documentation": {} + }, + { + "label": "Session", + "importPath": "sqlalchemy.orm", + "description": "sqlalchemy.orm", + "isExtraImport": true, + "detail": "sqlalchemy.orm", + "documentation": {} + }, + { + "label": "Session", + "importPath": "sqlalchemy.orm", + "description": "sqlalchemy.orm", + "isExtraImport": true, + "detail": "sqlalchemy.orm", + "documentation": {} + }, + { + "label": "Session", + "importPath": "sqlalchemy.orm", + "description": "sqlalchemy.orm", + "isExtraImport": true, + "detail": "sqlalchemy.orm", + "documentation": {} + }, + { + "label": "Session", + "importPath": "sqlalchemy.orm", + "description": "sqlalchemy.orm", + "isExtraImport": true, + "detail": "sqlalchemy.orm", + "documentation": {} + }, + { + "label": "Session", + "importPath": "sqlalchemy.orm", + "description": "sqlalchemy.orm", + "isExtraImport": true, + "detail": "sqlalchemy.orm", + "documentation": {} + }, + { + "label": "DeclarativeBase", + "importPath": "sqlalchemy.orm", + "description": "sqlalchemy.orm", + "isExtraImport": true, + "detail": "sqlalchemy.orm", + "documentation": {} + }, + { + "label": "Mapped", + "importPath": "sqlalchemy.orm", + "description": "sqlalchemy.orm", + "isExtraImport": true, + "detail": "sqlalchemy.orm", + "documentation": {} + }, + { + "label": "mapped_column", + "importPath": "sqlalchemy.orm", + "description": "sqlalchemy.orm", + "isExtraImport": true, + "detail": "sqlalchemy.orm", + "documentation": {} + }, + { + "label": "relationship", + "importPath": "sqlalchemy.orm", + "description": "sqlalchemy.orm", + "isExtraImport": true, + "detail": "sqlalchemy.orm", + "documentation": {} + }, + { + "label": "sessionmaker", + "importPath": "sqlalchemy.orm", + "description": "sqlalchemy.orm", + "isExtraImport": true, + "detail": "sqlalchemy.orm", + "documentation": {} + }, + { + "label": "declarative_base", + "importPath": "sqlalchemy.orm", + "description": "sqlalchemy.orm", + "isExtraImport": true, + "detail": "sqlalchemy.orm", + "documentation": {} + }, + { + "label": "Session", + "importPath": "sqlalchemy.orm", + "description": "sqlalchemy.orm", + "isExtraImport": true, + "detail": "sqlalchemy.orm", + "documentation": {} + }, + { + "label": "Session", + "importPath": "sqlalchemy.orm", + "description": "sqlalchemy.orm", + "isExtraImport": true, + "detail": "sqlalchemy.orm", + "documentation": {} + }, + { + "label": "Session", + "importPath": "sqlalchemy.orm", + "description": "sqlalchemy.orm", + "isExtraImport": true, + "detail": "sqlalchemy.orm", + "documentation": {} + }, + { + "label": "Session", + "importPath": "sqlalchemy.orm", + "description": "sqlalchemy.orm", + "isExtraImport": true, + "detail": "sqlalchemy.orm", + "documentation": {} + }, + { + "label": "get_db", + "importPath": "spectragraph_core.core.postgre_db", + "description": "spectragraph_core.core.postgre_db", + "isExtraImport": true, + "detail": "spectragraph_core.core.postgre_db", + "documentation": {} + }, + { + "label": "get_db", + "importPath": "spectragraph_core.core.postgre_db", + "description": "spectragraph_core.core.postgre_db", + "isExtraImport": true, + "detail": "spectragraph_core.core.postgre_db", + "documentation": {} + }, + { + "label": "get_db", + "importPath": "spectragraph_core.core.postgre_db", + "description": "spectragraph_core.core.postgre_db", + "isExtraImport": true, + "detail": "spectragraph_core.core.postgre_db", + "documentation": {} + }, + { + "label": "get_db", + "importPath": "spectragraph_core.core.postgre_db", + "description": "spectragraph_core.core.postgre_db", + "isExtraImport": true, + "detail": "spectragraph_core.core.postgre_db", + "documentation": {} + }, + { + "label": "get_db", + "importPath": "spectragraph_core.core.postgre_db", + "description": "spectragraph_core.core.postgre_db", + "isExtraImport": true, + "detail": "spectragraph_core.core.postgre_db", + "documentation": {} + }, + { + "label": "get_db", + "importPath": "spectragraph_core.core.postgre_db", + "description": "spectragraph_core.core.postgre_db", + "isExtraImport": true, + "detail": "spectragraph_core.core.postgre_db", + "documentation": {} + }, + { + "label": "get_db", + "importPath": "spectragraph_core.core.postgre_db", + "description": "spectragraph_core.core.postgre_db", + "isExtraImport": true, + "detail": "spectragraph_core.core.postgre_db", + "documentation": {} + }, + { + "label": "get_db", + "importPath": "spectragraph_core.core.postgre_db", + "description": "spectragraph_core.core.postgre_db", + "isExtraImport": true, + "detail": "spectragraph_core.core.postgre_db", + "documentation": {} + }, + { + "label": "get_db", + "importPath": "spectragraph_core.core.postgre_db", + "description": "spectragraph_core.core.postgre_db", + "isExtraImport": true, + "detail": "spectragraph_core.core.postgre_db", + "documentation": {} + }, + { + "label": "get_db", + "importPath": "spectragraph_core.core.postgre_db", + "description": "spectragraph_core.core.postgre_db", + "isExtraImport": true, + "detail": "spectragraph_core.core.postgre_db", + "documentation": {} + }, + { + "label": "get_db", + "importPath": "spectragraph_core.core.postgre_db", + "description": "spectragraph_core.core.postgre_db", + "isExtraImport": true, + "detail": "spectragraph_core.core.postgre_db", + "documentation": {} + }, + { + "label": "get_db", + "importPath": "spectragraph_core.core.postgre_db", + "description": "spectragraph_core.core.postgre_db", + "isExtraImport": true, + "detail": "spectragraph_core.core.postgre_db", + "documentation": {} + }, + { + "label": "get_db", + "importPath": "spectragraph_core.core.postgre_db", + "description": "spectragraph_core.core.postgre_db", + "isExtraImport": true, + "detail": "spectragraph_core.core.postgre_db", + "documentation": {} + }, + { + "label": "ensure_db_connection", + "importPath": "spectragraph_core.core.postgre_db", + "description": "spectragraph_core.core.postgre_db", + "isExtraImport": true, + "detail": "spectragraph_core.core.postgre_db", + "documentation": {} + }, + { + "label": "engine", + "importPath": "spectragraph_core.core.postgre_db", + "description": "spectragraph_core.core.postgre_db", + "isExtraImport": true, + "detail": "spectragraph_core.core.postgre_db", + "documentation": {} + }, + { + "label": "DatabaseUnavailableError", + "importPath": "spectragraph_core.core.postgre_db", + "description": "spectragraph_core.core.postgre_db", + "isExtraImport": true, + "detail": "spectragraph_core.core.postgre_db", + "documentation": {} + }, + { + "label": "ensure_db_connection", + "importPath": "spectragraph_core.core.postgre_db", + "description": "spectragraph_core.core.postgre_db", + "isExtraImport": true, + "detail": "spectragraph_core.core.postgre_db", + "documentation": {} + }, + { + "label": "DatabaseUnavailableError", + "importPath": "spectragraph_core.core.postgre_db", + "description": "spectragraph_core.core.postgre_db", + "isExtraImport": true, + "detail": "spectragraph_core.core.postgre_db", + "documentation": {} + }, + { + "label": "get_current_user", + "importPath": "app.api.deps", + "description": "app.api.deps", + "isExtraImport": true, + "detail": "app.api.deps", + "documentation": {} + }, + { + "label": "get_current_user", + "importPath": "app.api.deps", + "description": "app.api.deps", + "isExtraImport": true, + "detail": "app.api.deps", + "documentation": {} + }, + { + "label": "get_current_user", + "importPath": "app.api.deps", + "description": "app.api.deps", + "isExtraImport": true, + "detail": "app.api.deps", + "documentation": {} + }, + { + "label": "get_current_user", + "importPath": "app.api.deps", + "description": "app.api.deps", + "isExtraImport": true, + "detail": "app.api.deps", + "documentation": {} + }, + { + "label": "get_current_user", + "importPath": "app.api.deps", + "description": "app.api.deps", + "isExtraImport": true, + "detail": "app.api.deps", + "documentation": {} + }, + { + "label": "get_current_user", + "importPath": "app.api.deps", + "description": "app.api.deps", + "isExtraImport": true, + "detail": "app.api.deps", + "documentation": {} + }, + { + "label": "get_current_user", + "importPath": "app.api.deps", + "description": "app.api.deps", + "isExtraImport": true, + "detail": "app.api.deps", + "documentation": {} + }, + { + "label": "get_current_user", + "importPath": "app.api.deps", + "description": "app.api.deps", + "isExtraImport": true, + "detail": "app.api.deps", + "documentation": {} + }, + { + "label": "get_current_user", + "importPath": "app.api.deps", + "description": "app.api.deps", + "isExtraImport": true, + "detail": "app.api.deps", + "documentation": {} + }, + { + "label": "get_current_user", + "importPath": "app.api.deps", + "description": "app.api.deps", + "isExtraImport": true, + "detail": "app.api.deps", + "documentation": {} + }, + { + "label": "get_current_user", + "importPath": "app.api.deps", + "description": "app.api.deps", + "isExtraImport": true, + "detail": "app.api.deps", + "documentation": {} + }, + { + "label": "AnalysisRead", + "importPath": "app.api.schemas.analysis", + "description": "app.api.schemas.analysis", + "isExtraImport": true, + "detail": "app.api.schemas.analysis", + "documentation": {} + }, + { + "label": "AnalysisCreate", + "importPath": "app.api.schemas.analysis", + "description": "app.api.schemas.analysis", + "isExtraImport": true, + "detail": "app.api.schemas.analysis", + "documentation": {} + }, + { + "label": "AnalysisUpdate", + "importPath": "app.api.schemas.analysis", + "description": "app.api.schemas.analysis", + "isExtraImport": true, + "detail": "app.api.schemas.analysis", + "documentation": {} + }, + { + "label": "AnalysisListResponse", + "importPath": "app.api.schemas.analysis", + "description": "app.api.schemas.analysis", + "isExtraImport": true, + "detail": "app.api.schemas.analysis", + "documentation": {} + }, + { + "label": "PaginationMetadata", + "importPath": "app.api.schemas.analysis", + "description": "app.api.schemas.analysis", + "isExtraImport": true, + "detail": "app.api.schemas.analysis", + "documentation": {} + }, + { + "label": "OAuth2PasswordRequestForm", + "importPath": "fastapi.security", + "description": "fastapi.security", + "isExtraImport": true, + "detail": "fastapi.security", + "documentation": {} + }, + { + "label": "OAuth2PasswordBearer", + "importPath": "fastapi.security", + "description": "fastapi.security", + "isExtraImport": true, + "detail": "fastapi.security", + "documentation": {} + }, + { + "label": "SQLAlchemyError", + "importPath": "sqlalchemy.exc", + "description": "sqlalchemy.exc", + "isExtraImport": true, + "detail": "sqlalchemy.exc", + "documentation": {} + }, + { + "label": "IntegrityError", + "importPath": "sqlalchemy.exc", + "description": "sqlalchemy.exc", + "isExtraImport": true, + "detail": "sqlalchemy.exc", + "documentation": {} + }, + { + "label": "OperationalError", + "importPath": "sqlalchemy.exc", + "description": "sqlalchemy.exc", + "isExtraImport": true, + "detail": "sqlalchemy.exc", + "documentation": {} + }, + { + "label": "OperationalError", + "importPath": "sqlalchemy.exc", + "description": "sqlalchemy.exc", + "isExtraImport": true, + "detail": "sqlalchemy.exc", + "documentation": {} + }, + { + "label": "verify_password", + "importPath": "spectragraph_core.core.auth", + "description": "spectragraph_core.core.auth", + "isExtraImport": true, + "detail": "spectragraph_core.core.auth", + "documentation": {} + }, + { + "label": "create_access_token", + "importPath": "spectragraph_core.core.auth", + "description": "spectragraph_core.core.auth", + "isExtraImport": true, + "detail": "spectragraph_core.core.auth", + "documentation": {} + }, + { + "label": "get_password_hash", + "importPath": "spectragraph_core.core.auth", + "description": "spectragraph_core.core.auth", + "isExtraImport": true, + "detail": "spectragraph_core.core.auth", + "documentation": {} + }, + { + "label": "ALGORITHM", + "importPath": "spectragraph_core.core.auth", + "description": "spectragraph_core.core.auth", + "isExtraImport": true, + "detail": "spectragraph_core.core.auth", + "documentation": {} + }, + { + "label": "create_access_token", + "importPath": "spectragraph_core.core.auth", + "description": "spectragraph_core.core.auth", + "isExtraImport": true, + "detail": "spectragraph_core.core.auth", + "documentation": {} + }, + { + "label": "verify_password", + "importPath": "spectragraph_core.core.auth", + "description": "spectragraph_core.core.auth", + "isExtraImport": true, + "detail": "spectragraph_core.core.auth", + "documentation": {} + }, + { + "label": "get_password_hash", + "importPath": "spectragraph_core.core.auth", + "description": "spectragraph_core.core.auth", + "isExtraImport": true, + "detail": "spectragraph_core.core.auth", + "documentation": {} + }, + { + "label": "ACCESS_TOKEN_EXPIRE_MINUTES", + "importPath": "spectragraph_core.core.auth", + "description": "spectragraph_core.core.auth", + "isExtraImport": true, + "detail": "spectragraph_core.core.auth", + "documentation": {} + }, + { + "label": "AUTH_SECRET", + "importPath": "spectragraph_core.core.auth", + "description": "spectragraph_core.core.auth", + "isExtraImport": true, + "detail": "spectragraph_core.core.auth", + "documentation": {} + }, + { + "label": "ALGORITHM", + "importPath": "spectragraph_core.core.auth", + "description": "spectragraph_core.core.auth", + "isExtraImport": true, + "detail": "spectragraph_core.core.auth", + "documentation": {} + }, + { + "label": "ProfileCreate", + "importPath": "app.api.schemas.profile", + "description": "app.api.schemas.profile", + "isExtraImport": true, + "detail": "app.api.schemas.profile", + "documentation": {} + }, + { + "label": "StreamingResponse", + "importPath": "fastapi.responses", + "description": "fastapi.responses", + "isExtraImport": true, + "detail": "fastapi.responses", + "documentation": {} + }, + { + "label": "JSONResponse", + "importPath": "fastapi.responses", + "description": "fastapi.responses", + "isExtraImport": true, + "detail": "fastapi.responses", + "documentation": {} + }, + { + "label": "BaseModel", + "importPath": "pydantic", + "description": "pydantic", + "isExtraImport": true, + "detail": "pydantic", + "documentation": {} + }, + { + "label": "BaseModel", + "importPath": "pydantic", + "description": "pydantic", + "isExtraImport": true, + "detail": "pydantic", + "documentation": {} + }, + { + "label": "BaseModel", + "importPath": "pydantic", + "description": "pydantic", + "isExtraImport": true, + "detail": "pydantic", + "documentation": {} + }, + { + "label": "Field", + "importPath": "pydantic", + "description": "pydantic", + "isExtraImport": true, + "detail": "pydantic", + "documentation": {} + }, + { + "label": "BaseModel", + "importPath": "pydantic", + "description": "pydantic", + "isExtraImport": true, + "detail": "pydantic", + "documentation": {} + }, + { + "label": "BaseModel", + "importPath": "pydantic", + "description": "pydantic", + "isExtraImport": true, + "detail": "pydantic", + "documentation": {} + }, + { + "label": "TypeAdapter", + "importPath": "pydantic", + "description": "pydantic", + "isExtraImport": true, + "detail": "pydantic", + "documentation": {} + }, + { + "label": "UUID4", + "importPath": "pydantic", + "description": "pydantic", + "isExtraImport": true, + "detail": "pydantic", + "documentation": {} + }, + { + "label": "BaseModel", + "importPath": "pydantic", + "description": "pydantic", + "isExtraImport": true, + "detail": "pydantic", + "documentation": {} + }, + { + "label": "BaseModel", + "importPath": "pydantic", + "description": "pydantic", + "isExtraImport": true, + "detail": "pydantic", + "documentation": {} + }, + { + "label": "UUID4", + "importPath": "pydantic", + "description": "pydantic", + "isExtraImport": true, + "detail": "pydantic", + "documentation": {} + }, + { + "label": "BaseModel", + "importPath": "pydantic", + "description": "pydantic", + "isExtraImport": true, + "detail": "pydantic", + "documentation": {} + }, + { + "label": "BaseModel", + "importPath": "pydantic", + "description": "pydantic", + "isExtraImport": true, + "detail": "pydantic", + "documentation": {} + }, + { + "label": "UUID4", + "importPath": "pydantic", + "description": "pydantic", + "isExtraImport": true, + "detail": "pydantic", + "documentation": {} + }, + { + "label": "Field", + "importPath": "pydantic", + "description": "pydantic", + "isExtraImport": true, + "detail": "pydantic", + "documentation": {} + }, + { + "label": "field_validator", + "importPath": "pydantic", + "description": "pydantic", + "isExtraImport": true, + "detail": "pydantic", + "documentation": {} + }, + { + "label": "UUID4", + "importPath": "pydantic", + "description": "pydantic", + "isExtraImport": true, + "detail": "pydantic", + "documentation": {} + }, + { + "label": "BaseModel", + "importPath": "pydantic", + "description": "pydantic", + "isExtraImport": true, + "detail": "pydantic", + "documentation": {} + }, + { + "label": "UUID4", + "importPath": "pydantic", + "description": "pydantic", + "isExtraImport": true, + "detail": "pydantic", + "documentation": {} + }, + { + "label": "BaseModel", + "importPath": "pydantic", + "description": "pydantic", + "isExtraImport": true, + "detail": "pydantic", + "documentation": {} + }, + { + "label": "UUID4", + "importPath": "pydantic", + "description": "pydantic", + "isExtraImport": true, + "detail": "pydantic", + "documentation": {} + }, + { + "label": "BaseModel", + "importPath": "pydantic", + "description": "pydantic", + "isExtraImport": true, + "detail": "pydantic", + "documentation": {} + }, + { + "label": "UUID4", + "importPath": "pydantic", + "description": "pydantic", + "isExtraImport": true, + "detail": "pydantic", + "documentation": {} + }, + { + "label": "BaseModel", + "importPath": "pydantic", + "description": "pydantic", + "isExtraImport": true, + "detail": "pydantic", + "documentation": {} + }, + { + "label": "UUID4", + "importPath": "pydantic", + "description": "pydantic", + "isExtraImport": true, + "detail": "pydantic", + "documentation": {} + }, + { + "label": "BaseModel", + "importPath": "pydantic", + "description": "pydantic", + "isExtraImport": true, + "detail": "pydantic", + "documentation": {} + }, + { + "label": "UUID4", + "importPath": "pydantic", + "description": "pydantic", + "isExtraImport": true, + "detail": "pydantic", + "documentation": {} + }, + { + "label": "BaseModel", + "importPath": "pydantic", + "description": "pydantic", + "isExtraImport": true, + "detail": "pydantic", + "documentation": {} + }, + { + "label": "EmailStr", + "importPath": "pydantic", + "description": "pydantic", + "isExtraImport": true, + "detail": "pydantic", + "documentation": {} + }, + { + "label": "UUID4", + "importPath": "pydantic", + "description": "pydantic", + "isExtraImport": true, + "detail": "pydantic", + "documentation": {} + }, + { + "label": "BaseModel", + "importPath": "pydantic", + "description": "pydantic", + "isExtraImport": true, + "detail": "pydantic", + "documentation": {} + }, + { + "label": "UUID4", + "importPath": "pydantic", + "description": "pydantic", + "isExtraImport": true, + "detail": "pydantic", + "documentation": {} + }, + { + "label": "BaseModel", + "importPath": "pydantic", + "description": "pydantic", + "isExtraImport": true, + "detail": "pydantic", + "documentation": {} + }, + { + "label": "UUID4", + "importPath": "pydantic", + "description": "pydantic", + "isExtraImport": true, + "detail": "pydantic", + "documentation": {} + }, + { + "label": "BaseModel", + "importPath": "pydantic", + "description": "pydantic", + "isExtraImport": true, + "detail": "pydantic", + "documentation": {} + }, + { + "label": "BaseModel", + "importPath": "pydantic", + "description": "pydantic", + "isExtraImport": true, + "detail": "pydantic", + "documentation": {} + }, + { + "label": "create_model", + "importPath": "pydantic", + "description": "pydantic", + "isExtraImport": true, + "detail": "pydantic", + "documentation": {} + }, + { + "label": "EmailStr", + "importPath": "pydantic", + "description": "pydantic", + "isExtraImport": true, + "detail": "pydantic", + "documentation": {} + }, + { + "label": "Field", + "importPath": "pydantic", + "description": "pydantic", + "isExtraImport": true, + "detail": "pydantic", + "documentation": {} + }, + { + "label": "field_validator", + "importPath": "pydantic", + "description": "pydantic", + "isExtraImport": true, + "detail": "pydantic", + "documentation": {} + }, + { + "label": "TypeAdapter", + "importPath": "pydantic", + "description": "pydantic", + "isExtraImport": true, + "detail": "pydantic", + "documentation": {} + }, + { + "label": "BaseModel", + "importPath": "pydantic", + "description": "pydantic", + "isExtraImport": true, + "detail": "pydantic", + "documentation": {} + }, + { + "label": "BaseModel", + "importPath": "pydantic", + "description": "pydantic", + "isExtraImport": true, + "detail": "pydantic", + "documentation": {} + }, + { + "label": "BaseModel", + "importPath": "pydantic", + "description": "pydantic", + "isExtraImport": true, + "detail": "pydantic", + "documentation": {} + }, + { + "label": "TypeAdapter", + "importPath": "pydantic", + "description": "pydantic", + "isExtraImport": true, + "detail": "pydantic", + "documentation": {} + }, + { + "label": "ValidationError", + "importPath": "pydantic", + "description": "pydantic", + "isExtraImport": true, + "detail": "pydantic", + "documentation": {} + }, + { + "label": "ValidationError", + "importPath": "pydantic", + "description": "pydantic", + "isExtraImport": true, + "detail": "pydantic", + "documentation": {} + }, + { + "label": "BaseModel", + "importPath": "pydantic", + "description": "pydantic", + "isExtraImport": true, + "detail": "pydantic", + "documentation": {} + }, + { + "label": "Field", + "importPath": "pydantic", + "description": "pydantic", + "isExtraImport": true, + "detail": "pydantic", + "documentation": {} + }, + { + "label": "create_model", + "importPath": "pydantic", + "description": "pydantic", + "isExtraImport": true, + "detail": "pydantic", + "documentation": {} + }, + { + "label": "TypeAdapter", + "importPath": "pydantic", + "description": "pydantic", + "isExtraImport": true, + "detail": "pydantic", + "documentation": {} + }, + { + "label": "BaseModel", + "importPath": "pydantic", + "description": "pydantic", + "isExtraImport": true, + "detail": "pydantic", + "documentation": {} + }, + { + "label": "Field", + "importPath": "pydantic", + "description": "pydantic", + "isExtraImport": true, + "detail": "pydantic", + "documentation": {} + }, + { + "label": "TypeAdapter", + "importPath": "pydantic", + "description": "pydantic", + "isExtraImport": true, + "detail": "pydantic", + "documentation": {} + }, + { + "label": "BaseModel", + "importPath": "pydantic", + "description": "pydantic", + "isExtraImport": true, + "detail": "pydantic", + "documentation": {} + }, + { + "label": "BaseModel", + "importPath": "pydantic", + "description": "pydantic", + "isExtraImport": true, + "detail": "pydantic", + "documentation": {} + }, + { + "label": "BaseModel", + "importPath": "pydantic", + "description": "pydantic", + "isExtraImport": true, + "detail": "pydantic", + "documentation": {} + }, + { + "label": "TypeAdapter", + "importPath": "pydantic", + "description": "pydantic", + "isExtraImport": true, + "detail": "pydantic", + "documentation": {} + }, + { + "label": "TypeAdapter", + "importPath": "pydantic", + "description": "pydantic", + "isExtraImport": true, + "detail": "pydantic", + "documentation": {} + }, + { + "label": "BaseModel", + "importPath": "pydantic", + "description": "pydantic", + "isExtraImport": true, + "detail": "pydantic", + "documentation": {} + }, + { + "label": "Field", + "importPath": "pydantic", + "description": "pydantic", + "isExtraImport": true, + "detail": "pydantic", + "documentation": {} + }, + { + "label": "BaseModel", + "importPath": "pydantic", + "description": "pydantic", + "isExtraImport": true, + "detail": "pydantic", + "documentation": {} + }, + { + "label": "TypeAdapter", + "importPath": "pydantic", + "description": "pydantic", + "isExtraImport": true, + "detail": "pydantic", + "documentation": {} + }, + { + "label": "BaseModel", + "importPath": "pydantic", + "description": "pydantic", + "isExtraImport": true, + "detail": "pydantic", + "documentation": {} + }, + { + "label": "BaseModel", + "importPath": "pydantic", + "description": "pydantic", + "isExtraImport": true, + "detail": "pydantic", + "documentation": {} + }, + { + "label": "BaseModel", + "importPath": "pydantic", + "description": "pydantic", + "isExtraImport": true, + "detail": "pydantic", + "documentation": {} + }, + { + "label": "TypeAdapter", + "importPath": "pydantic", + "description": "pydantic", + "isExtraImport": true, + "detail": "pydantic", + "documentation": {} + }, + { + "label": "HttpUrl", + "importPath": "pydantic", + "description": "pydantic", + "isExtraImport": true, + "detail": "pydantic", + "documentation": {} + }, + { + "label": "BaseModel", + "importPath": "pydantic", + "description": "pydantic", + "isExtraImport": true, + "detail": "pydantic", + "documentation": {} + }, + { + "label": "Field", + "importPath": "pydantic", + "description": "pydantic", + "isExtraImport": true, + "detail": "pydantic", + "documentation": {} + }, + { + "label": "BaseModel", + "importPath": "pydantic", + "description": "pydantic", + "isExtraImport": true, + "detail": "pydantic", + "documentation": {} + }, + { + "label": "Field", + "importPath": "pydantic", + "description": "pydantic", + "isExtraImport": true, + "detail": "pydantic", + "documentation": {} + }, + { + "label": "BaseModel", + "importPath": "pydantic", + "description": "pydantic", + "isExtraImport": true, + "detail": "pydantic", + "documentation": {} + }, + { + "label": "Field", + "importPath": "pydantic", + "description": "pydantic", + "isExtraImport": true, + "detail": "pydantic", + "documentation": {} + }, + { + "label": "BaseModel", + "importPath": "pydantic", + "description": "pydantic", + "isExtraImport": true, + "detail": "pydantic", + "documentation": {} + }, + { + "label": "Field", + "importPath": "pydantic", + "description": "pydantic", + "isExtraImport": true, + "detail": "pydantic", + "documentation": {} + }, + { + "label": "BaseModel", + "importPath": "pydantic", + "description": "pydantic", + "isExtraImport": true, + "detail": "pydantic", + "documentation": {} + }, + { + "label": "Field", + "importPath": "pydantic", + "description": "pydantic", + "isExtraImport": true, + "detail": "pydantic", + "documentation": {} + }, + { + "label": "BaseModel", + "importPath": "pydantic", + "description": "pydantic", + "isExtraImport": true, + "detail": "pydantic", + "documentation": {} + }, + { + "label": "BaseModel", + "importPath": "pydantic", + "description": "pydantic", + "isExtraImport": true, + "detail": "pydantic", + "documentation": {} + }, + { + "label": "Field", + "importPath": "pydantic", + "description": "pydantic", + "isExtraImport": true, + "detail": "pydantic", + "documentation": {} + }, + { + "label": "BaseModel", + "importPath": "pydantic", + "description": "pydantic", + "isExtraImport": true, + "detail": "pydantic", + "documentation": {} + }, + { + "label": "IPvAnyNetwork", + "importPath": "pydantic", + "description": "pydantic", + "isExtraImport": true, + "detail": "pydantic", + "documentation": {} + }, + { + "label": "Field", + "importPath": "pydantic", + "description": "pydantic", + "isExtraImport": true, + "detail": "pydantic", + "documentation": {} + }, + { + "label": "BaseModel", + "importPath": "pydantic", + "description": "pydantic", + "isExtraImport": true, + "detail": "pydantic", + "documentation": {} + }, + { + "label": "Field", + "importPath": "pydantic", + "description": "pydantic", + "isExtraImport": true, + "detail": "pydantic", + "documentation": {} + }, + { + "label": "BaseModel", + "importPath": "pydantic", + "description": "pydantic", + "isExtraImport": true, + "detail": "pydantic", + "documentation": {} + }, + { + "label": "Field", + "importPath": "pydantic", + "description": "pydantic", + "isExtraImport": true, + "detail": "pydantic", + "documentation": {} + }, + { + "label": "BaseModel", + "importPath": "pydantic", + "description": "pydantic", + "isExtraImport": true, + "detail": "pydantic", + "documentation": {} + }, + { + "label": "Field", + "importPath": "pydantic", + "description": "pydantic", + "isExtraImport": true, + "detail": "pydantic", + "documentation": {} + }, + { + "label": "BaseModel", + "importPath": "pydantic", + "description": "pydantic", + "isExtraImport": true, + "detail": "pydantic", + "documentation": {} + }, + { + "label": "Field", + "importPath": "pydantic", + "description": "pydantic", + "isExtraImport": true, + "detail": "pydantic", + "documentation": {} + }, + { + "label": "BaseModel", + "importPath": "pydantic", + "description": "pydantic", + "isExtraImport": true, + "detail": "pydantic", + "documentation": {} + }, + { + "label": "Field", + "importPath": "pydantic", + "description": "pydantic", + "isExtraImport": true, + "detail": "pydantic", + "documentation": {} + }, + { + "label": "Field", + "importPath": "pydantic", + "description": "pydantic", + "isExtraImport": true, + "detail": "pydantic", + "documentation": {} + }, + { + "label": "BaseModel", + "importPath": "pydantic", + "description": "pydantic", + "isExtraImport": true, + "detail": "pydantic", + "documentation": {} + }, + { + "label": "Field", + "importPath": "pydantic", + "description": "pydantic", + "isExtraImport": true, + "detail": "pydantic", + "documentation": {} + }, + { + "label": "BaseModel", + "importPath": "pydantic", + "description": "pydantic", + "isExtraImport": true, + "detail": "pydantic", + "documentation": {} + }, + { + "label": "Field", + "importPath": "pydantic", + "description": "pydantic", + "isExtraImport": true, + "detail": "pydantic", + "documentation": {} + }, + { + "label": "BaseModel", + "importPath": "pydantic", + "description": "pydantic", + "isExtraImport": true, + "detail": "pydantic", + "documentation": {} + }, + { + "label": "Field", + "importPath": "pydantic", + "description": "pydantic", + "isExtraImport": true, + "detail": "pydantic", + "documentation": {} + }, + { + "label": "HttpUrl", + "importPath": "pydantic", + "description": "pydantic", + "isExtraImport": true, + "detail": "pydantic", + "documentation": {} + }, + { + "label": "BaseModel", + "importPath": "pydantic", + "description": "pydantic", + "isExtraImport": true, + "detail": "pydantic", + "documentation": {} + }, + { + "label": "Field", + "importPath": "pydantic", + "description": "pydantic", + "isExtraImport": true, + "detail": "pydantic", + "documentation": {} + }, + { + "label": "BaseModel", + "importPath": "pydantic", + "description": "pydantic", + "isExtraImport": true, + "detail": "pydantic", + "documentation": {} + }, + { + "label": "Field", + "importPath": "pydantic", + "description": "pydantic", + "isExtraImport": true, + "detail": "pydantic", + "documentation": {} + }, + { + "label": "BaseModel", + "importPath": "pydantic", + "description": "pydantic", + "isExtraImport": true, + "detail": "pydantic", + "documentation": {} + }, + { + "label": "Field", + "importPath": "pydantic", + "description": "pydantic", + "isExtraImport": true, + "detail": "pydantic", + "documentation": {} + }, + { + "label": "BaseModel", + "importPath": "pydantic", + "description": "pydantic", + "isExtraImport": true, + "detail": "pydantic", + "documentation": {} + }, + { + "label": "Field", + "importPath": "pydantic", + "description": "pydantic", + "isExtraImport": true, + "detail": "pydantic", + "documentation": {} + }, + { + "label": "BaseModel", + "importPath": "pydantic", + "description": "pydantic", + "isExtraImport": true, + "detail": "pydantic", + "documentation": {} + }, + { + "label": "Field", + "importPath": "pydantic", + "description": "pydantic", + "isExtraImport": true, + "detail": "pydantic", + "documentation": {} + }, + { + "label": "BaseModel", + "importPath": "pydantic", + "description": "pydantic", + "isExtraImport": true, + "detail": "pydantic", + "documentation": {} + }, + { + "label": "Field", + "importPath": "pydantic", + "description": "pydantic", + "isExtraImport": true, + "detail": "pydantic", + "documentation": {} + }, + { + "label": "BaseModel", + "importPath": "pydantic", + "description": "pydantic", + "isExtraImport": true, + "detail": "pydantic", + "documentation": {} + }, + { + "label": "Field", + "importPath": "pydantic", + "description": "pydantic", + "isExtraImport": true, + "detail": "pydantic", + "documentation": {} + }, + { + "label": "BaseModel", + "importPath": "pydantic", + "description": "pydantic", + "isExtraImport": true, + "detail": "pydantic", + "documentation": {} + }, + { + "label": "Field", + "importPath": "pydantic", + "description": "pydantic", + "isExtraImport": true, + "detail": "pydantic", + "documentation": {} + }, + { + "label": "BaseModel", + "importPath": "pydantic", + "description": "pydantic", + "isExtraImport": true, + "detail": "pydantic", + "documentation": {} + }, + { + "label": "Field", + "importPath": "pydantic", + "description": "pydantic", + "isExtraImport": true, + "detail": "pydantic", + "documentation": {} + }, + { + "label": "BaseModel", + "importPath": "pydantic", + "description": "pydantic", + "isExtraImport": true, + "detail": "pydantic", + "documentation": {} + }, + { + "label": "Field", + "importPath": "pydantic", + "description": "pydantic", + "isExtraImport": true, + "detail": "pydantic", + "documentation": {} + }, + { + "label": "BaseModel", + "importPath": "pydantic", + "description": "pydantic", + "isExtraImport": true, + "detail": "pydantic", + "documentation": {} + }, + { + "label": "Field", + "importPath": "pydantic", + "description": "pydantic", + "isExtraImport": true, + "detail": "pydantic", + "documentation": {} + }, + { + "label": "BaseModel", + "importPath": "pydantic", + "description": "pydantic", + "isExtraImport": true, + "detail": "pydantic", + "documentation": {} + }, + { + "label": "Field", + "importPath": "pydantic", + "description": "pydantic", + "isExtraImport": true, + "detail": "pydantic", + "documentation": {} + }, + { + "label": "BaseModel", + "importPath": "pydantic", + "description": "pydantic", + "isExtraImport": true, + "detail": "pydantic", + "documentation": {} + }, + { + "label": "Field", + "importPath": "pydantic", + "description": "pydantic", + "isExtraImport": true, + "detail": "pydantic", + "documentation": {} + }, + { + "label": "BaseModel", + "importPath": "pydantic", + "description": "pydantic", + "isExtraImport": true, + "detail": "pydantic", + "documentation": {} + }, + { + "label": "Field", + "importPath": "pydantic", + "description": "pydantic", + "isExtraImport": true, + "detail": "pydantic", + "documentation": {} + }, + { + "label": "BaseModel", + "importPath": "pydantic", + "description": "pydantic", + "isExtraImport": true, + "detail": "pydantic", + "documentation": {} + }, + { + "label": "Field", + "importPath": "pydantic", + "description": "pydantic", + "isExtraImport": true, + "detail": "pydantic", + "documentation": {} + }, + { + "label": "BaseModel", + "importPath": "pydantic", + "description": "pydantic", + "isExtraImport": true, + "detail": "pydantic", + "documentation": {} + }, + { + "label": "Field", + "importPath": "pydantic", + "description": "pydantic", + "isExtraImport": true, + "detail": "pydantic", + "documentation": {} + }, + { + "label": "HttpUrl", + "importPath": "pydantic", + "description": "pydantic", + "isExtraImport": true, + "detail": "pydantic", + "documentation": {} + }, + { + "label": "BaseModel", + "importPath": "pydantic", + "description": "pydantic", + "isExtraImport": true, + "detail": "pydantic", + "documentation": {} + }, + { + "label": "Field", + "importPath": "pydantic", + "description": "pydantic", + "isExtraImport": true, + "detail": "pydantic", + "documentation": {} + }, + { + "label": "BaseModel", + "importPath": "pydantic", + "description": "pydantic", + "isExtraImport": true, + "detail": "pydantic", + "documentation": {} + }, + { + "label": "Field", + "importPath": "pydantic", + "description": "pydantic", + "isExtraImport": true, + "detail": "pydantic", + "documentation": {} + }, + { + "label": "BaseModel", + "importPath": "pydantic", + "description": "pydantic", + "isExtraImport": true, + "detail": "pydantic", + "documentation": {} + }, + { + "label": "Field", + "importPath": "pydantic", + "description": "pydantic", + "isExtraImport": true, + "detail": "pydantic", + "documentation": {} + }, + { + "label": "HttpUrl", + "importPath": "pydantic", + "description": "pydantic", + "isExtraImport": true, + "detail": "pydantic", + "documentation": {} + }, + { + "label": "BaseModel", + "importPath": "pydantic", + "description": "pydantic", + "isExtraImport": true, + "detail": "pydantic", + "documentation": {} + }, + { + "label": "Field", + "importPath": "pydantic", + "description": "pydantic", + "isExtraImport": true, + "detail": "pydantic", + "documentation": {} + }, + { + "label": "Mistral", + "importPath": "mistralai", + "description": "mistralai", + "isExtraImport": true, + "detail": "mistralai", + "documentation": {} + }, + { + "label": "UserMessage", + "importPath": "mistralai.models", + "description": "mistralai.models", + "isExtraImport": true, + "detail": "mistralai.models", + "documentation": {} + }, + { + "label": "AssistantMessage", + "importPath": "mistralai.models", + "description": "mistralai.models", + "isExtraImport": true, + "detail": "mistralai.models", + "documentation": {} + }, + { + "label": "SystemMessage", + "importPath": "mistralai.models", + "description": "mistralai.models", + "isExtraImport": true, + "detail": "mistralai.models", + "documentation": {} + }, + { + "label": "json", + "kind": 6, + "isExtraImport": true, + "importPath": "json", + "description": "json", + "detail": "json", + "documentation": {} + }, + { + "label": "ChatCreate", + "importPath": "app.api.schemas.chat", + "description": "app.api.schemas.chat", + "isExtraImport": true, + "detail": "app.api.schemas.chat", + "documentation": {} + }, + { + "label": "ChatRead", + "importPath": "app.api.schemas.chat", + "description": "app.api.schemas.chat", + "isExtraImport": true, + "detail": "app.api.schemas.chat", + "documentation": {} + }, + { + "label": "CustomTypeCreate", + "importPath": "app.api.schemas.custom_type", + "description": "app.api.schemas.custom_type", + "isExtraImport": true, + "detail": "app.api.schemas.custom_type", + "documentation": {} + }, + { + "label": "CustomTypeUpdate", + "importPath": "app.api.schemas.custom_type", + "description": "app.api.schemas.custom_type", + "isExtraImport": true, + "detail": "app.api.schemas.custom_type", + "documentation": {} + }, + { + "label": "CustomTypeRead", + "importPath": "app.api.schemas.custom_type", + "description": "app.api.schemas.custom_type", + "isExtraImport": true, + "detail": "app.api.schemas.custom_type", + "documentation": {} + }, + { + "label": "CustomTypeValidatePayload", + "importPath": "app.api.schemas.custom_type", + "description": "app.api.schemas.custom_type", + "isExtraImport": true, + "detail": "app.api.schemas.custom_type", + "documentation": {} + }, + { + "label": "CustomTypeValidateResponse", + "importPath": "app.api.schemas.custom_type", + "description": "app.api.schemas.custom_type", + "isExtraImport": true, + "detail": "app.api.schemas.custom_type", + "documentation": {} + }, + { + "label": "validate_json_schema", + "importPath": "app.utils.custom_types", + "description": "app.utils.custom_types", + "isExtraImport": true, + "detail": "app.utils.custom_types", + "documentation": {} + }, + { + "label": "validate_payload_against_schema", + "importPath": "app.utils.custom_types", + "description": "app.utils.custom_types", + "isExtraImport": true, + "detail": "app.utils.custom_types", + "documentation": {} + }, + { + "label": "calculate_schema_checksum", + "importPath": "app.utils.custom_types", + "description": "app.utils.custom_types", + "isExtraImport": true, + "detail": "app.utils.custom_types", + "documentation": {} + }, + { + "label": "event_emitter", + "importPath": "spectragraph_core.core.events", + "description": "spectragraph_core.core.events", + "isExtraImport": true, + "detail": "spectragraph_core.core.events", + "documentation": {} + }, + { + "label": "EventSourceResponse", + "importPath": "sse_starlette.sse", + "description": "sse_starlette.sse", + "isExtraImport": true, + "detail": "sse_starlette.sse", + "documentation": {} + }, + { + "label": "Event", + "importPath": "spectragraph_core.core.types", + "description": "spectragraph_core.core.types", + "isExtraImport": true, + "detail": "spectragraph_core.core.types", + "documentation": {} + }, + { + "label": "Node", + "importPath": "spectragraph_core.core.types", + "description": "spectragraph_core.core.types", + "isExtraImport": true, + "detail": "spectragraph_core.core.types", + "documentation": {} + }, + { + "label": "Edge", + "importPath": "spectragraph_core.core.types", + "description": "spectragraph_core.core.types", + "isExtraImport": true, + "detail": "spectragraph_core.core.types", + "documentation": {} + }, + { + "label": "FlowStep", + "importPath": "spectragraph_core.core.types", + "description": "spectragraph_core.core.types", + "isExtraImport": true, + "detail": "spectragraph_core.core.types", + "documentation": {} + }, + { + "label": "FlowBranch", + "importPath": "spectragraph_core.core.types", + "description": "spectragraph_core.core.types", + "isExtraImport": true, + "detail": "spectragraph_core.core.types", + "documentation": {} + }, + { + "label": "Role", + "importPath": "spectragraph_core.core.types", + "description": "spectragraph_core.core.types", + "isExtraImport": true, + "detail": "spectragraph_core.core.types", + "documentation": {} + }, + { + "label": "Node", + "importPath": "spectragraph_core.core.types", + "description": "spectragraph_core.core.types", + "isExtraImport": true, + "detail": "spectragraph_core.core.types", + "documentation": {} + }, + { + "label": "Edge", + "importPath": "spectragraph_core.core.types", + "description": "spectragraph_core.core.types", + "isExtraImport": true, + "detail": "spectragraph_core.core.types", + "documentation": {} + }, + { + "label": "FlowBranch", + "importPath": "spectragraph_core.core.types", + "description": "spectragraph_core.core.types", + "isExtraImport": true, + "detail": "spectragraph_core.core.types", + "documentation": {} + }, + { + "label": "Role", + "importPath": "spectragraph_core.core.types", + "description": "spectragraph_core.core.types", + "isExtraImport": true, + "detail": "spectragraph_core.core.types", + "documentation": {} + }, + { + "label": "Role", + "importPath": "spectragraph_core.core.types", + "description": "spectragraph_core.core.types", + "isExtraImport": true, + "detail": "spectragraph_core.core.types", + "documentation": {} + }, + { + "label": "asyncio", + "kind": 6, + "isExtraImport": true, + "importPath": "asyncio", + "description": "asyncio", + "detail": "asyncio", + "documentation": {} + }, + { + "label": "extract_input_schema_flow", + "importPath": "spectragraph_core.utils", + "description": "spectragraph_core.utils", + "isExtraImport": true, + "detail": "spectragraph_core.utils", + "documentation": {} + }, + { + "label": "flatten", + "importPath": "spectragraph_core.utils", + "description": "spectragraph_core.utils", + "isExtraImport": true, + "detail": "spectragraph_core.utils", + "documentation": {} + }, + { + "label": "to_json_serializable", + "importPath": "spectragraph_core.utils", + "description": "spectragraph_core.utils", + "isExtraImport": true, + "detail": "spectragraph_core.utils", + "documentation": {} + }, + { + "label": "to_json_serializable", + "importPath": "spectragraph_core.utils", + "description": "spectragraph_core.utils", + "isExtraImport": true, + "detail": "spectragraph_core.utils", + "documentation": {} + }, + { + "label": "is_valid_asn", + "importPath": "spectragraph_core.utils", + "description": "spectragraph_core.utils", + "isExtraImport": true, + "detail": "spectragraph_core.utils", + "documentation": {} + }, + { + "label": "parse_asn", + "importPath": "spectragraph_core.utils", + "description": "spectragraph_core.utils", + "isExtraImport": true, + "detail": "spectragraph_core.utils", + "documentation": {} + }, + { + "label": "is_valid_domain", + "importPath": "spectragraph_core.utils", + "description": "spectragraph_core.utils", + "isExtraImport": true, + "detail": "spectragraph_core.utils", + "documentation": {} + }, + { + "label": "is_valid_domain", + "importPath": "spectragraph_core.utils", + "description": "spectragraph_core.utils", + "isExtraImport": true, + "detail": "spectragraph_core.utils", + "documentation": {} + }, + { + "label": "is_root_domain", + "importPath": "spectragraph_core.utils", + "description": "spectragraph_core.utils", + "isExtraImport": true, + "detail": "spectragraph_core.utils", + "documentation": {} + }, + { + "label": "is_valid_domain", + "importPath": "spectragraph_core.utils", + "description": "spectragraph_core.utils", + "isExtraImport": true, + "detail": "spectragraph_core.utils", + "documentation": {} + }, + { + "label": "is_root_domain", + "importPath": "spectragraph_core.utils", + "description": "spectragraph_core.utils", + "isExtraImport": true, + "detail": "spectragraph_core.utils", + "documentation": {} + }, + { + "label": "is_valid_domain", + "importPath": "spectragraph_core.utils", + "description": "spectragraph_core.utils", + "isExtraImport": true, + "detail": "spectragraph_core.utils", + "documentation": {} + }, + { + "label": "is_valid_domain", + "importPath": "spectragraph_core.utils", + "description": "spectragraph_core.utils", + "isExtraImport": true, + "detail": "spectragraph_core.utils", + "documentation": {} + }, + { + "label": "is_valid_domain", + "importPath": "spectragraph_core.utils", + "description": "spectragraph_core.utils", + "isExtraImport": true, + "detail": "spectragraph_core.utils", + "documentation": {} + }, + { + "label": "is_valid_ip", + "importPath": "spectragraph_core.utils", + "description": "spectragraph_core.utils", + "isExtraImport": true, + "detail": "spectragraph_core.utils", + "documentation": {} + }, + { + "label": "is_valid_ip", + "importPath": "spectragraph_core.utils", + "description": "spectragraph_core.utils", + "isExtraImport": true, + "detail": "spectragraph_core.utils", + "documentation": {} + }, + { + "label": "resolve_type", + "importPath": "spectragraph_core.utils", + "description": "spectragraph_core.utils", + "isExtraImport": true, + "detail": "spectragraph_core.utils", + "documentation": {} + }, + { + "label": "is_valid_ip", + "importPath": "spectragraph_core.utils", + "description": "spectragraph_core.utils", + "isExtraImport": true, + "detail": "spectragraph_core.utils", + "documentation": {} + }, + { + "label": "is_valid_domain", + "importPath": "spectragraph_core.utils", + "description": "spectragraph_core.utils", + "isExtraImport": true, + "detail": "spectragraph_core.utils", + "documentation": {} + }, + { + "label": "is_root_domain", + "importPath": "spectragraph_core.utils", + "description": "spectragraph_core.utils", + "isExtraImport": true, + "detail": "spectragraph_core.utils", + "documentation": {} + }, + { + "label": "is_valid_number", + "importPath": "spectragraph_core.utils", + "description": "spectragraph_core.utils", + "isExtraImport": true, + "detail": "spectragraph_core.utils", + "documentation": {} + }, + { + "label": "is_valid_username", + "importPath": "spectragraph_core.utils", + "description": "spectragraph_core.utils", + "isExtraImport": true, + "detail": "spectragraph_core.utils", + "documentation": {} + }, + { + "label": "is_valid_username", + "importPath": "spectragraph_core.utils", + "description": "spectragraph_core.utils", + "isExtraImport": true, + "detail": "spectragraph_core.utils", + "documentation": {} + }, + { + "label": "is_valid_domain", + "importPath": "spectragraph_core.utils", + "description": "spectragraph_core.utils", + "isExtraImport": true, + "detail": "spectragraph_core.utils", + "documentation": {} + }, + { + "label": "TransformRegistry", + "importPath": "spectragraph_core.core.registry", + "description": "spectragraph_core.core.registry", + "isExtraImport": true, + "detail": "spectragraph_core.core.registry", + "documentation": {} + }, + { + "label": "TransformRegistry", + "importPath": "spectragraph_core.core.registry", + "description": "spectragraph_core.core.registry", + "isExtraImport": true, + "detail": "spectragraph_core.core.registry", + "documentation": {} + }, + { + "label": "TransformRegistry", + "importPath": "spectragraph_core.core.registry", + "description": "spectragraph_core.core.registry", + "isExtraImport": true, + "detail": "spectragraph_core.core.registry", + "documentation": {} + }, + { + "label": "celery", + "importPath": "spectragraph_core.core.celery", + "description": "spectragraph_core.core.celery", + "isExtraImport": true, + "detail": "spectragraph_core.core.celery", + "documentation": {} + }, + { + "label": "celery", + "importPath": "spectragraph_core.core.celery", + "description": "spectragraph_core.core.celery", + "isExtraImport": true, + "detail": "spectragraph_core.core.celery", + "documentation": {} + }, + { + "label": "Domain", + "importPath": "spectragraph_types", + "description": "spectragraph_types", + "isExtraImport": true, + "detail": "spectragraph_types", + "documentation": {} + }, + { + "label": "Phrase", + "importPath": "spectragraph_types", + "description": "spectragraph_types", + "isExtraImport": true, + "detail": "spectragraph_types", + "documentation": {} + }, + { + "label": "Ip", + "importPath": "spectragraph_types", + "description": "spectragraph_types", + "isExtraImport": true, + "detail": "spectragraph_types", + "documentation": {} + }, + { + "label": "SocialProfile", + "importPath": "spectragraph_types", + "description": "spectragraph_types", + "isExtraImport": true, + "detail": "spectragraph_types", + "documentation": {} + }, + { + "label": "Organization", + "importPath": "spectragraph_types", + "description": "spectragraph_types", + "isExtraImport": true, + "detail": "spectragraph_types", + "documentation": {} + }, + { + "label": "Email", + "importPath": "spectragraph_types", + "description": "spectragraph_types", + "isExtraImport": true, + "detail": "spectragraph_types", + "documentation": {} + }, + { + "label": "Phone", + "importPath": "spectragraph_types", + "description": "spectragraph_types", + "isExtraImport": true, + "detail": "spectragraph_types", + "documentation": {} + }, + { + "label": "ASN", + "importPath": "spectragraph_types", + "description": "spectragraph_types", + "isExtraImport": true, + "detail": "spectragraph_types", + "documentation": {} + }, + { + "label": "CIDR", + "importPath": "spectragraph_types", + "description": "spectragraph_types", + "isExtraImport": true, + "detail": "spectragraph_types", + "documentation": {} + }, + { + "label": "CryptoWallet", + "importPath": "spectragraph_types", + "description": "spectragraph_types", + "isExtraImport": true, + "detail": "spectragraph_types", + "documentation": {} + }, + { + "label": "CryptoWalletTransaction", + "importPath": "spectragraph_types", + "description": "spectragraph_types", + "isExtraImport": true, + "detail": "spectragraph_types", + "documentation": {} + }, + { + "label": "CryptoNFT", + "importPath": "spectragraph_types", + "description": "spectragraph_types", + "isExtraImport": true, + "detail": "spectragraph_types", + "documentation": {} + }, + { + "label": "Website", + "importPath": "spectragraph_types", + "description": "spectragraph_types", + "isExtraImport": true, + "detail": "spectragraph_types", + "documentation": {} + }, + { + "label": "Individual", + "importPath": "spectragraph_types", + "description": "spectragraph_types", + "isExtraImport": true, + "detail": "spectragraph_types", + "documentation": {} + }, + { + "label": "Domain", + "importPath": "spectragraph_types", + "description": "spectragraph_types", + "isExtraImport": true, + "detail": "spectragraph_types", + "documentation": {} + }, + { + "label": "Ip", + "importPath": "spectragraph_types", + "description": "spectragraph_types", + "isExtraImport": true, + "detail": "spectragraph_types", + "documentation": {} + }, + { + "label": "SocialProfile", + "importPath": "spectragraph_types", + "description": "spectragraph_types", + "isExtraImport": true, + "detail": "spectragraph_types", + "documentation": {} + }, + { + "label": "Organization", + "importPath": "spectragraph_types", + "description": "spectragraph_types", + "isExtraImport": true, + "detail": "spectragraph_types", + "documentation": {} + }, + { + "label": "Email", + "importPath": "spectragraph_types", + "description": "spectragraph_types", + "isExtraImport": true, + "detail": "spectragraph_types", + "documentation": {} + }, + { + "label": "ASN", + "importPath": "spectragraph_types", + "description": "spectragraph_types", + "isExtraImport": true, + "detail": "spectragraph_types", + "documentation": {} + }, + { + "label": "CIDR", + "importPath": "spectragraph_types", + "description": "spectragraph_types", + "isExtraImport": true, + "detail": "spectragraph_types", + "documentation": {} + }, + { + "label": "CryptoWallet", + "importPath": "spectragraph_types", + "description": "spectragraph_types", + "isExtraImport": true, + "detail": "spectragraph_types", + "documentation": {} + }, + { + "label": "CryptoWalletTransaction", + "importPath": "spectragraph_types", + "description": "spectragraph_types", + "isExtraImport": true, + "detail": "spectragraph_types", + "documentation": {} + }, + { + "label": "CryptoNFT", + "importPath": "spectragraph_types", + "description": "spectragraph_types", + "isExtraImport": true, + "detail": "spectragraph_types", + "documentation": {} + }, + { + "label": "Website", + "importPath": "spectragraph_types", + "description": "spectragraph_types", + "isExtraImport": true, + "detail": "spectragraph_types", + "documentation": {} + }, + { + "label": "Individual", + "importPath": "spectragraph_types", + "description": "spectragraph_types", + "isExtraImport": true, + "detail": "spectragraph_types", + "documentation": {} + }, + { + "label": "Phone", + "importPath": "spectragraph_types", + "description": "spectragraph_types", + "isExtraImport": true, + "detail": "spectragraph_types", + "documentation": {} + }, + { + "label": "Leak", + "importPath": "spectragraph_types", + "description": "spectragraph_types", + "isExtraImport": true, + "detail": "spectragraph_types", + "documentation": {} + }, + { + "label": "Username", + "importPath": "spectragraph_types", + "description": "spectragraph_types", + "isExtraImport": true, + "detail": "spectragraph_types", + "documentation": {} + }, + { + "label": "Credential", + "importPath": "spectragraph_types", + "description": "spectragraph_types", + "isExtraImport": true, + "detail": "spectragraph_types", + "documentation": {} + }, + { + "label": "Session", + "importPath": "spectragraph_types", + "description": "spectragraph_types", + "isExtraImport": true, + "detail": "spectragraph_types", + "documentation": {} + }, + { + "label": "DNSRecord", + "importPath": "spectragraph_types", + "description": "spectragraph_types", + "isExtraImport": true, + "detail": "spectragraph_types", + "documentation": {} + }, + { + "label": "SSLCertificate", + "importPath": "spectragraph_types", + "description": "spectragraph_types", + "isExtraImport": true, + "detail": "spectragraph_types", + "documentation": {} + }, + { + "label": "Device", + "importPath": "spectragraph_types", + "description": "spectragraph_types", + "isExtraImport": true, + "detail": "spectragraph_types", + "documentation": {} + }, + { + "label": "Document", + "importPath": "spectragraph_types", + "description": "spectragraph_types", + "isExtraImport": true, + "detail": "spectragraph_types", + "documentation": {} + }, + { + "label": "File", + "importPath": "spectragraph_types", + "description": "spectragraph_types", + "isExtraImport": true, + "detail": "spectragraph_types", + "documentation": {} + }, + { + "label": "Message", + "importPath": "spectragraph_types", + "description": "spectragraph_types", + "isExtraImport": true, + "detail": "spectragraph_types", + "documentation": {} + }, + { + "label": "Malware", + "importPath": "spectragraph_types", + "description": "spectragraph_types", + "isExtraImport": true, + "detail": "spectragraph_types", + "documentation": {} + }, + { + "label": "Weapon", + "importPath": "spectragraph_types", + "description": "spectragraph_types", + "isExtraImport": true, + "detail": "spectragraph_types", + "documentation": {} + }, + { + "label": "BankAccount", + "importPath": "spectragraph_types", + "description": "spectragraph_types", + "isExtraImport": true, + "detail": "spectragraph_types", + "documentation": {} + }, + { + "label": "CreditCard", + "importPath": "spectragraph_types", + "description": "spectragraph_types", + "isExtraImport": true, + "detail": "spectragraph_types", + "documentation": {} + }, + { + "label": "WebTracker", + "importPath": "spectragraph_types", + "description": "spectragraph_types", + "isExtraImport": true, + "detail": "spectragraph_types", + "documentation": {} + }, + { + "label": "Phrase", + "importPath": "spectragraph_types", + "description": "spectragraph_types", + "isExtraImport": true, + "detail": "spectragraph_types", + "documentation": {} + }, + { + "label": "Location", + "importPath": "spectragraph_types", + "description": "spectragraph_types", + "isExtraImport": true, + "detail": "spectragraph_types", + "documentation": {} + }, + { + "label": "FlowRead", + "importPath": "app.api.schemas.flow", + "description": "app.api.schemas.flow", + "isExtraImport": true, + "detail": "app.api.schemas.flow", + "documentation": {} + }, + { + "label": "FlowCreate", + "importPath": "app.api.schemas.flow", + "description": "app.api.schemas.flow", + "isExtraImport": true, + "detail": "app.api.schemas.flow", + "documentation": {} + }, + { + "label": "FlowUpdate", + "importPath": "app.api.schemas.flow", + "description": "app.api.schemas.flow", + "isExtraImport": true, + "detail": "app.api.schemas.flow", + "documentation": {} + }, + { + "label": "InvestigationRead", + "importPath": "app.api.schemas.investigation", + "description": "app.api.schemas.investigation", + "isExtraImport": true, + "detail": "app.api.schemas.investigation", + "documentation": {} + }, + { + "label": "InvestigationCreate", + "importPath": "app.api.schemas.investigation", + "description": "app.api.schemas.investigation", + "isExtraImport": true, + "detail": "app.api.schemas.investigation", + "documentation": {} + }, + { + "label": "InvestigationUpdate", + "importPath": "app.api.schemas.investigation", + "description": "app.api.schemas.investigation", + "isExtraImport": true, + "detail": "app.api.schemas.investigation", + "documentation": {} + }, + { + "label": "SketchRead", + "importPath": "app.api.schemas.sketch", + "description": "app.api.schemas.sketch", + "isExtraImport": true, + "detail": "app.api.schemas.sketch", + "documentation": {} + }, + { + "label": "SketchCreate", + "importPath": "app.api.schemas.sketch", + "description": "app.api.schemas.sketch", + "isExtraImport": true, + "detail": "app.api.schemas.sketch", + "documentation": {} + }, + { + "label": "SketchRead", + "importPath": "app.api.schemas.sketch", + "description": "app.api.schemas.sketch", + "isExtraImport": true, + "detail": "app.api.schemas.sketch", + "documentation": {} + }, + { + "label": "SketchUpdate", + "importPath": "app.api.schemas.sketch", + "description": "app.api.schemas.sketch", + "isExtraImport": true, + "detail": "app.api.schemas.sketch", + "documentation": {} + }, + { + "label": "neo4j_connection", + "importPath": "spectragraph_core.core.graph_db", + "description": "spectragraph_core.core.graph_db", + "isExtraImport": true, + "detail": "spectragraph_core.core.graph_db", + "documentation": {} + }, + { + "label": "neo4j_connection", + "importPath": "spectragraph_core.core.graph_db", + "description": "spectragraph_core.core.graph_db", + "isExtraImport": true, + "detail": "spectragraph_core.core.graph_db", + "documentation": {} + }, + { + "label": "Neo4jConnection", + "importPath": "spectragraph_core.core.graph_db", + "description": "spectragraph_core.core.graph_db", + "isExtraImport": true, + "detail": "spectragraph_core.core.graph_db", + "documentation": {} + }, + { + "label": "Neo4jConnection", + "importPath": "spectragraph_core.core.graph_db", + "description": "spectragraph_core.core.graph_db", + "isExtraImport": true, + "detail": "spectragraph_core.core.graph_db", + "documentation": {} + }, + { + "label": "Neo4jConnection", + "importPath": "spectragraph_core.core.graph_db", + "description": "spectragraph_core.core.graph_db", + "isExtraImport": true, + "detail": "spectragraph_core.core.graph_db", + "documentation": {} + }, + { + "label": "Neo4jConnection", + "importPath": "spectragraph_core.core.graph_db", + "description": "spectragraph_core.core.graph_db", + "isExtraImport": true, + "detail": "spectragraph_core.core.graph_db", + "documentation": {} + }, + { + "label": "Neo4jConnection", + "importPath": "spectragraph_core.core.graph_db", + "description": "spectragraph_core.core.graph_db", + "isExtraImport": true, + "detail": "spectragraph_core.core.graph_db", + "documentation": {} + }, + { + "label": "Neo4jConnection", + "importPath": "spectragraph_core.core.graph_db", + "description": "spectragraph_core.core.graph_db", + "isExtraImport": true, + "detail": "spectragraph_core.core.graph_db", + "documentation": {} + }, + { + "label": "Neo4jConnection", + "importPath": "spectragraph_core.core.graph_db", + "description": "spectragraph_core.core.graph_db", + "isExtraImport": true, + "detail": "spectragraph_core.core.graph_db", + "documentation": {} + }, + { + "label": "Neo4jConnection", + "importPath": "spectragraph_core.core.graph_db", + "description": "spectragraph_core.core.graph_db", + "isExtraImport": true, + "detail": "spectragraph_core.core.graph_db", + "documentation": {} + }, + { + "label": "Neo4jConnection", + "importPath": "spectragraph_core.core.graph_db", + "description": "spectragraph_core.core.graph_db", + "isExtraImport": true, + "detail": "spectragraph_core.core.graph_db", + "documentation": {} + }, + { + "label": "Neo4jConnection", + "importPath": "spectragraph_core.core.graph_db", + "description": "spectragraph_core.core.graph_db", + "isExtraImport": true, + "detail": "spectragraph_core.core.graph_db", + "documentation": {} + }, + { + "label": "Neo4jConnection", + "importPath": "spectragraph_core.core.graph_db", + "description": "spectragraph_core.core.graph_db", + "isExtraImport": true, + "detail": "spectragraph_core.core.graph_db", + "documentation": {} + }, + { + "label": "Neo4jConnection", + "importPath": "spectragraph_core.core.graph_db", + "description": "spectragraph_core.core.graph_db", + "isExtraImport": true, + "detail": "spectragraph_core.core.graph_db", + "documentation": {} + }, + { + "label": "Neo4jConnection", + "importPath": "spectragraph_core.core.graph_db", + "description": "spectragraph_core.core.graph_db", + "isExtraImport": true, + "detail": "spectragraph_core.core.graph_db", + "documentation": {} + }, + { + "label": "Neo4jConnection", + "importPath": "spectragraph_core.core.graph_db", + "description": "spectragraph_core.core.graph_db", + "isExtraImport": true, + "detail": "spectragraph_core.core.graph_db", + "documentation": {} + }, + { + "label": "Neo4jConnection", + "importPath": "spectragraph_core.core.graph_db", + "description": "spectragraph_core.core.graph_db", + "isExtraImport": true, + "detail": "spectragraph_core.core.graph_db", + "documentation": {} + }, + { + "label": "Neo4jConnection", + "importPath": "spectragraph_core.core.graph_db", + "description": "spectragraph_core.core.graph_db", + "isExtraImport": true, + "detail": "spectragraph_core.core.graph_db", + "documentation": {} + }, + { + "label": "GraphRepository", + "importPath": "spectragraph_core.core.graph_repository", + "description": "spectragraph_core.core.graph_repository", + "isExtraImport": true, + "detail": "spectragraph_core.core.graph_repository", + "documentation": {} + }, + { + "label": "GraphRepository", + "importPath": "spectragraph_core.core.graph_repository", + "description": "spectragraph_core.core.graph_repository", + "isExtraImport": true, + "detail": "spectragraph_core.core.graph_repository", + "documentation": {} + }, + { + "label": "Vault", + "importPath": "spectragraph_core.core.vault", + "description": "spectragraph_core.core.vault", + "isExtraImport": true, + "detail": "spectragraph_core.core.vault", + "documentation": {} + }, + { + "label": "Vault", + "importPath": "spectragraph_core.core.vault", + "description": "spectragraph_core.core.vault", + "isExtraImport": true, + "detail": "spectragraph_core.core.vault", + "documentation": {} + }, + { + "label": "VaultProtocol", + "importPath": "spectragraph_core.core.vault", + "description": "spectragraph_core.core.vault", + "isExtraImport": true, + "detail": "spectragraph_core.core.vault", + "documentation": {} + }, + { + "label": "KeyRead", + "importPath": "app.api.schemas.key", + "description": "app.api.schemas.key", + "isExtraImport": true, + "detail": "app.api.schemas.key", + "documentation": {} + }, + { + "label": "KeyCreate", + "importPath": "app.api.schemas.key", + "description": "app.api.schemas.key", + "isExtraImport": true, + "detail": "app.api.schemas.key", + "documentation": {} + }, + { + "label": "ScanRead", + "importPath": "app.api.schemas.scan", + "description": "app.api.schemas.scan", + "isExtraImport": true, + "detail": "app.api.schemas.scan", + "documentation": {} + }, + { + "label": "parse_file", + "importPath": "spectragraph_core.imports", + "description": "spectragraph_core.imports", + "isExtraImport": true, + "detail": "spectragraph_core.imports", + "documentation": {} + }, + { + "label": "parse_file", + "importPath": "spectragraph_core.imports", + "description": "spectragraph_core.imports", + "isExtraImport": true, + "detail": "spectragraph_core.imports", + "documentation": {} + }, + { + "label": "update_sketch_timestamp", + "importPath": "app.api.sketch_utils", + "description": "app.api.sketch_utils", + "isExtraImport": true, + "detail": "app.api.sketch_utils", + "documentation": {} + }, + { + "label": "JWTError", + "importPath": "jose", + "description": "jose", + "isExtraImport": true, + "detail": "jose", + "documentation": {} + }, + { + "label": "jwt", + "importPath": "jose", + "description": "jose", + "isExtraImport": true, + "detail": "jose", + "documentation": {} + }, + { + "label": "jwt", + "importPath": "jose", + "description": "jose", + "isExtraImport": true, + "detail": "jose", + "documentation": {} + }, + { + "label": "jwt", + "importPath": "jose", + "description": "jose", + "isExtraImport": true, + "detail": "jose", + "documentation": {} + }, + { + "label": "wraps", + "importPath": "functools", + "description": "functools", + "isExtraImport": true, + "detail": "functools", + "documentation": {} + }, + { + "label": "hashlib", + "kind": 6, + "isExtraImport": true, + "importPath": "hashlib", + "description": "hashlib", + "detail": "hashlib", + "documentation": {} + }, + { + "label": "Draft7Validator", + "importPath": "jsonschema", + "description": "jsonschema", + "isExtraImport": true, + "detail": "jsonschema", + "documentation": {} + }, + { + "label": "ValidationError", + "importPath": "jsonschema", + "description": "jsonschema", + "isExtraImport": true, + "detail": "jsonschema", + "documentation": {} + }, + { + "label": "RequestValidationError", + "importPath": "fastapi.exceptions", + "description": "fastapi.exceptions", + "isExtraImport": true, + "detail": "fastapi.exceptions", + "documentation": {} + }, + { + "label": "RequestValidationError", + "importPath": "fastapi.exceptions", + "description": "fastapi.exceptions", + "isExtraImport": true, + "detail": "fastapi.exceptions", + "documentation": {} + }, + { + "label": "HTTPException", + "importPath": "starlette.exceptions", + "description": "starlette.exceptions", + "isExtraImport": true, + "detail": "starlette.exceptions", + "documentation": {} + }, + { + "label": "HTTPException", + "importPath": "starlette.exceptions", + "description": "starlette.exceptions", + "isExtraImport": true, + "detail": "starlette.exceptions", + "documentation": {} + }, + { + "label": "logging", + "kind": 6, + "isExtraImport": true, + "importPath": "logging", + "description": "logging", + "detail": "logging", + "documentation": {} + }, + { + "label": "CORSMiddleware", + "importPath": "fastapi.middleware.cors", + "description": "fastapi.middleware.cors", + "isExtraImport": true, + "detail": "fastapi.middleware.cors", + "documentation": {} + }, + { + "label": "time", + "kind": 6, + "isExtraImport": true, + "importPath": "time", + "description": "time", + "detail": "time", + "documentation": {} + }, + { + "label": "auth", + "importPath": "app.api.routes", + "description": "app.api.routes", + "isExtraImport": true, + "detail": "app.api.routes", + "documentation": {} + }, + { + "label": "investigations", + "importPath": "app.api.routes", + "description": "app.api.routes", + "isExtraImport": true, + "detail": "app.api.routes", + "documentation": {} + }, + { + "label": "sketches", + "importPath": "app.api.routes", + "description": "app.api.routes", + "isExtraImport": true, + "detail": "app.api.routes", + "documentation": {} + }, + { + "label": "flows", + "importPath": "app.api.routes", + "description": "app.api.routes", + "isExtraImport": true, + "detail": "app.api.routes", + "documentation": {} + }, + { + "label": "events", + "importPath": "app.api.routes", + "description": "app.api.routes", + "isExtraImport": true, + "detail": "app.api.routes", + "documentation": {} + }, + { + "label": "analysis", + "importPath": "app.api.routes", + "description": "app.api.routes", + "isExtraImport": true, + "detail": "app.api.routes", + "documentation": {} + }, + { + "label": "chat", + "importPath": "app.api.routes", + "description": "app.api.routes", + "isExtraImport": true, + "detail": "app.api.routes", + "documentation": {} + }, + { + "label": "scan", + "importPath": "app.api.routes", + "description": "app.api.routes", + "isExtraImport": true, + "detail": "app.api.routes", + "documentation": {} + }, + { + "label": "keys", + "importPath": "app.api.routes", + "description": "app.api.routes", + "isExtraImport": true, + "detail": "app.api.routes", + "documentation": {} + }, + { + "label": "types", + "importPath": "app.api.routes", + "description": "app.api.routes", + "isExtraImport": true, + "detail": "app.api.routes", + "documentation": {} + }, + { + "label": "custom_types", + "importPath": "app.api.routes", + "description": "app.api.routes", + "isExtraImport": true, + "detail": "app.api.routes", + "documentation": {} + }, + { + "label": "setup_logging", + "importPath": "app.logging_config", + "description": "app.logging_config", + "isExtraImport": true, + "detail": "app.logging_config", + "documentation": {} + }, + { + "label": "global_exception_handler", + "importPath": "app.exceptions", + "description": "app.exceptions", + "isExtraImport": true, + "detail": "app.exceptions", + "documentation": {} + }, + { + "label": "http_exception_handler", + "importPath": "app.exceptions", + "description": "app.exceptions", + "isExtraImport": true, + "detail": "app.exceptions", + "documentation": {} + }, + { + "label": "validation_exception_handler", + "importPath": "app.exceptions", + "description": "app.exceptions", + "isExtraImport": true, + "detail": "app.exceptions", + "documentation": {} + }, + { + "label": "urlparse", + "importPath": "urllib.parse", + "description": "urllib.parse", + "isExtraImport": true, + "detail": "urllib.parse", + "documentation": {} + }, + { + "label": "urlparse", + "importPath": "urllib.parse", + "description": "urllib.parse", + "isExtraImport": true, + "detail": "urllib.parse", + "documentation": {} + }, + { + "label": "urlparse", + "importPath": "urllib.parse", + "description": "urllib.parse", + "isExtraImport": true, + "detail": "urllib.parse", + "documentation": {} + }, + { + "label": "urlparse", + "importPath": "urllib.parse", + "description": "urllib.parse", + "isExtraImport": true, + "detail": "urllib.parse", + "documentation": {} + }, + { + "label": "urljoin", + "importPath": "urllib.parse", + "description": "urllib.parse", + "isExtraImport": true, + "detail": "urllib.parse", + "documentation": {} + }, + { + "label": "urljoin", + "importPath": "urllib.parse", + "description": "urllib.parse", + "isExtraImport": true, + "detail": "urllib.parse", + "documentation": {} + }, + { + "label": "urlparse", + "importPath": "urllib.parse", + "description": "urllib.parse", + "isExtraImport": true, + "detail": "urllib.parse", + "documentation": {} + }, + { + "label": "urlparse", + "importPath": "urllib.parse", + "description": "urllib.parse", + "isExtraImport": true, + "detail": "urllib.parse", + "documentation": {} + }, + { + "label": "urlparse", + "importPath": "urllib.parse", + "description": "urllib.parse", + "isExtraImport": true, + "detail": "urllib.parse", + "documentation": {} + }, + { + "label": "urlparse", + "importPath": "urllib.parse", + "description": "urllib.parse", + "isExtraImport": true, + "detail": "urllib.parse", + "documentation": {} + }, + { + "label": "urlparse", + "importPath": "urllib.parse", + "description": "urllib.parse", + "isExtraImport": true, + "detail": "urllib.parse", + "documentation": {} + }, + { + "label": "phonenumbers", + "kind": 6, + "isExtraImport": true, + "importPath": "phonenumbers", + "description": "phonenumbers", + "detail": "phonenumbers", + "documentation": {} + }, + { + "label": "NumberParseException", + "importPath": "phonenumbers", + "description": "phonenumbers", + "isExtraImport": true, + "detail": "phonenumbers", + "documentation": {} + }, + { + "label": "NumberParseException", + "importPath": "phonenumbers", + "description": "phonenumbers", + "isExtraImport": true, + "detail": "phonenumbers", + "documentation": {} + }, + { + "label": "NumberParseException", + "importPath": "phonenumbers", + "description": "phonenumbers", + "isExtraImport": true, + "detail": "phonenumbers", + "documentation": {} + }, + { + "label": "ipaddress", + "kind": 6, + "isExtraImport": true, + "importPath": "ipaddress", + "description": "ipaddress", + "detail": "ipaddress", + "documentation": {} + }, + { + "label": "re", + "kind": 6, + "isExtraImport": true, + "importPath": "re", + "description": "re", + "detail": "re", + "documentation": {} + }, + { + "label": "ssl", + "kind": 6, + "isExtraImport": true, + "importPath": "ssl", + "description": "ssl", + "detail": "ssl", + "documentation": {} + }, + { + "label": "socket", + "kind": 6, + "isExtraImport": true, + "importPath": "socket", + "description": "socket", + "detail": "socket", + "documentation": {} + }, + { + "label": "inspect", + "kind": 6, + "isExtraImport": true, + "importPath": "inspect", + "description": "inspect", + "detail": "inspect", + "documentation": {} + }, + { + "label": "CryptContext", + "importPath": "passlib.context", + "description": "passlib.context", + "isExtraImport": true, + "detail": "passlib.context", + "documentation": {} + }, + { + "label": "Celery", + "importPath": "celery", + "description": "celery", + "isExtraImport": true, + "detail": "celery", + "documentation": {} + }, + { + "label": "states", + "importPath": "celery", + "description": "celery", + "isExtraImport": true, + "detail": "celery", + "documentation": {} + }, + { + "label": "states", + "importPath": "celery", + "description": "celery", + "isExtraImport": true, + "detail": "celery", + "documentation": {} + }, + { + "label": "enum", + "kind": 6, + "isExtraImport": true, + "importPath": "enum", + "description": "enum", + "detail": "enum", + "documentation": {} + }, + { + "label": "Enum", + "importPath": "enum", + "description": "enum", + "isExtraImport": true, + "detail": "enum", + "documentation": {} + }, + { + "label": "redis.asyncio", + "kind": 6, + "isExtraImport": true, + "importPath": "redis.asyncio", + "description": "redis.asyncio", + "detail": "redis.asyncio", + "documentation": {} + }, + { + "label": "Lock", + "importPath": "threading", + "description": "threading", + "isExtraImport": true, + "detail": "threading", + "documentation": {} + }, + { + "label": "GraphDatabase", + "importPath": "neo4j", + "description": "neo4j", + "isExtraImport": true, + "detail": "neo4j", + "documentation": {} + }, + { + "label": "Driver", + "importPath": "neo4j", + "description": "neo4j", + "isExtraImport": true, + "detail": "neo4j", + "documentation": {} + }, + { + "label": "Session", + "importPath": "neo4j", + "description": "neo4j", + "isExtraImport": true, + "detail": "neo4j", + "documentation": {} + }, + { + "label": "UUID", + "importPath": "sqlalchemy.dialects.postgresql", + "description": "sqlalchemy.dialects.postgresql", + "isExtraImport": true, + "detail": "sqlalchemy.dialects.postgresql", + "documentation": {} + }, + { + "label": "ARRAY", + "importPath": "sqlalchemy.dialects.postgresql", + "description": "sqlalchemy.dialects.postgresql", + "isExtraImport": true, + "detail": "sqlalchemy.dialects.postgresql", + "documentation": {} + }, + { + "label": "JSONB", + "importPath": "sqlalchemy.dialects.postgresql", + "description": "sqlalchemy.dialects.postgresql", + "isExtraImport": true, + "detail": "sqlalchemy.dialects.postgresql", + "documentation": {} + }, + { + "label": "EventLevel", + "importPath": "spectragraph_core.core.enums", + "description": "spectragraph_core.core.enums", + "isExtraImport": true, + "detail": "spectragraph_core.core.enums", + "documentation": {} + }, + { + "label": "Transform", + "importPath": "spectragraph_core.core.transform_base", + "description": "spectragraph_core.core.transform_base", + "isExtraImport": true, + "detail": "spectragraph_core.core.transform_base", + "documentation": {} + }, + { + "label": "Transform", + "importPath": "spectragraph_core.core.transform_base", + "description": "spectragraph_core.core.transform_base", + "isExtraImport": true, + "detail": "spectragraph_core.core.transform_base", + "documentation": {} + }, + { + "label": "Transform", + "importPath": "spectragraph_core.core.transform_base", + "description": "spectragraph_core.core.transform_base", + "isExtraImport": true, + "detail": "spectragraph_core.core.transform_base", + "documentation": {} + }, + { + "label": "Transform", + "importPath": "spectragraph_core.core.transform_base", + "description": "spectragraph_core.core.transform_base", + "isExtraImport": true, + "detail": "spectragraph_core.core.transform_base", + "documentation": {} + }, + { + "label": "Transform", + "importPath": "spectragraph_core.core.transform_base", + "description": "spectragraph_core.core.transform_base", + "isExtraImport": true, + "detail": "spectragraph_core.core.transform_base", + "documentation": {} + }, + { + "label": "Transform", + "importPath": "spectragraph_core.core.transform_base", + "description": "spectragraph_core.core.transform_base", + "isExtraImport": true, + "detail": "spectragraph_core.core.transform_base", + "documentation": {} + }, + { + "label": "Transform", + "importPath": "spectragraph_core.core.transform_base", + "description": "spectragraph_core.core.transform_base", + "isExtraImport": true, + "detail": "spectragraph_core.core.transform_base", + "documentation": {} + }, + { + "label": "Transform", + "importPath": "spectragraph_core.core.transform_base", + "description": "spectragraph_core.core.transform_base", + "isExtraImport": true, + "detail": "spectragraph_core.core.transform_base", + "documentation": {} + }, + { + "label": "Transform", + "importPath": "spectragraph_core.core.transform_base", + "description": "spectragraph_core.core.transform_base", + "isExtraImport": true, + "detail": "spectragraph_core.core.transform_base", + "documentation": {} + }, + { + "label": "Transform", + "importPath": "spectragraph_core.core.transform_base", + "description": "spectragraph_core.core.transform_base", + "isExtraImport": true, + "detail": "spectragraph_core.core.transform_base", + "documentation": {} + }, + { + "label": "Transform", + "importPath": "spectragraph_core.core.transform_base", + "description": "spectragraph_core.core.transform_base", + "isExtraImport": true, + "detail": "spectragraph_core.core.transform_base", + "documentation": {} + }, + { + "label": "Transform", + "importPath": "spectragraph_core.core.transform_base", + "description": "spectragraph_core.core.transform_base", + "isExtraImport": true, + "detail": "spectragraph_core.core.transform_base", + "documentation": {} + }, + { + "label": "Transform", + "importPath": "spectragraph_core.core.transform_base", + "description": "spectragraph_core.core.transform_base", + "isExtraImport": true, + "detail": "spectragraph_core.core.transform_base", + "documentation": {} + }, + { + "label": "Transform", + "importPath": "spectragraph_core.core.transform_base", + "description": "spectragraph_core.core.transform_base", + "isExtraImport": true, + "detail": "spectragraph_core.core.transform_base", + "documentation": {} + }, + { + "label": "Transform", + "importPath": "spectragraph_core.core.transform_base", + "description": "spectragraph_core.core.transform_base", + "isExtraImport": true, + "detail": "spectragraph_core.core.transform_base", + "documentation": {} + }, + { + "label": "Transform", + "importPath": "spectragraph_core.core.transform_base", + "description": "spectragraph_core.core.transform_base", + "isExtraImport": true, + "detail": "spectragraph_core.core.transform_base", + "documentation": {} + }, + { + "label": "Transform", + "importPath": "spectragraph_core.core.transform_base", + "description": "spectragraph_core.core.transform_base", + "isExtraImport": true, + "detail": "spectragraph_core.core.transform_base", + "documentation": {} + }, + { + "label": "Transform", + "importPath": "spectragraph_core.core.transform_base", + "description": "spectragraph_core.core.transform_base", + "isExtraImport": true, + "detail": "spectragraph_core.core.transform_base", + "documentation": {} + }, + { + "label": "Transform", + "importPath": "spectragraph_core.core.transform_base", + "description": "spectragraph_core.core.transform_base", + "isExtraImport": true, + "detail": "spectragraph_core.core.transform_base", + "documentation": {} + }, + { + "label": "Transform", + "importPath": "spectragraph_core.core.transform_base", + "description": "spectragraph_core.core.transform_base", + "isExtraImport": true, + "detail": "spectragraph_core.core.transform_base", + "documentation": {} + }, + { + "label": "Transform", + "importPath": "spectragraph_core.core.transform_base", + "description": "spectragraph_core.core.transform_base", + "isExtraImport": true, + "detail": "spectragraph_core.core.transform_base", + "documentation": {} + }, + { + "label": "Transform", + "importPath": "spectragraph_core.core.transform_base", + "description": "spectragraph_core.core.transform_base", + "isExtraImport": true, + "detail": "spectragraph_core.core.transform_base", + "documentation": {} + }, + { + "label": "Transform", + "importPath": "spectragraph_core.core.transform_base", + "description": "spectragraph_core.core.transform_base", + "isExtraImport": true, + "detail": "spectragraph_core.core.transform_base", + "documentation": {} + }, + { + "label": "Transform", + "importPath": "spectragraph_core.core.transform_base", + "description": "spectragraph_core.core.transform_base", + "isExtraImport": true, + "detail": "spectragraph_core.core.transform_base", + "documentation": {} + }, + { + "label": "Transform", + "importPath": "spectragraph_core.core.transform_base", + "description": "spectragraph_core.core.transform_base", + "isExtraImport": true, + "detail": "spectragraph_core.core.transform_base", + "documentation": {} + }, + { + "label": "Transform", + "importPath": "spectragraph_core.core.transform_base", + "description": "spectragraph_core.core.transform_base", + "isExtraImport": true, + "detail": "spectragraph_core.core.transform_base", + "documentation": {} + }, + { + "label": "Transform", + "importPath": "spectragraph_core.core.transform_base", + "description": "spectragraph_core.core.transform_base", + "isExtraImport": true, + "detail": "spectragraph_core.core.transform_base", + "documentation": {} + }, + { + "label": "Transform", + "importPath": "spectragraph_core.core.transform_base", + "description": "spectragraph_core.core.transform_base", + "isExtraImport": true, + "detail": "spectragraph_core.core.transform_base", + "documentation": {} + }, + { + "label": "Transform", + "importPath": "spectragraph_core.core.transform_base", + "description": "spectragraph_core.core.transform_base", + "isExtraImport": true, + "detail": "spectragraph_core.core.transform_base", + "documentation": {} + }, + { + "label": "Transform", + "importPath": "spectragraph_core.core.transform_base", + "description": "spectragraph_core.core.transform_base", + "isExtraImport": true, + "detail": "spectragraph_core.core.transform_base", + "documentation": {} + }, + { + "label": "Transform", + "importPath": "spectragraph_core.core.transform_base", + "description": "spectragraph_core.core.transform_base", + "isExtraImport": true, + "detail": "spectragraph_core.core.transform_base", + "documentation": {} + }, + { + "label": "Transform", + "importPath": "spectragraph_core.core.transform_base", + "description": "spectragraph_core.core.transform_base", + "isExtraImport": true, + "detail": "spectragraph_core.core.transform_base", + "documentation": {} + }, + { + "label": "Transform", + "importPath": "spectragraph_core.core.transform_base", + "description": "spectragraph_core.core.transform_base", + "isExtraImport": true, + "detail": "spectragraph_core.core.transform_base", + "documentation": {} + }, + { + "label": "Transform", + "importPath": "spectragraph_core.core.transform_base", + "description": "spectragraph_core.core.transform_base", + "isExtraImport": true, + "detail": "spectragraph_core.core.transform_base", + "documentation": {} + }, + { + "label": "Transform", + "importPath": "spectragraph_core.core.transform_base", + "description": "spectragraph_core.core.transform_base", + "isExtraImport": true, + "detail": "spectragraph_core.core.transform_base", + "documentation": {} + }, + { + "label": "Transform", + "importPath": "spectragraph_core.core.transform_base", + "description": "spectragraph_core.core.transform_base", + "isExtraImport": true, + "detail": "spectragraph_core.core.transform_base", + "documentation": {} + }, + { + "label": "ABC", + "importPath": "abc", + "description": "abc", + "isExtraImport": true, + "detail": "abc", + "documentation": {} + }, + { + "label": "abstractmethod", + "importPath": "abc", + "description": "abc", + "isExtraImport": true, + "detail": "abc", + "documentation": {} + }, + { + "label": "ABC", + "importPath": "abc", + "description": "abc", + "isExtraImport": true, + "detail": "abc", + "documentation": {} + }, + { + "label": "abstractmethod", + "importPath": "abc", + "description": "abc", + "isExtraImport": true, + "detail": "abc", + "documentation": {} + }, + { + "label": "ConfigDict", + "importPath": "pydantic.config", + "description": "pydantic.config", + "isExtraImport": true, + "detail": "pydantic.config", + "documentation": {} + }, + { + "label": "warnings", + "kind": 6, + "isExtraImport": true, + "importPath": "warnings", + "description": "warnings", + "detail": "warnings", + "documentation": {} + }, + { + "label": "Str", + "importPath": "ast", + "description": "ast", + "isExtraImport": true, + "detail": "ast", + "documentation": {} + }, + { + "label": "base64", + "kind": 6, + "isExtraImport": true, + "importPath": "base64", + "description": "base64", + "detail": "base64", + "documentation": {} + }, + { + "label": "binascii", + "kind": 6, + "isExtraImport": true, + "importPath": "binascii", + "description": "binascii", + "detail": "binascii", + "documentation": {} + }, + { + "label": "HKDF", + "importPath": "cryptography.hazmat.primitives.kdf.hkdf", + "description": "cryptography.hazmat.primitives.kdf.hkdf", + "isExtraImport": true, + "detail": "cryptography.hazmat.primitives.kdf.hkdf", + "documentation": {} + }, + { + "label": "hashes", + "importPath": "cryptography.hazmat.primitives", + "description": "cryptography.hazmat.primitives", + "isExtraImport": true, + "detail": "cryptography.hazmat.primitives", + "documentation": {} + }, + { + "label": "AESGCM", + "importPath": "cryptography.hazmat.primitives.ciphers.aead", + "description": "cryptography.hazmat.primitives.ciphers.aead", + "isExtraImport": true, + "detail": "cryptography.hazmat.primitives.ciphers.aead", + "documentation": {} + }, + { + "label": "csv", + "kind": 6, + "isExtraImport": true, + "importPath": "csv", + "description": "csv", + "detail": "csv", + "documentation": {} + }, + { + "label": "io", + "kind": 6, + "isExtraImport": true, + "importPath": "io", + "description": "io", + "detail": "io", + "documentation": {} + }, + { + "label": "dataclass", + "importPath": "dataclasses", + "description": "dataclasses", + "isExtraImport": true, + "detail": "dataclasses", + "documentation": {} + }, + { + "label": "Path", + "importPath": "pathlib", + "description": "pathlib", + "isExtraImport": true, + "detail": "pathlib", + "documentation": {} + }, + { + "label": "Path", + "importPath": "pathlib", + "description": "pathlib", + "isExtraImport": true, + "detail": "pathlib", + "documentation": {} + }, + { + "label": "Path", + "importPath": "pathlib", + "description": "pathlib", + "isExtraImport": true, + "detail": "pathlib", + "documentation": {} + }, + { + "label": "Path", + "importPath": "pathlib", + "description": "pathlib", + "isExtraImport": true, + "detail": "pathlib", + "documentation": {} + }, + { + "label": "redis", + "kind": 6, + "isExtraImport": true, + "importPath": "redis", + "description": "redis", + "detail": "redis", + "documentation": {} + }, + { + "label": "pytest", + "kind": 6, + "isExtraImport": true, + "importPath": "pytest", + "description": "pytest", + "detail": "pytest", + "documentation": {} + }, + { + "label": "detect_entity_type", + "importPath": "spectragraph_core.imports.entity_detection", + "description": "spectragraph_core.imports.entity_detection", + "isExtraImport": true, + "detail": "spectragraph_core.imports.entity_detection", + "documentation": {} + }, + { + "label": "is_email", + "importPath": "spectragraph_core.imports.entity_detection", + "description": "spectragraph_core.imports.entity_detection", + "isExtraImport": true, + "detail": "spectragraph_core.imports.entity_detection", + "documentation": {} + }, + { + "label": "is_domain", + "importPath": "spectragraph_core.imports.entity_detection", + "description": "spectragraph_core.imports.entity_detection", + "isExtraImport": true, + "detail": "spectragraph_core.imports.entity_detection", + "documentation": {} + }, + { + "label": "is_ip_address", + "importPath": "spectragraph_core.imports.entity_detection", + "description": "spectragraph_core.imports.entity_detection", + "isExtraImport": true, + "detail": "spectragraph_core.imports.entity_detection", + "documentation": {} + }, + { + "label": "is_website", + "importPath": "spectragraph_core.imports.entity_detection", + "description": "spectragraph_core.imports.entity_detection", + "isExtraImport": true, + "detail": "spectragraph_core.imports.entity_detection", + "documentation": {} + }, + { + "label": "is_phone", + "importPath": "spectragraph_core.imports.entity_detection", + "description": "spectragraph_core.imports.entity_detection", + "isExtraImport": true, + "detail": "spectragraph_core.imports.entity_detection", + "documentation": {} + }, + { + "label": "is_asn", + "importPath": "spectragraph_core.imports.entity_detection", + "description": "spectragraph_core.imports.entity_detection", + "isExtraImport": true, + "detail": "spectragraph_core.imports.entity_detection", + "documentation": {} + }, + { + "label": "is_username", + "importPath": "spectragraph_core.imports.entity_detection", + "description": "spectragraph_core.imports.entity_detection", + "isExtraImport": true, + "detail": "spectragraph_core.imports.entity_detection", + "documentation": {} + }, + { + "label": "get_default_label", + "importPath": "spectragraph_core.imports.entity_detection", + "description": "spectragraph_core.imports.entity_detection", + "isExtraImport": true, + "detail": "spectragraph_core.imports.entity_detection", + "documentation": {} + }, + { + "label": "Mock", + "importPath": "unittest.mock", + "description": "unittest.mock", + "isExtraImport": true, + "detail": "unittest.mock", + "documentation": {} + }, + { + "label": "MagicMock", + "importPath": "unittest.mock", + "description": "unittest.mock", + "isExtraImport": true, + "detail": "unittest.mock", + "documentation": {} + }, + { + "label": "patch", + "importPath": "unittest.mock", + "description": "unittest.mock", + "isExtraImport": true, + "detail": "unittest.mock", + "documentation": {} + }, + { + "label": "Mock", + "importPath": "unittest.mock", + "description": "unittest.mock", + "isExtraImport": true, + "detail": "unittest.mock", + "documentation": {} + }, + { + "label": "MagicMock", + "importPath": "unittest.mock", + "description": "unittest.mock", + "isExtraImport": true, + "detail": "unittest.mock", + "documentation": {} + }, + { + "label": "MagicMock", + "importPath": "unittest.mock", + "description": "unittest.mock", + "isExtraImport": true, + "detail": "unittest.mock", + "documentation": {} + }, + { + "label": "call", + "importPath": "unittest.mock", + "description": "unittest.mock", + "isExtraImport": true, + "detail": "unittest.mock", + "documentation": {} + }, + { + "label": "patch", + "importPath": "unittest.mock", + "description": "unittest.mock", + "isExtraImport": true, + "detail": "unittest.mock", + "documentation": {} + }, + { + "label": "Mock", + "importPath": "unittest.mock", + "description": "unittest.mock", + "isExtraImport": true, + "detail": "unittest.mock", + "documentation": {} + }, + { + "label": "Mock", + "importPath": "unittest.mock", + "description": "unittest.mock", + "isExtraImport": true, + "detail": "unittest.mock", + "documentation": {} + }, + { + "label": "patch", + "importPath": "unittest.mock", + "description": "unittest.mock", + "isExtraImport": true, + "detail": "unittest.mock", + "documentation": {} + }, + { + "label": "patch", + "importPath": "unittest.mock", + "description": "unittest.mock", + "isExtraImport": true, + "detail": "unittest.mock", + "documentation": {} + }, + { + "label": "MagicMock", + "importPath": "unittest.mock", + "description": "unittest.mock", + "isExtraImport": true, + "detail": "unittest.mock", + "documentation": {} + }, + { + "label": "Mock", + "importPath": "unittest.mock", + "description": "unittest.mock", + "isExtraImport": true, + "detail": "unittest.mock", + "documentation": {} + }, + { + "label": "Mock", + "importPath": "unittest.mock", + "description": "unittest.mock", + "isExtraImport": true, + "detail": "unittest.mock", + "documentation": {} + }, + { + "label": "patch", + "importPath": "unittest.mock", + "description": "unittest.mock", + "isExtraImport": true, + "detail": "unittest.mock", + "documentation": {} + }, + { + "label": "AsyncMock", + "importPath": "unittest.mock", + "description": "unittest.mock", + "isExtraImport": true, + "detail": "unittest.mock", + "documentation": {} + }, + { + "label": "patch", + "importPath": "unittest.mock", + "description": "unittest.mock", + "isExtraImport": true, + "detail": "unittest.mock", + "documentation": {} + }, + { + "label": "MagicMock", + "importPath": "unittest.mock", + "description": "unittest.mock", + "isExtraImport": true, + "detail": "unittest.mock", + "documentation": {} + }, + { + "label": "Mock", + "importPath": "unittest.mock", + "description": "unittest.mock", + "isExtraImport": true, + "detail": "unittest.mock", + "documentation": {} + }, + { + "label": "MagicMock", + "importPath": "unittest.mock", + "description": "unittest.mock", + "isExtraImport": true, + "detail": "unittest.mock", + "documentation": {} + }, + { + "label": "CIDR", + "importPath": "spectragraph_types.cidr", + "description": "spectragraph_types.cidr", + "isExtraImport": true, + "detail": "spectragraph_types.cidr", + "documentation": {} + }, + { + "label": "CIDR", + "importPath": "spectragraph_types.cidr", + "description": "spectragraph_types.cidr", + "isExtraImport": true, + "detail": "spectragraph_types.cidr", + "documentation": {} + }, + { + "label": "CIDR", + "importPath": "spectragraph_types.cidr", + "description": "spectragraph_types.cidr", + "isExtraImport": true, + "detail": "spectragraph_types.cidr", + "documentation": {} + }, + { + "label": "CIDR", + "importPath": "spectragraph_types.cidr", + "description": "spectragraph_types.cidr", + "isExtraImport": true, + "detail": "spectragraph_types.cidr", + "documentation": {} + }, + { + "label": "ASN", + "importPath": "spectragraph_types.asn", + "description": "spectragraph_types.asn", + "isExtraImport": true, + "detail": "spectragraph_types.asn", + "documentation": {} + }, + { + "label": "ASN", + "importPath": "spectragraph_types.asn", + "description": "spectragraph_types.asn", + "isExtraImport": true, + "detail": "spectragraph_types.asn", + "documentation": {} + }, + { + "label": "ASN", + "importPath": "spectragraph_types.asn", + "description": "spectragraph_types.asn", + "isExtraImport": true, + "detail": "spectragraph_types.asn", + "documentation": {} + }, + { + "label": "ASN", + "importPath": "spectragraph_types.asn", + "description": "spectragraph_types.asn", + "isExtraImport": true, + "detail": "spectragraph_types.asn", + "documentation": {} + }, + { + "label": "ASN", + "importPath": "spectragraph_types.asn", + "description": "spectragraph_types.asn", + "isExtraImport": true, + "detail": "spectragraph_types.asn", + "documentation": {} + }, + { + "label": "ASN", + "importPath": "spectragraph_types.asn", + "description": "spectragraph_types.asn", + "isExtraImport": true, + "detail": "spectragraph_types.asn", + "documentation": {} + }, + { + "label": "Logger", + "importPath": "spectragraph_core.core.logger", + "description": "spectragraph_core.core.logger", + "isExtraImport": true, + "detail": "spectragraph_core.core.logger", + "documentation": {} + }, + { + "label": "Logger", + "importPath": "spectragraph_core.core.logger", + "description": "spectragraph_core.core.logger", + "isExtraImport": true, + "detail": "spectragraph_core.core.logger", + "documentation": {} + }, + { + "label": "Logger", + "importPath": "spectragraph_core.core.logger", + "description": "spectragraph_core.core.logger", + "isExtraImport": true, + "detail": "spectragraph_core.core.logger", + "documentation": {} + }, + { + "label": "Logger", + "importPath": "spectragraph_core.core.logger", + "description": "spectragraph_core.core.logger", + "isExtraImport": true, + "detail": "spectragraph_core.core.logger", + "documentation": {} + }, + { + "label": "Logger", + "importPath": "spectragraph_core.core.logger", + "description": "spectragraph_core.core.logger", + "isExtraImport": true, + "detail": "spectragraph_core.core.logger", + "documentation": {} + }, + { + "label": "Logger", + "importPath": "spectragraph_core.core.logger", + "description": "spectragraph_core.core.logger", + "isExtraImport": true, + "detail": "spectragraph_core.core.logger", + "documentation": {} + }, + { + "label": "Logger", + "importPath": "spectragraph_core.core.logger", + "description": "spectragraph_core.core.logger", + "isExtraImport": true, + "detail": "spectragraph_core.core.logger", + "documentation": {} + }, + { + "label": "Logger", + "importPath": "spectragraph_core.core.logger", + "description": "spectragraph_core.core.logger", + "isExtraImport": true, + "detail": "spectragraph_core.core.logger", + "documentation": {} + }, + { + "label": "Logger", + "importPath": "spectragraph_core.core.logger", + "description": "spectragraph_core.core.logger", + "isExtraImport": true, + "detail": "spectragraph_core.core.logger", + "documentation": {} + }, + { + "label": "Logger", + "importPath": "spectragraph_core.core.logger", + "description": "spectragraph_core.core.logger", + "isExtraImport": true, + "detail": "spectragraph_core.core.logger", + "documentation": {} + }, + { + "label": "Logger", + "importPath": "spectragraph_core.core.logger", + "description": "spectragraph_core.core.logger", + "isExtraImport": true, + "detail": "spectragraph_core.core.logger", + "documentation": {} + }, + { + "label": "Logger", + "importPath": "spectragraph_core.core.logger", + "description": "spectragraph_core.core.logger", + "isExtraImport": true, + "detail": "spectragraph_core.core.logger", + "documentation": {} + }, + { + "label": "Logger", + "importPath": "spectragraph_core.core.logger", + "description": "spectragraph_core.core.logger", + "isExtraImport": true, + "detail": "spectragraph_core.core.logger", + "documentation": {} + }, + { + "label": "Logger", + "importPath": "spectragraph_core.core.logger", + "description": "spectragraph_core.core.logger", + "isExtraImport": true, + "detail": "spectragraph_core.core.logger", + "documentation": {} + }, + { + "label": "Logger", + "importPath": "spectragraph_core.core.logger", + "description": "spectragraph_core.core.logger", + "isExtraImport": true, + "detail": "spectragraph_core.core.logger", + "documentation": {} + }, + { + "label": "Logger", + "importPath": "spectragraph_core.core.logger", + "description": "spectragraph_core.core.logger", + "isExtraImport": true, + "detail": "spectragraph_core.core.logger", + "documentation": {} + }, + { + "label": "Logger", + "importPath": "spectragraph_core.core.logger", + "description": "spectragraph_core.core.logger", + "isExtraImport": true, + "detail": "spectragraph_core.core.logger", + "documentation": {} + }, + { + "label": "Logger", + "importPath": "spectragraph_core.core.logger", + "description": "spectragraph_core.core.logger", + "isExtraImport": true, + "detail": "spectragraph_core.core.logger", + "documentation": {} + }, + { + "label": "Logger", + "importPath": "spectragraph_core.core.logger", + "description": "spectragraph_core.core.logger", + "isExtraImport": true, + "detail": "spectragraph_core.core.logger", + "documentation": {} + }, + { + "label": "Logger", + "importPath": "spectragraph_core.core.logger", + "description": "spectragraph_core.core.logger", + "isExtraImport": true, + "detail": "spectragraph_core.core.logger", + "documentation": {} + }, + { + "label": "Logger", + "importPath": "spectragraph_core.core.logger", + "description": "spectragraph_core.core.logger", + "isExtraImport": true, + "detail": "spectragraph_core.core.logger", + "documentation": {} + }, + { + "label": "Logger", + "importPath": "spectragraph_core.core.logger", + "description": "spectragraph_core.core.logger", + "isExtraImport": true, + "detail": "spectragraph_core.core.logger", + "documentation": {} + }, + { + "label": "Logger", + "importPath": "spectragraph_core.core.logger", + "description": "spectragraph_core.core.logger", + "isExtraImport": true, + "detail": "spectragraph_core.core.logger", + "documentation": {} + }, + { + "label": "Logger", + "importPath": "spectragraph_core.core.logger", + "description": "spectragraph_core.core.logger", + "isExtraImport": true, + "detail": "spectragraph_core.core.logger", + "documentation": {} + }, + { + "label": "Logger", + "importPath": "spectragraph_core.core.logger", + "description": "spectragraph_core.core.logger", + "isExtraImport": true, + "detail": "spectragraph_core.core.logger", + "documentation": {} + }, + { + "label": "Logger", + "importPath": "spectragraph_core.core.logger", + "description": "spectragraph_core.core.logger", + "isExtraImport": true, + "detail": "spectragraph_core.core.logger", + "documentation": {} + }, + { + "label": "Logger", + "importPath": "spectragraph_core.core.logger", + "description": "spectragraph_core.core.logger", + "isExtraImport": true, + "detail": "spectragraph_core.core.logger", + "documentation": {} + }, + { + "label": "Logger", + "importPath": "spectragraph_core.core.logger", + "description": "spectragraph_core.core.logger", + "isExtraImport": true, + "detail": "spectragraph_core.core.logger", + "documentation": {} + }, + { + "label": "Logger", + "importPath": "spectragraph_core.core.logger", + "description": "spectragraph_core.core.logger", + "isExtraImport": true, + "detail": "spectragraph_core.core.logger", + "documentation": {} + }, + { + "label": "Logger", + "importPath": "spectragraph_core.core.logger", + "description": "spectragraph_core.core.logger", + "isExtraImport": true, + "detail": "spectragraph_core.core.logger", + "documentation": {} + }, + { + "label": "Logger", + "importPath": "spectragraph_core.core.logger", + "description": "spectragraph_core.core.logger", + "isExtraImport": true, + "detail": "spectragraph_core.core.logger", + "documentation": {} + }, + { + "label": "Logger", + "importPath": "spectragraph_core.core.logger", + "description": "spectragraph_core.core.logger", + "isExtraImport": true, + "detail": "spectragraph_core.core.logger", + "documentation": {} + }, + { + "label": "AsnmapTool", + "importPath": "tools.network.asnmap", + "description": "tools.network.asnmap", + "isExtraImport": true, + "detail": "tools.network.asnmap", + "documentation": {} + }, + { + "label": "AsnmapTool", + "importPath": "tools.network.asnmap", + "description": "tools.network.asnmap", + "isExtraImport": true, + "detail": "tools.network.asnmap", + "documentation": {} + }, + { + "label": "AsnmapTool", + "importPath": "tools.network.asnmap", + "description": "tools.network.asnmap", + "isExtraImport": true, + "detail": "tools.network.asnmap", + "documentation": {} + }, + { + "label": "AsnmapTool", + "importPath": "tools.network.asnmap", + "description": "tools.network.asnmap", + "isExtraImport": true, + "detail": "tools.network.asnmap", + "documentation": {} + }, + { + "label": "Ip", + "importPath": "spectragraph_types.ip", + "description": "spectragraph_types.ip", + "isExtraImport": true, + "detail": "spectragraph_types.ip", + "documentation": {} + }, + { + "label": "Ip", + "importPath": "spectragraph_types.ip", + "description": "spectragraph_types.ip", + "isExtraImport": true, + "detail": "spectragraph_types.ip", + "documentation": {} + }, + { + "label": "Ip", + "importPath": "spectragraph_types.ip", + "description": "spectragraph_types.ip", + "isExtraImport": true, + "detail": "spectragraph_types.ip", + "documentation": {} + }, + { + "label": "Ip", + "importPath": "spectragraph_types.ip", + "description": "spectragraph_types.ip", + "isExtraImport": true, + "detail": "spectragraph_types.ip", + "documentation": {} + }, + { + "label": "Ip", + "importPath": "spectragraph_types.ip", + "description": "spectragraph_types.ip", + "isExtraImport": true, + "detail": "spectragraph_types.ip", + "documentation": {} + }, + { + "label": "Ip", + "importPath": "spectragraph_types.ip", + "description": "spectragraph_types.ip", + "isExtraImport": true, + "detail": "spectragraph_types.ip", + "documentation": {} + }, + { + "label": "Ip", + "importPath": "spectragraph_types.ip", + "description": "spectragraph_types.ip", + "isExtraImport": true, + "detail": "spectragraph_types.ip", + "documentation": {} + }, + { + "label": "Ip", + "importPath": "spectragraph_types.ip", + "description": "spectragraph_types.ip", + "isExtraImport": true, + "detail": "spectragraph_types.ip", + "documentation": {} + }, + { + "label": "Ip", + "importPath": "spectragraph_types.ip", + "description": "spectragraph_types.ip", + "isExtraImport": true, + "detail": "spectragraph_types.ip", + "documentation": {} + }, + { + "label": "Ip", + "importPath": "spectragraph_types.ip", + "description": "spectragraph_types.ip", + "isExtraImport": true, + "detail": "spectragraph_types.ip", + "documentation": {} + }, + { + "label": "Ip", + "importPath": "spectragraph_types.ip", + "description": "spectragraph_types.ip", + "isExtraImport": true, + "detail": "spectragraph_types.ip", + "documentation": {} + }, + { + "label": "Ip", + "importPath": "spectragraph_types.ip", + "description": "spectragraph_types.ip", + "isExtraImport": true, + "detail": "spectragraph_types.ip", + "documentation": {} + }, + { + "label": "MapcidrTool", + "importPath": "tools.network.mapcidr", + "description": "tools.network.mapcidr", + "isExtraImport": true, + "detail": "tools.network.mapcidr", + "documentation": {} + }, + { + "label": "requests", + "kind": 6, + "isExtraImport": true, + "importPath": "requests", + "description": "requests", + "detail": "requests", + "documentation": {} + }, + { + "label": "CryptoWallet", + "importPath": "spectragraph_types.wallet", + "description": "spectragraph_types.wallet", + "isExtraImport": true, + "detail": "spectragraph_types.wallet", + "documentation": {} + }, + { + "label": "CryptoNFT", + "importPath": "spectragraph_types.wallet", + "description": "spectragraph_types.wallet", + "isExtraImport": true, + "detail": "spectragraph_types.wallet", + "documentation": {} + }, + { + "label": "CryptoWallet", + "importPath": "spectragraph_types.wallet", + "description": "spectragraph_types.wallet", + "isExtraImport": true, + "detail": "spectragraph_types.wallet", + "documentation": {} + }, + { + "label": "CryptoWalletTransaction", + "importPath": "spectragraph_types.wallet", + "description": "spectragraph_types.wallet", + "isExtraImport": true, + "detail": "spectragraph_types.wallet", + "documentation": {} + }, + { + "label": "CryptoWallet", + "importPath": "spectragraph_types.wallet", + "description": "spectragraph_types.wallet", + "isExtraImport": true, + "detail": "spectragraph_types.wallet", + "documentation": {} + }, + { + "label": "CryptoNFT", + "importPath": "spectragraph_types.wallet", + "description": "spectragraph_types.wallet", + "isExtraImport": true, + "detail": "spectragraph_types.wallet", + "documentation": {} + }, + { + "label": "CryptoWallet", + "importPath": "spectragraph_types.wallet", + "description": "spectragraph_types.wallet", + "isExtraImport": true, + "detail": "spectragraph_types.wallet", + "documentation": {} + }, + { + "label": "CryptoWalletTransaction", + "importPath": "spectragraph_types.wallet", + "description": "spectragraph_types.wallet", + "isExtraImport": true, + "detail": "spectragraph_types.wallet", + "documentation": {} + }, + { + "label": "requests.exceptions", + "kind": 6, + "isExtraImport": true, + "importPath": "requests.exceptions", + "description": "requests.exceptions", + "detail": "requests.exceptions", + "documentation": {} + }, + { + "label": "Domain", + "importPath": "spectragraph_types.domain", + "description": "spectragraph_types.domain", + "isExtraImport": true, + "detail": "spectragraph_types.domain", + "documentation": {} + }, + { + "label": "Domain", + "importPath": "spectragraph_types.domain", + "description": "spectragraph_types.domain", + "isExtraImport": true, + "detail": "spectragraph_types.domain", + "documentation": {} + }, + { + "label": "Domain", + "importPath": "spectragraph_types.domain", + "description": "spectragraph_types.domain", + "isExtraImport": true, + "detail": "spectragraph_types.domain", + "documentation": {} + }, + { + "label": "Domain", + "importPath": "spectragraph_types.domain", + "description": "spectragraph_types.domain", + "isExtraImport": true, + "detail": "spectragraph_types.domain", + "documentation": {} + }, + { + "label": "Domain", + "importPath": "spectragraph_types.domain", + "description": "spectragraph_types.domain", + "isExtraImport": true, + "detail": "spectragraph_types.domain", + "documentation": {} + }, + { + "label": "Domain", + "importPath": "spectragraph_types.domain", + "description": "spectragraph_types.domain", + "isExtraImport": true, + "detail": "spectragraph_types.domain", + "documentation": {} + }, + { + "label": "Domain", + "importPath": "spectragraph_types.domain", + "description": "spectragraph_types.domain", + "isExtraImport": true, + "detail": "spectragraph_types.domain", + "documentation": {} + }, + { + "label": "Domain", + "importPath": "spectragraph_types.domain", + "description": "spectragraph_types.domain", + "isExtraImport": true, + "detail": "spectragraph_types.domain", + "documentation": {} + }, + { + "label": "Domain", + "importPath": "spectragraph_types.domain", + "description": "spectragraph_types.domain", + "isExtraImport": true, + "detail": "spectragraph_types.domain", + "documentation": {} + }, + { + "label": "Domain", + "importPath": "spectragraph_types.domain", + "description": "spectragraph_types.domain", + "isExtraImport": true, + "detail": "spectragraph_types.domain", + "documentation": {} + }, + { + "label": "Domain", + "importPath": "spectragraph_types.domain", + "description": "spectragraph_types.domain", + "isExtraImport": true, + "detail": "spectragraph_types.domain", + "documentation": {} + }, + { + "label": "Domain", + "importPath": "spectragraph_types.domain", + "description": "spectragraph_types.domain", + "isExtraImport": true, + "detail": "spectragraph_types.domain", + "documentation": {} + }, + { + "label": "Domain", + "importPath": "spectragraph_types.domain", + "description": "spectragraph_types.domain", + "isExtraImport": true, + "detail": "spectragraph_types.domain", + "documentation": {} + }, + { + "label": "Domain", + "importPath": "spectragraph_types.domain", + "description": "spectragraph_types.domain", + "isExtraImport": true, + "detail": "spectragraph_types.domain", + "documentation": {} + }, + { + "label": "Domain", + "importPath": "spectragraph_types.domain", + "description": "spectragraph_types.domain", + "isExtraImport": true, + "detail": "spectragraph_types.domain", + "documentation": {} + }, + { + "label": "Domain", + "importPath": "spectragraph_types.domain", + "description": "spectragraph_types.domain", + "isExtraImport": true, + "detail": "spectragraph_types.domain", + "documentation": {} + }, + { + "label": "Domain", + "importPath": "spectragraph_types.domain", + "description": "spectragraph_types.domain", + "isExtraImport": true, + "detail": "spectragraph_types.domain", + "documentation": {} + }, + { + "label": "Domain", + "importPath": "spectragraph_types.domain", + "description": "spectragraph_types.domain", + "isExtraImport": true, + "detail": "spectragraph_types.domain", + "documentation": {} + }, + { + "label": "Domain", + "importPath": "spectragraph_types.domain", + "description": "spectragraph_types.domain", + "isExtraImport": true, + "detail": "spectragraph_types.domain", + "documentation": {} + }, + { + "label": "Individual", + "importPath": "spectragraph_types.individual", + "description": "spectragraph_types.individual", + "isExtraImport": true, + "detail": "spectragraph_types.individual", + "documentation": {} + }, + { + "label": "Individual", + "importPath": "spectragraph_types.individual", + "description": "spectragraph_types.individual", + "isExtraImport": true, + "detail": "spectragraph_types.individual", + "documentation": {} + }, + { + "label": "Individual", + "importPath": "spectragraph_types.individual", + "description": "spectragraph_types.individual", + "isExtraImport": true, + "detail": "spectragraph_types.individual", + "documentation": {} + }, + { + "label": "Individual", + "importPath": "spectragraph_types.individual", + "description": "spectragraph_types.individual", + "isExtraImport": true, + "detail": "spectragraph_types.individual", + "documentation": {} + }, + { + "label": "Individual", + "importPath": "spectragraph_types.individual", + "description": "spectragraph_types.individual", + "isExtraImport": true, + "detail": "spectragraph_types.individual", + "documentation": {} + }, + { + "label": "Organization", + "importPath": "spectragraph_types.organization", + "description": "spectragraph_types.organization", + "isExtraImport": true, + "detail": "spectragraph_types.organization", + "documentation": {} + }, + { + "label": "Organization", + "importPath": "spectragraph_types.organization", + "description": "spectragraph_types.organization", + "isExtraImport": true, + "detail": "spectragraph_types.organization", + "documentation": {} + }, + { + "label": "Organization", + "importPath": "spectragraph_types.organization", + "description": "spectragraph_types.organization", + "isExtraImport": true, + "detail": "spectragraph_types.organization", + "documentation": {} + }, + { + "label": "Organization", + "importPath": "spectragraph_types.organization", + "description": "spectragraph_types.organization", + "isExtraImport": true, + "detail": "spectragraph_types.organization", + "documentation": {} + }, + { + "label": "Organization", + "importPath": "spectragraph_types.organization", + "description": "spectragraph_types.organization", + "isExtraImport": true, + "detail": "spectragraph_types.organization", + "documentation": {} + }, + { + "label": "Organization", + "importPath": "spectragraph_types.organization", + "description": "spectragraph_types.organization", + "isExtraImport": true, + "detail": "spectragraph_types.organization", + "documentation": {} + }, + { + "label": "Organization", + "importPath": "spectragraph_types.organization", + "description": "spectragraph_types.organization", + "isExtraImport": true, + "detail": "spectragraph_types.organization", + "documentation": {} + }, + { + "label": "Location", + "importPath": "spectragraph_types.address", + "description": "spectragraph_types.address", + "isExtraImport": true, + "detail": "spectragraph_types.address", + "documentation": {} + }, + { + "label": "Location", + "importPath": "spectragraph_types.address", + "description": "spectragraph_types.address", + "isExtraImport": true, + "detail": "spectragraph_types.address", + "documentation": {} + }, + { + "label": "Location", + "importPath": "spectragraph_types.address", + "description": "spectragraph_types.address", + "isExtraImport": true, + "detail": "spectragraph_types.address", + "documentation": {} + }, + { + "label": "Location", + "importPath": "spectragraph_types.address", + "description": "spectragraph_types.address", + "isExtraImport": true, + "detail": "spectragraph_types.address", + "documentation": {} + }, + { + "label": "WhoxyTool", + "importPath": "tools.network.whoxy", + "description": "tools.network.whoxy", + "isExtraImport": true, + "detail": "tools.network.whoxy", + "documentation": {} + }, + { + "label": "WhoxyTool", + "importPath": "tools.network.whoxy", + "description": "tools.network.whoxy", + "isExtraImport": true, + "detail": "tools.network.whoxy", + "documentation": {} + }, + { + "label": "WhoxyTool", + "importPath": "tools.network.whoxy", + "description": "tools.network.whoxy", + "isExtraImport": true, + "detail": "tools.network.whoxy", + "documentation": {} + }, + { + "label": "WhoxyTool", + "importPath": "tools.network.whoxy", + "description": "tools.network.whoxy", + "isExtraImport": true, + "detail": "tools.network.whoxy", + "documentation": {} + }, + { + "label": "WhoxyTool", + "importPath": "tools.network.whoxy", + "description": "tools.network.whoxy", + "isExtraImport": true, + "detail": "tools.network.whoxy", + "documentation": {} + }, + { + "label": "is_valid_domain", + "importPath": "spectragraph_transforms.utils", + "description": "spectragraph_transforms.utils", + "isExtraImport": true, + "detail": "spectragraph_transforms.utils", + "documentation": {} + }, + { + "label": "get_root_domain", + "importPath": "spectragraph_transforms.utils", + "description": "spectragraph_transforms.utils", + "isExtraImport": true, + "detail": "spectragraph_transforms.utils", + "documentation": {} + }, + { + "label": "SubfinderTool", + "importPath": "tools.network.subfinder", + "description": "tools.network.subfinder", + "isExtraImport": true, + "detail": "tools.network.subfinder", + "documentation": {} + }, + { + "label": "SubfinderTool", + "importPath": "tools.network.subfinder", + "description": "tools.network.subfinder", + "isExtraImport": true, + "detail": "tools.network.subfinder", + "documentation": {} + }, + { + "label": "Website", + "importPath": "spectragraph_types.website", + "description": "spectragraph_types.website", + "isExtraImport": true, + "detail": "spectragraph_types.website", + "documentation": {} + }, + { + "label": "Website", + "importPath": "spectragraph_types.website", + "description": "spectragraph_types.website", + "isExtraImport": true, + "detail": "spectragraph_types.website", + "documentation": {} + }, + { + "label": "Website", + "importPath": "spectragraph_types.website", + "description": "spectragraph_types.website", + "isExtraImport": true, + "detail": "spectragraph_types.website", + "documentation": {} + }, + { + "label": "Website", + "importPath": "spectragraph_types.website", + "description": "spectragraph_types.website", + "isExtraImport": true, + "detail": "spectragraph_types.website", + "documentation": {} + }, + { + "label": "Website", + "importPath": "spectragraph_types.website", + "description": "spectragraph_types.website", + "isExtraImport": true, + "detail": "spectragraph_types.website", + "documentation": {} + }, + { + "label": "Website", + "importPath": "spectragraph_types.website", + "description": "spectragraph_types.website", + "isExtraImport": true, + "detail": "spectragraph_types.website", + "documentation": {} + }, + { + "label": "Website", + "importPath": "spectragraph_types.website", + "description": "spectragraph_types.website", + "isExtraImport": true, + "detail": "spectragraph_types.website", + "documentation": {} + }, + { + "label": "whois", + "kind": 6, + "isExtraImport": true, + "importPath": "whois", + "description": "whois", + "detail": "whois", + "documentation": {} + }, + { + "label": "Whois", + "importPath": "spectragraph_types.whois", + "description": "spectragraph_types.whois", + "isExtraImport": true, + "detail": "spectragraph_types.whois", + "documentation": {} + }, + { + "label": "Email", + "importPath": "spectragraph_types.email", + "description": "spectragraph_types.email", + "isExtraImport": true, + "detail": "spectragraph_types.email", + "documentation": {} + }, + { + "label": "Email", + "importPath": "spectragraph_types.email", + "description": "spectragraph_types.email", + "isExtraImport": true, + "detail": "spectragraph_types.email", + "documentation": {} + }, + { + "label": "Email", + "importPath": "spectragraph_types.email", + "description": "spectragraph_types.email", + "isExtraImport": true, + "detail": "spectragraph_types.email", + "documentation": {} + }, + { + "label": "Email", + "importPath": "spectragraph_types.email", + "description": "spectragraph_types.email", + "isExtraImport": true, + "detail": "spectragraph_types.email", + "documentation": {} + }, + { + "label": "Email", + "importPath": "spectragraph_types.email", + "description": "spectragraph_types.email", + "isExtraImport": true, + "detail": "spectragraph_types.email", + "documentation": {} + }, + { + "label": "Email", + "importPath": "spectragraph_types.email", + "description": "spectragraph_types.email", + "isExtraImport": true, + "detail": "spectragraph_types.email", + "documentation": {} + }, + { + "label": "Email", + "importPath": "spectragraph_types.email", + "description": "spectragraph_types.email", + "isExtraImport": true, + "detail": "spectragraph_types.email", + "documentation": {} + }, + { + "label": "Gravatar", + "importPath": "spectragraph_types.gravatar", + "description": "spectragraph_types.gravatar", + "isExtraImport": true, + "detail": "spectragraph_types.gravatar", + "documentation": {} + }, + { + "label": "Gravatar", + "importPath": "spectragraph_types.gravatar", + "description": "spectragraph_types.gravatar", + "isExtraImport": true, + "detail": "spectragraph_types.gravatar", + "documentation": {} + }, + { + "label": "Breach", + "importPath": "spectragraph_types.breach", + "description": "spectragraph_types.breach", + "isExtraImport": true, + "detail": "spectragraph_types.breach", + "documentation": {} + }, + { + "label": "Breach", + "importPath": "spectragraph_types.breach", + "description": "spectragraph_types.breach", + "isExtraImport": true, + "detail": "spectragraph_types.breach", + "documentation": {} + }, + { + "label": "Breach", + "importPath": "spectragraph_types.breach", + "description": "spectragraph_types.breach", + "isExtraImport": true, + "detail": "spectragraph_types.breach", + "documentation": {} + }, + { + "label": "SireneTool", + "importPath": "tools.organizations.sirene", + "description": "tools.organizations.sirene", + "isExtraImport": true, + "detail": "tools.organizations.sirene", + "documentation": {} + }, + { + "label": "SireneTool", + "importPath": "tools.organizations.sirene", + "description": "tools.organizations.sirene", + "isExtraImport": true, + "detail": "tools.organizations.sirene", + "documentation": {} + }, + { + "label": "SireneTool", + "importPath": "tools.organizations.sirene", + "description": "tools.organizations.sirene", + "isExtraImport": true, + "detail": "tools.organizations.sirene", + "documentation": {} + }, + { + "label": "hibpwned", + "kind": 6, + "isExtraImport": true, + "importPath": "hibpwned", + "description": "hibpwned", + "detail": "hibpwned", + "documentation": {} + }, + { + "label": "aiohttp", + "kind": 6, + "isExtraImport": true, + "importPath": "aiohttp", + "description": "aiohttp", + "detail": "aiohttp", + "documentation": {} + }, + { + "label": "subprocess", + "kind": 6, + "isExtraImport": true, + "importPath": "subprocess", + "description": "subprocess", + "detail": "subprocess", + "documentation": {} + }, + { + "label": "Phone", + "importPath": "spectragraph_types.phone", + "description": "spectragraph_types.phone", + "isExtraImport": true, + "detail": "spectragraph_types.phone", + "documentation": {} + }, + { + "label": "Phone", + "importPath": "spectragraph_types.phone", + "description": "spectragraph_types.phone", + "isExtraImport": true, + "detail": "spectragraph_types.phone", + "documentation": {} + }, + { + "label": "Phone", + "importPath": "spectragraph_types.phone", + "description": "spectragraph_types.phone", + "isExtraImport": true, + "detail": "spectragraph_types.phone", + "documentation": {} + }, + { + "label": "httpx", + "kind": 6, + "isExtraImport": true, + "importPath": "httpx", + "description": "httpx", + "detail": "httpx", + "documentation": {} + }, + { + "label": "TransformError", + "importPath": "spectragraph_core.exceptions", + "description": "spectragraph_core.exceptions", + "isExtraImport": true, + "detail": "spectragraph_core.exceptions", + "documentation": {} + }, + { + "label": "TransformError", + "importPath": "spectragraph_core.exceptions", + "description": "spectragraph_core.exceptions", + "isExtraImport": true, + "detail": "spectragraph_core.exceptions", + "documentation": {} + }, + { + "label": "SocialProfile", + "importPath": "spectragraph_types.social", + "description": "spectragraph_types.social", + "isExtraImport": true, + "detail": "spectragraph_types.social", + "documentation": {} + }, + { + "label": "SocialProfile", + "importPath": "spectragraph_types.social", + "description": "spectragraph_types.social", + "isExtraImport": true, + "detail": "spectragraph_types.social", + "documentation": {} + }, + { + "label": "SocialProfile", + "importPath": "spectragraph_types.social", + "description": "spectragraph_types.social", + "isExtraImport": true, + "detail": "spectragraph_types.social", + "documentation": {} + }, + { + "label": "ReconCrawlTool", + "importPath": "tools.network.reconcrawl", + "description": "tools.network.reconcrawl", + "isExtraImport": true, + "detail": "tools.network.reconcrawl", + "documentation": {} + }, + { + "label": "ReconCrawlTool", + "importPath": "tools.network.reconcrawl", + "description": "tools.network.reconcrawl", + "isExtraImport": true, + "detail": "tools.network.reconcrawl", + "documentation": {} + }, + { + "label": "Crawler", + "importPath": "reconspread", + "description": "reconspread", + "isExtraImport": true, + "detail": "reconspread", + "documentation": {} + }, + { + "label": "Phrase", + "importPath": "spectragraph_types.phrase", + "description": "spectragraph_types.phrase", + "isExtraImport": true, + "detail": "spectragraph_types.phrase", + "documentation": {} + }, + { + "label": "BeautifulSoup", + "importPath": "bs4", + "description": "bs4", + "isExtraImport": true, + "detail": "bs4", + "documentation": {} + }, + { + "label": "WebTracker", + "importPath": "spectragraph_types.web_tracker", + "description": "spectragraph_types.web_tracker", + "isExtraImport": true, + "detail": "spectragraph_types.web_tracker", + "documentation": {} + }, + { + "label": "TrackingCodeExtractor", + "importPath": "recontrack", + "description": "recontrack", + "isExtraImport": true, + "detail": "recontrack", + "documentation": {} + }, + { + "label": "from_env", + "importPath": "docker", + "description": "docker", + "isExtraImport": true, + "detail": "docker", + "documentation": {} + }, + { + "label": "DockerClient", + "importPath": "docker", + "description": "docker", + "isExtraImport": true, + "detail": "docker", + "documentation": {} + }, + { + "label": "ImageNotFound", + "importPath": "docker.errors", + "description": "docker.errors", + "isExtraImport": true, + "detail": "docker.errors", + "documentation": {} + }, + { + "label": "APIError", + "importPath": "docker.errors", + "description": "docker.errors", + "isExtraImport": true, + "detail": "docker.errors", + "documentation": {} + }, + { + "label": "DockerException", + "importPath": "docker.errors", + "description": "docker.errors", + "isExtraImport": true, + "detail": "docker.errors", + "documentation": {} + }, + { + "label": "HttpxTool", + "importPath": "tools.network.httpx", + "description": "tools.network.httpx", + "isExtraImport": true, + "detail": "tools.network.httpx", + "documentation": {} + }, + { + "label": "CryptoWalletAddressToNFTs", + "importPath": "spectragraph_transforms.crypto.wallet_to_nfts", + "description": "spectragraph_transforms.crypto.wallet_to_nfts", + "isExtraImport": true, + "detail": "spectragraph_transforms.crypto.wallet_to_nfts", + "documentation": {} + }, + { + "label": "CryptoWalletAddressToTransactions", + "importPath": "spectragraph_transforms.crypto.wallet_to_transactions", + "description": "spectragraph_transforms.crypto.wallet_to_transactions", + "isExtraImport": true, + "detail": "spectragraph_transforms.crypto.wallet_to_transactions", + "documentation": {} + }, + { + "label": "ResolveTransform", + "importPath": "spectragraph_transforms.domains.resolve", + "description": "spectragraph_transforms.domains.resolve", + "isExtraImport": true, + "detail": "spectragraph_transforms.domains.resolve", + "documentation": {} + }, + { + "label": "ResolveTransform", + "importPath": "spectragraph_transforms.domains.resolve", + "description": "spectragraph_transforms.domains.resolve", + "isExtraImport": true, + "detail": "spectragraph_transforms.domains.resolve", + "documentation": {} + }, + { + "label": "SubdomainTransform", + "importPath": "spectragraph_transforms.domains.subdomains", + "description": "spectragraph_transforms.domains.subdomains", + "isExtraImport": true, + "detail": "spectragraph_transforms.domains.subdomains", + "documentation": {} + }, + { + "label": "DomainToHistoryTransform", + "importPath": "spectragraph_transforms.domain.to_history", + "description": "spectragraph_transforms.domain.to_history", + "isExtraImport": true, + "detail": "spectragraph_transforms.domain.to_history", + "documentation": {} + }, + { + "label": "DomainToHistoryTransform", + "importPath": "spectragraph_transforms.domain.to_history", + "description": "spectragraph_transforms.domain.to_history", + "isExtraImport": true, + "detail": "spectragraph_transforms.domain.to_history", + "documentation": {} + }, + { + "label": "WhoisTransform", + "importPath": "spectragraph_transforms.domains.whois", + "description": "spectragraph_transforms.domains.whois", + "isExtraImport": true, + "detail": "spectragraph_transforms.domains.whois", + "documentation": {} + }, + { + "label": "EmailToGravatarTransform", + "importPath": "spectragraph_transforms.emails.to_gravatar", + "description": "spectragraph_transforms.emails.to_gravatar", + "isExtraImport": true, + "detail": "spectragraph_transforms.emails.to_gravatar", + "documentation": {} + }, + { + "label": "EmailToBreachesTransform", + "importPath": "spectragraph_transforms.emails.to_leaks", + "description": "spectragraph_transforms.emails.to_leaks", + "isExtraImport": true, + "detail": "spectragraph_transforms.emails.to_leaks", + "documentation": {} + }, + { + "label": "AsnToCidrsTransform", + "importPath": "spectragraph_transforms.ips.asn_to_cidrs", + "description": "spectragraph_transforms.ips.asn_to_cidrs", + "isExtraImport": true, + "detail": "spectragraph_transforms.ips.asn_to_cidrs", + "documentation": {} + }, + { + "label": "CidrToIpsTransform", + "importPath": "spectragraph_transforms.ips.cidr_to_ips", + "description": "spectragraph_transforms.ips.cidr_to_ips", + "isExtraImport": true, + "detail": "spectragraph_transforms.ips.cidr_to_ips", + "documentation": {} + }, + { + "label": "TestLogger", + "importPath": "tests.logger", + "description": "tests.logger", + "isExtraImport": true, + "detail": "tests.logger", + "documentation": {} + }, + { + "label": "TestLogger", + "importPath": "tests.logger", + "description": "tests.logger", + "isExtraImport": true, + "detail": "tests.logger", + "documentation": {} + }, + { + "label": "TestLogger", + "importPath": "tests.logger", + "description": "tests.logger", + "isExtraImport": true, + "detail": "tests.logger", + "documentation": {} + }, + { + "label": "IpToAsnTransform", + "importPath": "spectragraph_transforms.ips.ip_to_asn", + "description": "spectragraph_transforms.ips.ip_to_asn", + "isExtraImport": true, + "detail": "spectragraph_transforms.ips.ip_to_asn", + "documentation": {} + }, + { + "label": "IpToInfosTransform", + "importPath": "spectragraph_transforms.ips.geolocation", + "description": "spectragraph_transforms.ips.geolocation", + "isExtraImport": true, + "detail": "spectragraph_transforms.ips.geolocation", + "documentation": {} + }, + { + "label": "OrgToInfosTransform", + "importPath": "spectragraph_transforms.organizations.to_infos", + "description": "spectragraph_transforms.organizations.to_infos", + "isExtraImport": true, + "detail": "spectragraph_transforms.organizations.to_infos", + "documentation": {} + }, + { + "label": "MaigretTransform", + "importPath": "spectragraph_transforms.socials.maigret", + "description": "spectragraph_transforms.socials.maigret", + "isExtraImport": true, + "detail": "spectragraph_transforms.socials.maigret", + "documentation": {} + }, + { + "label": "WebsiteToLinks", + "importPath": "spectragraph_transforms.websites.to_links", + "description": "spectragraph_transforms.websites.to_links", + "isExtraImport": true, + "detail": "spectragraph_transforms.websites.to_links", + "documentation": {} + }, + { + "label": "GitHubRepoTransform", + "importPath": "spectragraph_transforms.social.github_repo", + "description": "spectragraph_transforms.social.github_repo", + "isExtraImport": true, + "detail": "spectragraph_transforms.social.github_repo", + "documentation": {} + }, + { + "label": "GitHubRepoParams", + "importPath": "spectragraph_transforms.social.github_repo", + "description": "spectragraph_transforms.social.github_repo", + "isExtraImport": true, + "detail": "spectragraph_transforms.social.github_repo", + "documentation": {} + }, + { + "label": "GitHubRepoTransform", + "importPath": "spectragraph_transforms.social.github_repo", + "description": "spectragraph_transforms.social.github_repo", + "isExtraImport": true, + "detail": "spectragraph_transforms.social.github_repo", + "documentation": {} + }, + { + "label": "IndividualToDomainsTransform", + "importPath": "spectragraph_transforms.individual.to_domains", + "description": "spectragraph_transforms.individual.to_domains", + "isExtraImport": true, + "detail": "spectragraph_transforms.individual.to_domains", + "documentation": {} + }, + { + "label": "EmailToDomainsTransform", + "importPath": "spectragraph_transforms.email.to_domains", + "description": "spectragraph_transforms.email.to_domains", + "isExtraImport": true, + "detail": "spectragraph_transforms.email.to_domains", + "documentation": {} + }, + { + "label": "CryptoWalletAddressToNFTs", + "importPath": "spectragraph_transforms.crypto.to_nfts", + "description": "spectragraph_transforms.crypto.to_nfts", + "isExtraImport": true, + "detail": "spectragraph_transforms.crypto.to_nfts", + "documentation": {} + }, + { + "label": "CryptoWalletAddressToTransactions", + "importPath": "spectragraph_transforms.crypto.to_transactions", + "description": "spectragraph_transforms.crypto.to_transactions", + "isExtraImport": true, + "detail": "spectragraph_transforms.crypto.to_transactions", + "documentation": {} + }, + { + "label": "EmailToBreachesTransform", + "importPath": "spectragraph_transforms.email.to_leaks", + "description": "spectragraph_transforms.email.to_leaks", + "isExtraImport": true, + "detail": "spectragraph_transforms.email.to_leaks", + "documentation": {} + }, + { + "label": "upgrade", + "kind": 2, + "importPath": "spectragraph-api.alembic.versions.0160b0f70a02_add_context_to_chat_message", + "description": "spectragraph-api.alembic.versions.0160b0f70a02_add_context_to_chat_message", + "peekOfCode": "def upgrade() -> None:\n \"\"\"Upgrade schema.\"\"\"\n # ### commands auto generated by Alembic - please adjust! ###\n op.add_column('messages', sa.Column('context', sa.JSON(), nullable=True))\n # ### end Alembic commands ###\ndef downgrade() -> None:\n \"\"\"Downgrade schema.\"\"\"\n # ### commands auto generated by Alembic - please adjust! ###\n op.drop_column('messages', 'context')\n # ### end Alembic commands ###", + "detail": "spectragraph-api.alembic.versions.0160b0f70a02_add_context_to_chat_message", + "documentation": {} + }, + { + "label": "downgrade", + "kind": 2, + "importPath": "spectragraph-api.alembic.versions.0160b0f70a02_add_context_to_chat_message", + "description": "spectragraph-api.alembic.versions.0160b0f70a02_add_context_to_chat_message", + "peekOfCode": "def downgrade() -> None:\n \"\"\"Downgrade schema.\"\"\"\n # ### commands auto generated by Alembic - please adjust! ###\n op.drop_column('messages', 'context')\n # ### end Alembic commands ###", + "detail": "spectragraph-api.alembic.versions.0160b0f70a02_add_context_to_chat_message", + "documentation": {} + }, + { + "label": "upgrade", + "kind": 2, + "importPath": "spectragraph-api.alembic.versions.0ab8ee0a782c_add_cascade_delete_to_messages", + "description": "spectragraph-api.alembic.versions.0ab8ee0a782c_add_cascade_delete_to_messages", + "peekOfCode": "def upgrade() -> None:\n \"\"\"Upgrade schema.\"\"\"\n # ### commands auto generated by Alembic - please adjust! ###\n pass\n # ### end Alembic commands ###\ndef downgrade() -> None:\n \"\"\"Downgrade schema.\"\"\"\n # ### commands auto generated by Alembic - please adjust! ###\n pass\n # ### end Alembic commands ###", + "detail": "spectragraph-api.alembic.versions.0ab8ee0a782c_add_cascade_delete_to_messages", + "documentation": {} + }, + { + "label": "downgrade", + "kind": 2, + "importPath": "spectragraph-api.alembic.versions.0ab8ee0a782c_add_cascade_delete_to_messages", + "description": "spectragraph-api.alembic.versions.0ab8ee0a782c_add_cascade_delete_to_messages", + "peekOfCode": "def downgrade() -> None:\n \"\"\"Downgrade schema.\"\"\"\n # ### commands auto generated by Alembic - please adjust! ###\n pass\n # ### end Alembic commands ###", + "detail": "spectragraph-api.alembic.versions.0ab8ee0a782c_add_cascade_delete_to_messages", + "documentation": {} + }, + { + "label": "upgrade", + "kind": 2, + "importPath": "spectragraph-api.alembic.versions.1098b7a5eabc_change_keys_structure_with_iv_salt_", + "description": "spectragraph-api.alembic.versions.1098b7a5eabc_change_keys_structure_with_iv_salt_", + "peekOfCode": "def upgrade() -> None:\n \"\"\"Upgrade schema.\"\"\"\n op.execute(\"TRUNCATE TABLE keys\")\n # ### commands auto generated by Alembic - please adjust! ###\n op.add_column('keys', sa.Column('ciphertext', sa.LargeBinary(), nullable=False))\n op.add_column('keys', sa.Column('iv', sa.LargeBinary(), nullable=False))\n op.add_column('keys', sa.Column('salt', sa.LargeBinary(), nullable=False))\n op.add_column('keys', sa.Column('key_version', sa.String(), nullable=False))\n op.alter_column('keys', 'owner_id',\n existing_type=sa.UUID(),", + "detail": "spectragraph-api.alembic.versions.1098b7a5eabc_change_keys_structure_with_iv_salt_", + "documentation": {} + }, + { + "label": "downgrade", + "kind": 2, + "importPath": "spectragraph-api.alembic.versions.1098b7a5eabc_change_keys_structure_with_iv_salt_", + "description": "spectragraph-api.alembic.versions.1098b7a5eabc_change_keys_structure_with_iv_salt_", + "peekOfCode": "def downgrade() -> None:\n \"\"\"Downgrade schema.\"\"\"\n # ### commands auto generated by Alembic - please adjust! ###\n op.add_column('keys', sa.Column('encrypted_key', sa.VARCHAR(), autoincrement=False, nullable=False))\n op.alter_column('keys', 'created_at',\n existing_type=postgresql.TIMESTAMP(timezone=True),\n nullable=True,\n existing_server_default=sa.text('now()'))\n op.alter_column('keys', 'owner_id',\n existing_type=sa.UUID(),", + "detail": "spectragraph-api.alembic.versions.1098b7a5eabc_change_keys_structure_with_iv_salt_", + "documentation": {} + }, + { + "label": "upgrade", + "kind": 2, + "importPath": "spectragraph-api.alembic.versions.1d0f26dbbef5_add_passive_delete_v2", + "description": "spectragraph-api.alembic.versions.1d0f26dbbef5_add_passive_delete_v2", + "peekOfCode": "def upgrade() -> None:\n \"\"\"Upgrade schema.\"\"\"\n # ### commands auto generated by Alembic - please adjust! ###\n pass\n # ### end Alembic commands ###\ndef downgrade() -> None:\n \"\"\"Downgrade schema.\"\"\"\n # ### commands auto generated by Alembic - please adjust! ###\n pass\n # ### end Alembic commands ###", + "detail": "spectragraph-api.alembic.versions.1d0f26dbbef5_add_passive_delete_v2", + "documentation": {} + }, + { + "label": "downgrade", + "kind": 2, + "importPath": "spectragraph-api.alembic.versions.1d0f26dbbef5_add_passive_delete_v2", + "description": "spectragraph-api.alembic.versions.1d0f26dbbef5_add_passive_delete_v2", + "peekOfCode": "def downgrade() -> None:\n \"\"\"Downgrade schema.\"\"\"\n # ### commands auto generated by Alembic - please adjust! ###\n pass\n # ### end Alembic commands ###", + "detail": "spectragraph-api.alembic.versions.1d0f26dbbef5_add_passive_delete_v2", + "documentation": {} + }, + { + "label": "upgrade", + "kind": 2, + "importPath": "spectragraph-api.alembic.versions.2da47dbd4a52_add_cascade_delete_to_scans_and_logs", + "description": "spectragraph-api.alembic.versions.2da47dbd4a52_add_cascade_delete_to_scans_and_logs", + "peekOfCode": "def upgrade() -> None:\n \"\"\"Upgrade schema.\"\"\"\n # ### commands auto generated by Alembic - please adjust! ###\n op.alter_column('scans', 'status',\n existing_type=postgresql.ENUM('PENDING', 'RUNNING', 'COMPLETED', 'FAILED', name='transformstatus'),\n nullable=True)\n op.drop_constraint('scans_sketch_id_fkey', 'scans', type_='foreignkey')\n op.create_foreign_key(None, 'scans', 'sketches', ['sketch_id'], ['id'], onupdate='CASCADE', ondelete='CASCADE')\n # ### end Alembic commands ###\ndef downgrade() -> None:", + "detail": "spectragraph-api.alembic.versions.2da47dbd4a52_add_cascade_delete_to_scans_and_logs", + "documentation": {} + }, + { + "label": "downgrade", + "kind": 2, + "importPath": "spectragraph-api.alembic.versions.2da47dbd4a52_add_cascade_delete_to_scans_and_logs", + "description": "spectragraph-api.alembic.versions.2da47dbd4a52_add_cascade_delete_to_scans_and_logs", + "peekOfCode": "def downgrade() -> None:\n \"\"\"Downgrade schema.\"\"\"\n # ### commands auto generated by Alembic - please adjust! ###\n op.drop_constraint(None, 'scans', type_='foreignkey')\n op.create_foreign_key('scans_sketch_id_fkey', 'scans', 'sketches', ['sketch_id'], ['id'])\n op.alter_column('scans', 'status',\n existing_type=postgresql.ENUM('PENDING', 'RUNNING', 'COMPLETED', 'FAILED', name='transformstatus'),\n nullable=False)\n # ### end Alembic commands ###", + "detail": "spectragraph-api.alembic.versions.2da47dbd4a52_add_cascade_delete_to_scans_and_logs", + "documentation": {} + }, + { + "label": "upgrade", + "kind": 2, + "importPath": "spectragraph-api.alembic.versions.40ece72583b7_add_email_and_hashed_password_to_profile", + "description": "spectragraph-api.alembic.versions.40ece72583b7_add_email_and_hashed_password_to_profile", + "peekOfCode": "def upgrade() -> None:\n \"\"\"Upgrade schema.\"\"\"\n # ### commands auto generated by Alembic - please adjust! ###\n op.add_column('profiles', sa.Column('email', sa.String(), nullable=False))\n op.add_column('profiles', sa.Column('hashed_password', sa.String(), nullable=False))\n op.add_column('profiles', sa.Column('is_active', sa.Boolean(), nullable=False))\n op.create_unique_constraint(None, 'profiles', ['email'])\n # ### end Alembic commands ###\ndef downgrade() -> None:\n \"\"\"Downgrade schema.\"\"\"", + "detail": "spectragraph-api.alembic.versions.40ece72583b7_add_email_and_hashed_password_to_profile", + "documentation": {} + }, + { + "label": "downgrade", + "kind": 2, + "importPath": "spectragraph-api.alembic.versions.40ece72583b7_add_email_and_hashed_password_to_profile", + "description": "spectragraph-api.alembic.versions.40ece72583b7_add_email_and_hashed_password_to_profile", + "peekOfCode": "def downgrade() -> None:\n \"\"\"Downgrade schema.\"\"\"\n # ### commands auto generated by Alembic - please adjust! ###\n op.drop_constraint(None, 'profiles', type_='unique')\n op.drop_column('profiles', 'is_active')\n op.drop_column('profiles', 'hashed_password')\n op.drop_column('profiles', 'email')\n # ### end Alembic commands ###", + "detail": "spectragraph-api.alembic.versions.40ece72583b7_add_email_and_hashed_password_to_profile", + "documentation": {} + }, + { + "label": "upgrade", + "kind": 2, + "importPath": "spectragraph-api.alembic.versions.661ff8ef4425_rename_transforms_to_flows", + "description": "spectragraph-api.alembic.versions.661ff8ef4425_rename_transforms_to_flows", + "peekOfCode": "def upgrade() -> None:\n \"\"\"Upgrade schema.\"\"\"\n # Rename the table from 'transforms' to 'flows'\n op.rename_table('transforms', 'flows')\n # Rename the column from 'transform_schema' to 'flow_schema'\n op.alter_column('flows', 'transform_schema', new_column_name='flow_schema')\ndef downgrade() -> None:\n \"\"\"Downgrade schema.\"\"\"\n # Rename the column back from 'flow_schema' to 'transform_schema'\n op.alter_column('flows', 'flow_schema', new_column_name='transform_schema')", + "detail": "spectragraph-api.alembic.versions.661ff8ef4425_rename_transforms_to_flows", + "documentation": {} + }, + { + "label": "downgrade", + "kind": 2, + "importPath": "spectragraph-api.alembic.versions.661ff8ef4425_rename_transforms_to_flows", + "description": "spectragraph-api.alembic.versions.661ff8ef4425_rename_transforms_to_flows", + "peekOfCode": "def downgrade() -> None:\n \"\"\"Downgrade schema.\"\"\"\n # Rename the column back from 'flow_schema' to 'transform_schema'\n op.alter_column('flows', 'flow_schema', new_column_name='transform_schema')\n # Rename the table back from 'flows' to 'transforms'\n op.rename_table('flows', 'transforms')", + "detail": "spectragraph-api.alembic.versions.661ff8ef4425_rename_transforms_to_flows", + "documentation": {} + }, + { + "label": "upgrade", + "kind": 2, + "importPath": "spectragraph-api.alembic.versions.6be831edfda7_add_investigation_roles_permissions", + "description": "spectragraph-api.alembic.versions.6be831edfda7_add_investigation_roles_permissions", + "peekOfCode": "def upgrade() -> None:\n \"\"\"Upgrade schema.\"\"\"\n # ### commands auto generated by Alembic - please adjust! ###\n op.add_column('investigation_user_roles', sa.Column('roles', postgresql.ARRAY(sa.Enum('OWNER', 'EDITOR', 'VIEWER', name='role_enum', create_constraint=True)), server_default='{}', nullable=False))\n op.drop_column('investigation_user_roles', 'role')\n # ### end Alembic commands ###\ndef downgrade() -> None:\n \"\"\"Downgrade schema.\"\"\"\n # ### commands auto generated by Alembic - please adjust! ###\n op.add_column('investigation_user_roles', sa.Column('role', postgresql.ENUM('OWNER', 'EDITOR', 'VIEWER', name='role_enum'), autoincrement=False, nullable=False))", + "detail": "spectragraph-api.alembic.versions.6be831edfda7_add_investigation_roles_permissions", + "documentation": {} + }, + { + "label": "downgrade", + "kind": 2, + "importPath": "spectragraph-api.alembic.versions.6be831edfda7_add_investigation_roles_permissions", + "description": "spectragraph-api.alembic.versions.6be831edfda7_add_investigation_roles_permissions", + "peekOfCode": "def downgrade() -> None:\n \"\"\"Downgrade schema.\"\"\"\n # ### commands auto generated by Alembic - please adjust! ###\n op.add_column('investigation_user_roles', sa.Column('role', postgresql.ENUM('OWNER', 'EDITOR', 'VIEWER', name='role_enum'), autoincrement=False, nullable=False))\n op.drop_column('investigation_user_roles', 'roles')\n # ### end Alembic commands ###", + "detail": "spectragraph-api.alembic.versions.6be831edfda7_add_investigation_roles_permissions", + "documentation": {} + }, + { + "label": "upgrade", + "kind": 2, + "importPath": "spectragraph-api.alembic.versions.6dfa83113ad7_change_content_colum_of_log_to_json", + "description": "spectragraph-api.alembic.versions.6dfa83113ad7_change_content_colum_of_log_to_json", + "peekOfCode": "def upgrade() -> None:\n \"\"\"Upgrade schema.\"\"\"\n # 1. Crée le nouveau type ENUM\n op.execute(\"\"\"\n CREATE TYPE eventlevel AS ENUM (\n 'INFO', 'WARNING', 'FAILED', 'SUCCESS', 'DEBUG',\n 'PENDING', 'RUNNING', 'COMPLETED', 'GRAPH_APPEND'\n )\n \"\"\")\n # 2. Change 'logs.content' de TEXT à JSONB", + "detail": "spectragraph-api.alembic.versions.6dfa83113ad7_change_content_colum_of_log_to_json", + "documentation": {} + }, + { + "label": "downgrade", + "kind": 2, + "importPath": "spectragraph-api.alembic.versions.6dfa83113ad7_change_content_colum_of_log_to_json", + "description": "spectragraph-api.alembic.versions.6dfa83113ad7_change_content_colum_of_log_to_json", + "peekOfCode": "def downgrade() -> None:\n \"\"\"Downgrade schema.\"\"\"\n # 1. Revert 'scans.status' to old ENUM type\n op.execute(\"\"\"\n ALTER TABLE scans\n ALTER COLUMN status TYPE transformstatus\n USING status::text::transformstatus\n \"\"\")\n # 2. Revert 'logs.type' back to VARCHAR\n op.execute(\"\"\"", + "detail": "spectragraph-api.alembic.versions.6dfa83113ad7_change_content_colum_of_log_to_json", + "documentation": {} + }, + { + "label": "upgrade", + "kind": 2, + "importPath": "spectragraph-api.alembic.versions.6e49acfb3816_add_investigation_roles_permissions", + "description": "spectragraph-api.alembic.versions.6e49acfb3816_add_investigation_roles_permissions", + "peekOfCode": "def upgrade() -> None:\n \"\"\"Upgrade schema.\"\"\"\n # ### commands auto generated by Alembic - please adjust! ###\n op.create_table('investigation_user_roles',\n sa.Column('id', sa.UUID(), nullable=False),\n sa.Column('user_id', sa.UUID(), nullable=False),\n sa.Column('investigation_id', sa.UUID(), nullable=False),\n sa.Column('role', sa.Enum('OWNER', 'EDITOR', 'VIEWER', name='role_enum', create_constraint=True), nullable=False),\n sa.ForeignKeyConstraint(['investigation_id'], ['investigations.id'], onupdate='CASCADE', ondelete='CASCADE'),\n sa.ForeignKeyConstraint(['user_id'], ['profiles.id'], onupdate='CASCADE', ondelete='CASCADE'),", + "detail": "spectragraph-api.alembic.versions.6e49acfb3816_add_investigation_roles_permissions", + "documentation": {} + }, + { + "label": "downgrade", + "kind": 2, + "importPath": "spectragraph-api.alembic.versions.6e49acfb3816_add_investigation_roles_permissions", + "description": "spectragraph-api.alembic.versions.6e49acfb3816_add_investigation_roles_permissions", + "peekOfCode": "def downgrade() -> None:\n \"\"\"Downgrade schema.\"\"\"\n # ### commands auto generated by Alembic - please adjust! ###\n op.create_table('investigations_profiles',\n sa.Column('id', sa.UUID(), autoincrement=False, nullable=False),\n sa.Column('created_at', postgresql.TIMESTAMP(timezone=True), server_default=sa.text('now()'), autoincrement=False, nullable=True),\n sa.Column('investigation_id', sa.UUID(), autoincrement=False, nullable=True),\n sa.Column('profile_id', sa.UUID(), autoincrement=False, nullable=True),\n sa.Column('role', sa.VARCHAR(), server_default=sa.text(\"'member'::character varying\"), autoincrement=False, nullable=True),\n sa.ForeignKeyConstraint(['investigation_id'], ['investigations.id'], name='investigations_profiles_investigation_id_fkey', onupdate='CASCADE', ondelete='CASCADE'),", + "detail": "spectragraph-api.alembic.versions.6e49acfb3816_add_investigation_roles_permissions", + "documentation": {} + }, + { + "label": "upgrade", + "kind": 2, + "importPath": "spectragraph-api.alembic.versions.71a3e5b4db2a_update_scan_status_enum", + "description": "spectragraph-api.alembic.versions.71a3e5b4db2a_update_scan_status_enum", + "peekOfCode": "def upgrade() -> None:\n \"\"\"Upgrade schema.\"\"\"\n # Create the enum type first using raw SQL to ensure it exists\n op.execute(\"CREATE TYPE transformstatus AS ENUM ('PENDING', 'RUNNING', 'COMPLETED', 'FAILED')\")\n # Add new columns\n op.add_column('scans', sa.Column('started_at', sa.DateTime(), nullable=True))\n op.add_column('scans', sa.Column('completed_at', sa.DateTime(), nullable=True))\n op.add_column('scans', sa.Column('error', sa.Text(), nullable=True))\n op.add_column('scans', sa.Column('details', sa.JSON(), nullable=True))\n # Add new status column with enum type", + "detail": "spectragraph-api.alembic.versions.71a3e5b4db2a_update_scan_status_enum", + "documentation": {} + }, + { + "label": "downgrade", + "kind": 2, + "importPath": "spectragraph-api.alembic.versions.71a3e5b4db2a_update_scan_status_enum", + "description": "spectragraph-api.alembic.versions.71a3e5b4db2a_update_scan_status_enum", + "peekOfCode": "def downgrade() -> None:\n \"\"\"Downgrade schema.\"\"\"\n # Add back old columns\n op.add_column('scans', sa.Column('created_at', postgresql.TIMESTAMP(timezone=True), server_default=sa.text('now()'), autoincrement=False, nullable=True))\n op.add_column('scans', sa.Column('results', postgresql.JSON(astext_type=sa.Text()), autoincrement=False, nullable=True))\n op.add_column('scans', sa.Column('values', postgresql.ARRAY(sa.TEXT()), autoincrement=False, nullable=True))\n # Add new VARCHAR status column\n op.add_column('scans', sa.Column('status_old', sa.String(), nullable=True))\n # Copy data from enum status to VARCHAR status\n op.execute(\"UPDATE scans SET status_old = status::VARCHAR\")", + "detail": "spectragraph-api.alembic.versions.71a3e5b4db2a_update_scan_status_enum", + "documentation": {} + }, + { + "label": "upgrade", + "kind": 2, + "importPath": "spectragraph-api.alembic.versions.76f5436251e3_add_relationship_between_investigations_", + "description": "spectragraph-api.alembic.versions.76f5436251e3_add_relationship_between_investigations_", + "peekOfCode": "def upgrade() -> None:\n \"\"\"Upgrade schema.\"\"\"\n # ### commands auto generated by Alembic - please adjust! ###\n pass\n # ### end Alembic commands ###\ndef downgrade() -> None:\n \"\"\"Downgrade schema.\"\"\"\n # ### commands auto generated by Alembic - please adjust! ###\n pass\n # ### end Alembic commands ###", + "detail": "spectragraph-api.alembic.versions.76f5436251e3_add_relationship_between_investigations_", + "documentation": {} + }, + { + "label": "downgrade", + "kind": 2, + "importPath": "spectragraph-api.alembic.versions.76f5436251e3_add_relationship_between_investigations_", + "description": "spectragraph-api.alembic.versions.76f5436251e3_add_relationship_between_investigations_", + "peekOfCode": "def downgrade() -> None:\n \"\"\"Downgrade schema.\"\"\"\n # ### commands auto generated by Alembic - please adjust! ###\n pass\n # ### end Alembic commands ###", + "detail": "spectragraph-api.alembic.versions.76f5436251e3_add_relationship_between_investigations_", + "documentation": {} + }, + { + "label": "upgrade", + "kind": 2, + "importPath": "spectragraph-api.alembic.versions.8173aba964e7_add_custom_types_table", + "description": "spectragraph-api.alembic.versions.8173aba964e7_add_custom_types_table", + "peekOfCode": "def upgrade() -> None:\n \"\"\"Upgrade schema.\"\"\"\n # ### commands auto generated by Alembic - please adjust! ###\n op.create_table('custom_types',\n sa.Column('id', sa.UUID(), nullable=False),\n sa.Column('name', sa.Text(), nullable=False),\n sa.Column('owner_id', sa.UUID(), nullable=False),\n sa.Column('schema', postgresql.JSONB(astext_type=sa.Text()), nullable=False),\n sa.Column('status', sa.String(), server_default='draft', nullable=False),\n sa.Column('checksum', sa.String(), nullable=True),", + "detail": "spectragraph-api.alembic.versions.8173aba964e7_add_custom_types_table", + "documentation": {} + }, + { + "label": "downgrade", + "kind": 2, + "importPath": "spectragraph-api.alembic.versions.8173aba964e7_add_custom_types_table", + "description": "spectragraph-api.alembic.versions.8173aba964e7_add_custom_types_table", + "peekOfCode": "def downgrade() -> None:\n \"\"\"Downgrade schema.\"\"\"\n # ### commands auto generated by Alembic - please adjust! ###\n op.drop_index('idx_custom_types_status', table_name='custom_types')\n op.drop_index('idx_custom_types_owner_id', table_name='custom_types')\n op.drop_index('idx_custom_types_name', table_name='custom_types')\n op.drop_table('custom_types')\n # ### end Alembic commands ###", + "detail": "spectragraph-api.alembic.versions.8173aba964e7_add_custom_types_table", + "documentation": {} + }, + { + "label": "upgrade", + "kind": 2, + "importPath": "spectragraph-api.alembic.versions.8ac522441108_add_chat_and_chat_message", + "description": "spectragraph-api.alembic.versions.8ac522441108_add_chat_and_chat_message", + "peekOfCode": "def upgrade() -> None:\n \"\"\"Upgrade schema.\"\"\"\n # ### commands auto generated by Alembic - please adjust! ###\n op.create_table('chats',\n sa.Column('id', sa.UUID(), nullable=False),\n sa.Column('title', sa.Text(), nullable=False),\n sa.Column('description', sa.Text(), nullable=True),\n sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=True),\n sa.Column('last_updated_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=True),\n sa.Column('owner_id', sa.UUID(), nullable=True),", + "detail": "spectragraph-api.alembic.versions.8ac522441108_add_chat_and_chat_message", + "documentation": {} + }, + { + "label": "downgrade", + "kind": 2, + "importPath": "spectragraph-api.alembic.versions.8ac522441108_add_chat_and_chat_message", + "description": "spectragraph-api.alembic.versions.8ac522441108_add_chat_and_chat_message", + "peekOfCode": "def downgrade() -> None:\n \"\"\"Downgrade schema.\"\"\"\n # ### commands auto generated by Alembic - please adjust! ###\n op.drop_index('idx_messages_chat_id', table_name='messages')\n op.drop_table('messages')\n op.drop_index('idx_chats_owner_id', table_name='chats')\n op.drop_index('idx_chats_investigation_id', table_name='chats')\n op.drop_table('chats')\n # ### end Alembic commands ###", + "detail": "spectragraph-api.alembic.versions.8ac522441108_add_chat_and_chat_message", + "documentation": {} + }, + { + "label": "upgrade", + "kind": 2, + "importPath": "spectragraph-api.alembic.versions.8d0e12b68d1e_fix_backpopulate_issue", + "description": "spectragraph-api.alembic.versions.8d0e12b68d1e_fix_backpopulate_issue", + "peekOfCode": "def upgrade() -> None:\n \"\"\"Upgrade schema.\"\"\"\n # ### commands auto generated by Alembic - please adjust! ###\n pass\n # ### end Alembic commands ###\ndef downgrade() -> None:\n \"\"\"Downgrade schema.\"\"\"\n # ### commands auto generated by Alembic - please adjust! ###\n pass\n # ### end Alembic commands ###", + "detail": "spectragraph-api.alembic.versions.8d0e12b68d1e_fix_backpopulate_issue", + "documentation": {} + }, + { + "label": "downgrade", + "kind": 2, + "importPath": "spectragraph-api.alembic.versions.8d0e12b68d1e_fix_backpopulate_issue", + "description": "spectragraph-api.alembic.versions.8d0e12b68d1e_fix_backpopulate_issue", + "peekOfCode": "def downgrade() -> None:\n \"\"\"Downgrade schema.\"\"\"\n # ### commands auto generated by Alembic - please adjust! ###\n pass\n # ### end Alembic commands ###", + "detail": "spectragraph-api.alembic.versions.8d0e12b68d1e_fix_backpopulate_issue", + "documentation": {} + }, + { + "label": "upgrade", + "kind": 2, + "importPath": "spectragraph-api.alembic.versions.965b56353b4c_initial_migration", + "description": "spectragraph-api.alembic.versions.965b56353b4c_initial_migration", + "peekOfCode": "def upgrade() -> None:\n \"\"\"Upgrade schema.\"\"\"\n # ### commands auto generated by Alembic - please adjust! ###\n op.create_table('profiles',\n sa.Column('id', sa.UUID(), nullable=False),\n sa.Column('first_name', sa.Text(), nullable=True),\n sa.Column('last_name', sa.Text(), nullable=True),\n sa.Column('avatar_url', sa.Text(), nullable=True),\n sa.PrimaryKeyConstraint('id')\n )", + "detail": "spectragraph-api.alembic.versions.965b56353b4c_initial_migration", + "documentation": {} + }, + { + "label": "downgrade", + "kind": 2, + "importPath": "spectragraph-api.alembic.versions.965b56353b4c_initial_migration", + "description": "spectragraph-api.alembic.versions.965b56353b4c_initial_migration", + "peekOfCode": "def downgrade() -> None:\n \"\"\"Downgrade schema.\"\"\"\n # ### commands auto generated by Alembic - please adjust! ###\n op.drop_table('logs')\n op.drop_index('investigations_profiles_unique_profile_investigation', table_name='sketches_profiles')\n op.drop_index('idx_sketches_profiles_sketch_id', table_name='sketches_profiles')\n op.drop_index('idx_sketches_profiles_profile_id', table_name='sketches_profiles')\n op.drop_table('sketches_profiles')\n op.drop_index('idx_scans_sketch_id', table_name='scans')\n op.drop_table('scans')", + "detail": "spectragraph-api.alembic.versions.965b56353b4c_initial_migration", + "documentation": {} + }, + { + "label": "upgrade", + "kind": 2, + "importPath": "spectragraph-api.alembic.versions.9a3b9a199aa8_drop_third_party_keys_create_keys_table", + "description": "spectragraph-api.alembic.versions.9a3b9a199aa8_drop_third_party_keys_create_keys_table", + "peekOfCode": "def upgrade() -> None:\n \"\"\"Upgrade schema.\"\"\"\n # Drop the old third_party_keys table if it exists\n op.drop_table('third_party_keys')\n # Create the new keys table\n op.create_table('keys',\n sa.Column('id', postgresql.UUID(as_uuid=True), nullable=False),\n sa.Column('name', sa.String(), nullable=False),\n sa.Column('owner_id', postgresql.UUID(as_uuid=True), nullable=True),\n sa.Column('encrypted_key', sa.String(), nullable=False),", + "detail": "spectragraph-api.alembic.versions.9a3b9a199aa8_drop_third_party_keys_create_keys_table", + "documentation": {} + }, + { + "label": "downgrade", + "kind": 2, + "importPath": "spectragraph-api.alembic.versions.9a3b9a199aa8_drop_third_party_keys_create_keys_table", + "description": "spectragraph-api.alembic.versions.9a3b9a199aa8_drop_third_party_keys_create_keys_table", + "peekOfCode": "def downgrade() -> None:\n \"\"\"Downgrade schema.\"\"\"\n # Drop the keys table\n op.drop_index('idx_keys_service', table_name='keys')\n op.drop_index('idx_keys_owner_id', table_name='keys')\n op.drop_table('keys')\n # Recreate the third_party_keys table\n op.create_table('third_party_keys',\n sa.Column('id', postgresql.UUID(as_uuid=True), nullable=False),\n sa.Column('service', sa.String(), nullable=False),", + "detail": "spectragraph-api.alembic.versions.9a3b9a199aa8_drop_third_party_keys_create_keys_table", + "documentation": {} + }, + { + "label": "upgrade", + "kind": 2, + "importPath": "spectragraph-api.alembic.versions.afdaf9aa539c_add_passive_delete", + "description": "spectragraph-api.alembic.versions.afdaf9aa539c_add_passive_delete", + "peekOfCode": "def upgrade() -> None:\n \"\"\"Upgrade schema.\"\"\"\n # ### commands auto generated by Alembic - please adjust! ###\n pass\n # ### end Alembic commands ###\ndef downgrade() -> None:\n \"\"\"Downgrade schema.\"\"\"\n # ### commands auto generated by Alembic - please adjust! ###\n pass\n # ### end Alembic commands ###", + "detail": "spectragraph-api.alembic.versions.afdaf9aa539c_add_passive_delete", + "documentation": {} + }, + { + "label": "downgrade", + "kind": 2, + "importPath": "spectragraph-api.alembic.versions.afdaf9aa539c_add_passive_delete", + "description": "spectragraph-api.alembic.versions.afdaf9aa539c_add_passive_delete", + "peekOfCode": "def downgrade() -> None:\n \"\"\"Downgrade schema.\"\"\"\n # ### commands auto generated by Alembic - please adjust! ###\n pass\n # ### end Alembic commands ###", + "detail": "spectragraph-api.alembic.versions.afdaf9aa539c_add_passive_delete", + "documentation": {} + }, + { + "label": "upgrade", + "kind": 2, + "importPath": "spectragraph-api.alembic.versions.ba3d00e11612_add_cascade_delete_to_scans_and_logs", + "description": "spectragraph-api.alembic.versions.ba3d00e11612_add_cascade_delete_to_scans_and_logs", + "peekOfCode": "def upgrade() -> None:\n \"\"\"Upgrade schema.\"\"\"\n # ### commands auto generated by Alembic - please adjust! ###\n op.alter_column('scans', 'sketch_id',\n existing_type=sa.UUID(),\n nullable=True)\n # ### end Alembic commands ###\ndef downgrade() -> None:\n \"\"\"Downgrade schema.\"\"\"\n # ### commands auto generated by Alembic - please adjust! ###", + "detail": "spectragraph-api.alembic.versions.ba3d00e11612_add_cascade_delete_to_scans_and_logs", + "documentation": {} + }, + { + "label": "downgrade", + "kind": 2, + "importPath": "spectragraph-api.alembic.versions.ba3d00e11612_add_cascade_delete_to_scans_and_logs", + "description": "spectragraph-api.alembic.versions.ba3d00e11612_add_cascade_delete_to_scans_and_logs", + "peekOfCode": "def downgrade() -> None:\n \"\"\"Downgrade schema.\"\"\"\n # ### commands auto generated by Alembic - please adjust! ###\n op.alter_column('scans', 'sketch_id',\n existing_type=sa.UUID(),\n nullable=False)\n # ### end Alembic commands ###", + "detail": "spectragraph-api.alembic.versions.ba3d00e11612_add_cascade_delete_to_scans_and_logs", + "documentation": {} + }, + { + "label": "upgrade", + "kind": 2, + "importPath": "spectragraph-api.alembic.versions.c82bf6af92e5_add_investigation_roles_permissions", + "description": "spectragraph-api.alembic.versions.c82bf6af92e5_add_investigation_roles_permissions", + "peekOfCode": "def upgrade() -> None:\n \"\"\"Upgrade schema.\"\"\"\n # ### commands auto generated by Alembic - please adjust! ###\n pass\n # ### end Alembic commands ###\ndef downgrade() -> None:\n \"\"\"Downgrade schema.\"\"\"\n # ### commands auto generated by Alembic - please adjust! ###\n pass\n # ### end Alembic commands ###", + "detail": "spectragraph-api.alembic.versions.c82bf6af92e5_add_investigation_roles_permissions", + "documentation": {} + }, + { + "label": "downgrade", + "kind": 2, + "importPath": "spectragraph-api.alembic.versions.c82bf6af92e5_add_investigation_roles_permissions", + "description": "spectragraph-api.alembic.versions.c82bf6af92e5_add_investigation_roles_permissions", + "peekOfCode": "def downgrade() -> None:\n \"\"\"Downgrade schema.\"\"\"\n # ### commands auto generated by Alembic - please adjust! ###\n pass\n # ### end Alembic commands ###", + "detail": "spectragraph-api.alembic.versions.c82bf6af92e5_add_investigation_roles_permissions", + "documentation": {} + }, + { + "label": "upgrade", + "kind": 2, + "importPath": "spectragraph-api.alembic.versions.d0a8e5b5a7b9_add_relationship_between_investigations_", + "description": "spectragraph-api.alembic.versions.d0a8e5b5a7b9_add_relationship_between_investigations_", + "peekOfCode": "def upgrade() -> None:\n \"\"\"Upgrade schema.\"\"\"\n # ### commands auto generated by Alembic - please adjust! ###\n pass\n # ### end Alembic commands ###\ndef downgrade() -> None:\n \"\"\"Downgrade schema.\"\"\"\n # ### commands auto generated by Alembic - please adjust! ###\n pass\n # ### end Alembic commands ###", + "detail": "spectragraph-api.alembic.versions.d0a8e5b5a7b9_add_relationship_between_investigations_", + "documentation": {} + }, + { + "label": "downgrade", + "kind": 2, + "importPath": "spectragraph-api.alembic.versions.d0a8e5b5a7b9_add_relationship_between_investigations_", + "description": "spectragraph-api.alembic.versions.d0a8e5b5a7b9_add_relationship_between_investigations_", + "peekOfCode": "def downgrade() -> None:\n \"\"\"Downgrade schema.\"\"\"\n # ### commands auto generated by Alembic - please adjust! ###\n pass\n # ### end Alembic commands ###", + "detail": "spectragraph-api.alembic.versions.d0a8e5b5a7b9_add_relationship_between_investigations_", + "documentation": {} + }, + { + "label": "upgrade", + "kind": 2, + "importPath": "spectragraph-api.alembic.versions.d39941278a91_init", + "description": "spectragraph-api.alembic.versions.d39941278a91_init", + "peekOfCode": "def upgrade() -> None:\n \"\"\"Upgrade schema.\"\"\"\n # ### commands auto generated by Alembic - please adjust! ###\n pass\n # ### end Alembic commands ###\ndef downgrade() -> None:\n \"\"\"Downgrade schema.\"\"\"\n # ### commands auto generated by Alembic - please adjust! ###\n pass\n # ### end Alembic commands ###", + "detail": "spectragraph-api.alembic.versions.d39941278a91_init", + "documentation": {} + }, + { + "label": "downgrade", + "kind": 2, + "importPath": "spectragraph-api.alembic.versions.d39941278a91_init", + "description": "spectragraph-api.alembic.versions.d39941278a91_init", + "peekOfCode": "def downgrade() -> None:\n \"\"\"Downgrade schema.\"\"\"\n # ### commands auto generated by Alembic - please adjust! ###\n pass\n # ### end Alembic commands ###", + "detail": "spectragraph-api.alembic.versions.d39941278a91_init", + "documentation": {} + }, + { + "label": "upgrade", + "kind": 2, + "importPath": "spectragraph-api.alembic.versions.e403a4152f6b_add_third_party_keys_table", + "description": "spectragraph-api.alembic.versions.e403a4152f6b_add_third_party_keys_table", + "peekOfCode": "def upgrade() -> None:\n \"\"\"Upgrade schema.\"\"\"\n # ### commands auto generated by Alembic - please adjust! ###\n op.create_table('third_party_keys',\n sa.Column('id', sa.UUID(), nullable=False),\n sa.Column('service', sa.String(), nullable=False),\n sa.Column('owner_id', sa.UUID(), nullable=True),\n sa.Column('encrypted_key', sa.String(), nullable=False),\n sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=True),\n sa.ForeignKeyConstraint(['owner_id'], ['profiles.id'], onupdate='CASCADE', ondelete='CASCADE'),", + "detail": "spectragraph-api.alembic.versions.e403a4152f6b_add_third_party_keys_table", + "documentation": {} + }, + { + "label": "downgrade", + "kind": 2, + "importPath": "spectragraph-api.alembic.versions.e403a4152f6b_add_third_party_keys_table", + "description": "spectragraph-api.alembic.versions.e403a4152f6b_add_third_party_keys_table", + "peekOfCode": "def downgrade() -> None:\n \"\"\"Downgrade schema.\"\"\"\n # ### commands auto generated by Alembic - please adjust! ###\n op.drop_index('idx_keys_service', table_name='third_party_keys')\n op.drop_index('idx_keys_owner_id', table_name='third_party_keys')\n op.drop_table('third_party_keys')\n # ### end Alembic commands ###", + "detail": "spectragraph-api.alembic.versions.e403a4152f6b_add_third_party_keys_table", + "documentation": {} + }, + { + "label": "upgrade", + "kind": 2, + "importPath": "spectragraph-api.alembic.versions.fa0ab51b2f64_add_analysis_model_and_investigation_", + "description": "spectragraph-api.alembic.versions.fa0ab51b2f64_add_analysis_model_and_investigation_", + "peekOfCode": "def upgrade() -> None:\n \"\"\"Upgrade schema.\"\"\"\n # ### commands auto generated by Alembic - please adjust! ###\n op.create_table('analyses',\n sa.Column('id', sa.UUID(), nullable=False),\n sa.Column('title', sa.Text(), nullable=False),\n sa.Column('description', sa.Text(), nullable=True),\n sa.Column('content', sa.JSON(), nullable=True),\n sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=True),\n sa.Column('last_updated_at', sa.DateTime(timezone=True), server_default=sa.text('now()'), nullable=True),", + "detail": "spectragraph-api.alembic.versions.fa0ab51b2f64_add_analysis_model_and_investigation_", + "documentation": {} + }, + { + "label": "downgrade", + "kind": 2, + "importPath": "spectragraph-api.alembic.versions.fa0ab51b2f64_add_analysis_model_and_investigation_", + "description": "spectragraph-api.alembic.versions.fa0ab51b2f64_add_analysis_model_and_investigation_", + "peekOfCode": "def downgrade() -> None:\n \"\"\"Downgrade schema.\"\"\"\n # ### commands auto generated by Alembic - please adjust! ###\n op.drop_index('idx_analyses_owner_id', table_name='analyses')\n op.drop_index('idx_analyses_investigation_id', table_name='analyses')\n op.drop_table('analyses')\n # ### end Alembic commands ###", + "detail": "spectragraph-api.alembic.versions.fa0ab51b2f64_add_analysis_model_and_investigation_", + "documentation": {} + }, + { + "label": "upgrade", + "kind": 2, + "importPath": "spectragraph-api.alembic.versions.faceebd6a580_remove_scan_id_of_logs", + "description": "spectragraph-api.alembic.versions.faceebd6a580_remove_scan_id_of_logs", + "peekOfCode": "def upgrade() -> None:\n \"\"\"Upgrade schema.\"\"\"\n # ### commands auto generated by Alembic - please adjust! ###\n op.drop_constraint('logs_scan_id_fkey', 'logs', type_='foreignkey')\n op.drop_column('logs', 'scan_id')\n # ### end Alembic commands ###\ndef downgrade() -> None:\n \"\"\"Downgrade schema.\"\"\"\n # ### commands auto generated by Alembic - please adjust! ###\n op.add_column('logs', sa.Column('scan_id', sa.UUID(), autoincrement=False, nullable=True))", + "detail": "spectragraph-api.alembic.versions.faceebd6a580_remove_scan_id_of_logs", + "documentation": {} + }, + { + "label": "downgrade", + "kind": 2, + "importPath": "spectragraph-api.alembic.versions.faceebd6a580_remove_scan_id_of_logs", + "description": "spectragraph-api.alembic.versions.faceebd6a580_remove_scan_id_of_logs", + "peekOfCode": "def downgrade() -> None:\n \"\"\"Downgrade schema.\"\"\"\n # ### commands auto generated by Alembic - please adjust! ###\n op.add_column('logs', sa.Column('scan_id', sa.UUID(), autoincrement=False, nullable=True))\n op.create_foreign_key('logs_scan_id_fkey', 'logs', 'scans', ['scan_id'], ['id'], ondelete='CASCADE')\n # ### end Alembic commands ###", + "detail": "spectragraph-api.alembic.versions.faceebd6a580_remove_scan_id_of_logs", + "documentation": {} + }, + { + "label": "run_migrations_offline", + "kind": 2, + "importPath": "spectragraph-api.alembic.env", + "description": "spectragraph-api.alembic.env", + "peekOfCode": "def run_migrations_offline() -> None:\n \"\"\"Run migrations in 'offline' mode.\"\"\"\n url = config.get_main_option(\"sqlalchemy.url\")\n context.configure(\n url=url,\n target_metadata=target_metadata,\n literal_binds=True,\n dialect_opts={\"paramstyle\": \"named\"},\n )\n with context.begin_transaction():", + "detail": "spectragraph-api.alembic.env", + "documentation": {} + }, + { + "label": "run_migrations_online", + "kind": 2, + "importPath": "spectragraph-api.alembic.env", + "description": "spectragraph-api.alembic.env", + "peekOfCode": "def run_migrations_online() -> None:\n \"\"\"Run migrations in 'online' mode.\"\"\"\n connectable = engine_from_config(\n config.get_section(config.config_ini_section),\n prefix=\"sqlalchemy.\",\n poolclass=pool.NullPool,\n )\n with connectable.connect() as connection:\n context.configure(connection=connection, target_metadata=target_metadata)\n with context.begin_transaction():", + "detail": "spectragraph-api.alembic.env", + "documentation": {} + }, + { + "label": "config", + "kind": 5, + "importPath": "spectragraph-api.alembic.env", + "description": "spectragraph-api.alembic.env", + "peekOfCode": "config = context.config\nif config.config_file_name is not None:\n fileConfig(config.config_file_name)\ndatabase_url = os.getenv(\"DATABASE_URL\")\nif not database_url:\n raise RuntimeError(\"DATABASE_URL is not defined in .env\")\nconfig.set_main_option(\"sqlalchemy.url\", database_url)\ntarget_metadata = Base.metadata\ndef run_migrations_offline() -> None:\n \"\"\"Run migrations in 'offline' mode.\"\"\"", + "detail": "spectragraph-api.alembic.env", + "documentation": {} + }, + { + "label": "database_url", + "kind": 5, + "importPath": "spectragraph-api.alembic.env", + "description": "spectragraph-api.alembic.env", + "peekOfCode": "database_url = os.getenv(\"DATABASE_URL\")\nif not database_url:\n raise RuntimeError(\"DATABASE_URL is not defined in .env\")\nconfig.set_main_option(\"sqlalchemy.url\", database_url)\ntarget_metadata = Base.metadata\ndef run_migrations_offline() -> None:\n \"\"\"Run migrations in 'offline' mode.\"\"\"\n url = config.get_main_option(\"sqlalchemy.url\")\n context.configure(\n url=url,", + "detail": "spectragraph-api.alembic.env", + "documentation": {} + }, + { + "label": "target_metadata", + "kind": 5, + "importPath": "spectragraph-api.alembic.env", + "description": "spectragraph-api.alembic.env", + "peekOfCode": "target_metadata = Base.metadata\ndef run_migrations_offline() -> None:\n \"\"\"Run migrations in 'offline' mode.\"\"\"\n url = config.get_main_option(\"sqlalchemy.url\")\n context.configure(\n url=url,\n target_metadata=target_metadata,\n literal_binds=True,\n dialect_opts={\"paramstyle\": \"named\"},\n )", + "detail": "spectragraph-api.alembic.env", + "documentation": {} + }, + { + "label": "get_analyses", + "kind": 2, + "importPath": "spectragraph-api.app.api.routes.analysis", + "description": "spectragraph-api.app.api.routes.analysis", + "peekOfCode": "def get_analyses(\n skip: int = 0,limit: int = 90,search: Optional[str] = None,\n db: Session = Depends(get_db), current_user: Profile = Depends(get_current_user)\n): \n MAX_LIMIT = 100\n if limit > MAX_LIMIT :\n raise HTTPException(status_code= status.HTTP_400_BAD_REQUEST, detail=f\"Limit for analyses cannot exceed {MAX_LIMIT}\")\n query= db.query(Analysis).filter(Analysis.owner_id == current_user.id)\n if search:\n search_filter= or_(Analysis.title.ilike(f\"%{search}%\"),Analysis.description.ilike(f\"%{search}%\"))", + "detail": "spectragraph-api.app.api.routes.analysis", + "documentation": {} + }, + { + "label": "create_analysis", + "kind": 2, + "importPath": "spectragraph-api.app.api.routes.analysis", + "description": "spectragraph-api.app.api.routes.analysis", + "peekOfCode": "def create_analysis(\n payload: AnalysisCreate,\n db: Session = Depends(get_db),\n current_user: Profile = Depends(get_current_user),\n):\n check_investigation_permission(\n current_user.id, payload.investigation_id, actions=[\"create\"], db=db\n )\n new_analysis = Analysis(\n id=uuid4(),", + "detail": "spectragraph-api.app.api.routes.analysis", + "documentation": {} + }, + { + "label": "get_analysis_by_id", + "kind": 2, + "importPath": "spectragraph-api.app.api.routes.analysis", + "description": "spectragraph-api.app.api.routes.analysis", + "peekOfCode": "def get_analysis_by_id(\n analysis_id: UUID,\n db: Session = Depends(get_db),\n current_user: Profile = Depends(get_current_user),\n):\n analysis = (\n db.query(Analysis)\n .filter(Analysis.id == analysis_id)\n .first()\n )", + "detail": "spectragraph-api.app.api.routes.analysis", + "documentation": {} + }, + { + "label": "get_analyses_by_investigation", + "kind": 2, + "importPath": "spectragraph-api.app.api.routes.analysis", + "description": "spectragraph-api.app.api.routes.analysis", + "peekOfCode": "def get_analyses_by_investigation(\n investigation_id: UUID,\n db: Session = Depends(get_db),\n current_user: Profile = Depends(get_current_user),\n):\n check_investigation_permission(\n current_user.id, investigation_id, actions=[\"read\"], db=db\n )\n analyses = (\n db.query(Analysis)", + "detail": "spectragraph-api.app.api.routes.analysis", + "documentation": {} + }, + { + "label": "update_analysis", + "kind": 2, + "importPath": "spectragraph-api.app.api.routes.analysis", + "description": "spectragraph-api.app.api.routes.analysis", + "peekOfCode": "def update_analysis(\n analysis_id: UUID,\n payload: AnalysisUpdate,\n db: Session = Depends(get_db),\n current_user: Profile = Depends(get_current_user),\n):\n analysis = (\n db.query(Analysis)\n .filter(Analysis.id == analysis_id)\n .first()", + "detail": "spectragraph-api.app.api.routes.analysis", + "documentation": {} + }, + { + "label": "delete_analysis", + "kind": 2, + "importPath": "spectragraph-api.app.api.routes.analysis", + "description": "spectragraph-api.app.api.routes.analysis", + "peekOfCode": "def delete_analysis(\n analysis_id: UUID,\n db: Session = Depends(get_db),\n current_user: Profile = Depends(get_current_user),\n):\n analysis = (\n db.query(Analysis)\n .filter(Analysis.id == analysis_id)\n .first()\n )", + "detail": "spectragraph-api.app.api.routes.analysis", + "documentation": {} + }, + { + "label": "router", + "kind": 5, + "importPath": "spectragraph-api.app.api.routes.analysis", + "description": "spectragraph-api.app.api.routes.analysis", + "peekOfCode": "router = APIRouter()\n# Get the list of all analyses for the current user\n@router.get(\"\", response_model=AnalysisListResponse)\ndef get_analyses(\n skip: int = 0,limit: int = 90,search: Optional[str] = None,\n db: Session = Depends(get_db), current_user: Profile = Depends(get_current_user)\n): \n MAX_LIMIT = 100\n if limit > MAX_LIMIT :\n raise HTTPException(status_code= status.HTTP_400_BAD_REQUEST, detail=f\"Limit for analyses cannot exceed {MAX_LIMIT}\")", + "detail": "spectragraph-api.app.api.routes.analysis", + "documentation": {} + }, + { + "label": "login_for_access_token", + "kind": 2, + "importPath": "spectragraph-api.app.api.routes.auth", + "description": "spectragraph-api.app.api.routes.auth", + "peekOfCode": "def login_for_access_token(\n form_data: OAuth2PasswordRequestForm = Depends(), db: Session = Depends(get_db)\n):\n try:\n user = db.query(Profile).filter(Profile.email == form_data.username).first()\n if not user or not verify_password(form_data.password, user.hashed_password):\n raise HTTPException(status_code=400, detail=\"Incorrect email or password\")\n access_token = create_access_token(data={\"sub\": user.email})\n return {\n \"access_token\": access_token,", + "detail": "spectragraph-api.app.api.routes.auth", + "documentation": {} + }, + { + "label": "register", + "kind": 2, + "importPath": "spectragraph-api.app.api.routes.auth", + "description": "spectragraph-api.app.api.routes.auth", + "peekOfCode": "def register(user: ProfileCreate, db: Session = Depends(get_db)):\n try:\n existing_user = db.query(Profile).filter(Profile.email == user.email).first()\n if existing_user:\n raise HTTPException(status_code=400, detail=\"Email already registered\")\n hashed_password = get_password_hash(user.password)\n new_user = Profile(email=user.email, hashed_password=hashed_password)\n db.add(new_user)\n db.commit()\n db.refresh(new_user)", + "detail": "spectragraph-api.app.api.routes.auth", + "documentation": {} + }, + { + "label": "router", + "kind": 5, + "importPath": "spectragraph-api.app.api.routes.auth", + "description": "spectragraph-api.app.api.routes.auth", + "peekOfCode": "router = APIRouter()\n@router.post(\"/token\")\ndef login_for_access_token(\n form_data: OAuth2PasswordRequestForm = Depends(), db: Session = Depends(get_db)\n):\n try:\n user = db.query(Profile).filter(Profile.email == form_data.username).first()\n if not user or not verify_password(form_data.password, user.hashed_password):\n raise HTTPException(status_code=400, detail=\"Incorrect email or password\")\n access_token = create_access_token(data={\"sub\": user.email})", + "detail": "spectragraph-api.app.api.routes.auth", + "documentation": {} + }, + { + "label": "ChatRequest", + "kind": 6, + "importPath": "spectragraph-api.app.api.routes.chat", + "description": "spectragraph-api.app.api.routes.chat", + "peekOfCode": "class ChatRequest(BaseModel):\n prompt: str\n context: Optional[List[Dict]] = None\n# Get all chats\n@router.get(\"/\", response_model=List[ChatRead])\ndef get_chats(\n db: Session = Depends(get_db), current_user: Profile = Depends(get_current_user)\n):\n chats = db.query(Chat).filter(Chat.owner_id == current_user.id).all()\n # Sort messages for each chat by created_at in ascending order", + "detail": "spectragraph-api.app.api.routes.chat", + "documentation": {} + }, + { + "label": "clean_context", + "kind": 2, + "importPath": "spectragraph-api.app.api.routes.chat", + "description": "spectragraph-api.app.api.routes.chat", + "peekOfCode": "def clean_context(context: List[Dict]) -> List[Dict]:\n print(context)\n \"\"\"Remove unnecessary keys from context data.\"\"\"\n cleaned = []\n for item in context:\n if isinstance(item, dict):\n # Create a copy and remove unwanted keys\n cleaned_item = item[\"data\"].copy()\n # Remove top-level keys\n cleaned_item.pop(\"id\", None)", + "detail": "spectragraph-api.app.api.routes.chat", + "documentation": {} + }, + { + "label": "get_chats", + "kind": 2, + "importPath": "spectragraph-api.app.api.routes.chat", + "description": "spectragraph-api.app.api.routes.chat", + "peekOfCode": "def get_chats(\n db: Session = Depends(get_db), current_user: Profile = Depends(get_current_user)\n):\n chats = db.query(Chat).filter(Chat.owner_id == current_user.id).all()\n # Sort messages for each chat by created_at in ascending order\n for chat in chats:\n chat.messages.sort(key=lambda x: x.created_at)\n return chats\n# @router.get(\"/delete-all\", status_code=status.HTTP_204_NO_CONTENT)\n# def delete_all_chat(db: Session = Depends(get_db)):", + "detail": "spectragraph-api.app.api.routes.chat", + "documentation": {} + }, + { + "label": "get_chats_by_investigation", + "kind": 2, + "importPath": "spectragraph-api.app.api.routes.chat", + "description": "spectragraph-api.app.api.routes.chat", + "peekOfCode": "def get_chats_by_investigation(\n investigation_id: UUID,\n db: Session = Depends(get_db),\n current_user: Profile = Depends(get_current_user),\n):\n chats = (\n db.query(Chat)\n .filter(\n Chat.investigation_id == investigation_id, Chat.owner_id == current_user.id\n )", + "detail": "spectragraph-api.app.api.routes.chat", + "documentation": {} + }, + { + "label": "create_chat", + "kind": 2, + "importPath": "spectragraph-api.app.api.routes.chat", + "description": "spectragraph-api.app.api.routes.chat", + "peekOfCode": "def create_chat(\n payload: ChatCreate,\n db: Session = Depends(get_db),\n current_user: Profile = Depends(get_current_user),\n):\n new_chat = Chat(\n id=uuid4(),\n title=payload.title,\n description=payload.description,\n owner_id=current_user.id,", + "detail": "spectragraph-api.app.api.routes.chat", + "documentation": {} + }, + { + "label": "get_chat_by_id", + "kind": 2, + "importPath": "spectragraph-api.app.api.routes.chat", + "description": "spectragraph-api.app.api.routes.chat", + "peekOfCode": "def get_chat_by_id(\n chat_id: UUID,\n db: Session = Depends(get_db),\n current_user: Profile = Depends(get_current_user),\n):\n chat = (\n db.query(Chat)\n .filter(Chat.id == chat_id, Chat.owner_id == current_user.id)\n .first()\n )", + "detail": "spectragraph-api.app.api.routes.chat", + "documentation": {} + }, + { + "label": "delete_chat", + "kind": 2, + "importPath": "spectragraph-api.app.api.routes.chat", + "description": "spectragraph-api.app.api.routes.chat", + "peekOfCode": "def delete_chat(\n chat_id: UUID,\n db: Session = Depends(get_db),\n current_user: Profile = Depends(get_current_user),\n):\n chat = (\n db.query(Chat)\n .filter(Chat.id == chat_id, Chat.owner_id == current_user.id)\n .first()\n )", + "detail": "spectragraph-api.app.api.routes.chat", + "documentation": {} + }, + { + "label": "router", + "kind": 5, + "importPath": "spectragraph-api.app.api.routes.chat", + "description": "spectragraph-api.app.api.routes.chat", + "peekOfCode": "router = APIRouter()\ndef clean_context(context: List[Dict]) -> List[Dict]:\n print(context)\n \"\"\"Remove unnecessary keys from context data.\"\"\"\n cleaned = []\n for item in context:\n if isinstance(item, dict):\n # Create a copy and remove unwanted keys\n cleaned_item = item[\"data\"].copy()\n # Remove top-level keys", + "detail": "spectragraph-api.app.api.routes.chat", + "documentation": {} + }, + { + "label": "create_custom_type", + "kind": 2, + "importPath": "spectragraph-api.app.api.routes.custom_types", + "description": "spectragraph-api.app.api.routes.custom_types", + "peekOfCode": "def create_custom_type(\n custom_type: CustomTypeCreate,\n db: Session = Depends(get_db),\n current_user: Profile = Depends(get_current_user),\n):\n \"\"\"\n Create a new custom type.\n Validates the JSON Schema and stores it in the database.\n \"\"\"\n # Validate the JSON Schema", + "detail": "spectragraph-api.app.api.routes.custom_types", + "documentation": {} + }, + { + "label": "list_custom_types", + "kind": 2, + "importPath": "spectragraph-api.app.api.routes.custom_types", + "description": "spectragraph-api.app.api.routes.custom_types", + "peekOfCode": "def list_custom_types(\n status: str = None,\n db: Session = Depends(get_db),\n current_user: Profile = Depends(get_current_user),\n):\n \"\"\"\n List all custom types for the current user.\n Can be filtered by status (draft, published, archived).\n \"\"\"\n query = db.query(CustomType).filter(CustomType.owner_id == current_user.id)", + "detail": "spectragraph-api.app.api.routes.custom_types", + "documentation": {} + }, + { + "label": "get_custom_type", + "kind": 2, + "importPath": "spectragraph-api.app.api.routes.custom_types", + "description": "spectragraph-api.app.api.routes.custom_types", + "peekOfCode": "def get_custom_type(\n id: UUID,\n db: Session = Depends(get_db),\n current_user: Profile = Depends(get_current_user),\n):\n \"\"\"Get a specific custom type by ID.\"\"\"\n custom_type = (\n db.query(CustomType)\n .filter(CustomType.id == id, CustomType.owner_id == current_user.id)\n .first()", + "detail": "spectragraph-api.app.api.routes.custom_types", + "documentation": {} + }, + { + "label": "get_custom_type_schema", + "kind": 2, + "importPath": "spectragraph-api.app.api.routes.custom_types", + "description": "spectragraph-api.app.api.routes.custom_types", + "peekOfCode": "def get_custom_type_schema(\n id: UUID,\n db: Session = Depends(get_db),\n current_user: Profile = Depends(get_current_user),\n):\n \"\"\"Get the raw JSON Schema for a custom type.\"\"\"\n custom_type = (\n db.query(CustomType)\n .filter(CustomType.id == id, CustomType.owner_id == current_user.id)\n .first()", + "detail": "spectragraph-api.app.api.routes.custom_types", + "documentation": {} + }, + { + "label": "update_custom_type", + "kind": 2, + "importPath": "spectragraph-api.app.api.routes.custom_types", + "description": "spectragraph-api.app.api.routes.custom_types", + "peekOfCode": "def update_custom_type(\n id: UUID,\n update_data: CustomTypeUpdate,\n db: Session = Depends(get_db),\n current_user: Profile = Depends(get_current_user),\n):\n \"\"\"\n Update a custom type.\n If the schema is changed, a new checksum is calculated.\n \"\"\"", + "detail": "spectragraph-api.app.api.routes.custom_types", + "documentation": {} + }, + { + "label": "delete_custom_type", + "kind": 2, + "importPath": "spectragraph-api.app.api.routes.custom_types", + "description": "spectragraph-api.app.api.routes.custom_types", + "peekOfCode": "def delete_custom_type(\n id: UUID,\n db: Session = Depends(get_db),\n current_user: Profile = Depends(get_current_user),\n):\n \"\"\"Delete a custom type.\"\"\"\n custom_type = (\n db.query(CustomType)\n .filter(CustomType.id == id, CustomType.owner_id == current_user.id)\n .first()", + "detail": "spectragraph-api.app.api.routes.custom_types", + "documentation": {} + }, + { + "label": "validate_payload", + "kind": 2, + "importPath": "spectragraph-api.app.api.routes.custom_types", + "description": "spectragraph-api.app.api.routes.custom_types", + "peekOfCode": "def validate_payload(\n id: UUID,\n payload_data: CustomTypeValidatePayload,\n db: Session = Depends(get_db),\n current_user: Profile = Depends(get_current_user),\n):\n \"\"\"\n Validate a payload against a custom type's schema.\n This is useful for testing before publishing a type.\n \"\"\"", + "detail": "spectragraph-api.app.api.routes.custom_types", + "documentation": {} + }, + { + "label": "router", + "kind": 5, + "importPath": "spectragraph-api.app.api.routes.custom_types", + "description": "spectragraph-api.app.api.routes.custom_types", + "peekOfCode": "router = APIRouter()\n@router.post(\"\", response_model=CustomTypeRead, status_code=status.HTTP_201_CREATED)\ndef create_custom_type(\n custom_type: CustomTypeCreate,\n db: Session = Depends(get_db),\n current_user: Profile = Depends(get_current_user),\n):\n \"\"\"\n Create a new custom type.\n Validates the JSON Schema and stores it in the database.", + "detail": "spectragraph-api.app.api.routes.custom_types", + "documentation": {} + }, + { + "label": "get_logs_by_sketch", + "kind": 2, + "importPath": "spectragraph-api.app.api.routes.events", + "description": "spectragraph-api.app.api.routes.events", + "peekOfCode": "def get_logs_by_sketch(\n sketch_id: str,\n limit: int = 100,\n since: datetime | None = None,\n db: Session = Depends(get_db),\n # current_user: Profile = Depends(get_current_user)\n):\n \"\"\"Get historical logs for a specific sketch with optional filtering\"\"\"\n # Check if sketch exists\n sketch = db.query(Sketch).filter(Sketch.id == sketch_id).first()", + "detail": "spectragraph-api.app.api.routes.events", + "documentation": {} + }, + { + "label": "delete_scan_logs", + "kind": 2, + "importPath": "spectragraph-api.app.api.routes.events", + "description": "spectragraph-api.app.api.routes.events", + "peekOfCode": "def delete_scan_logs(\n sketch_id: str,\n db: Session = Depends(get_db),\n current_user: Profile = Depends(get_current_user),\n):\n \"\"\"Delete all logs for a specific scan\"\"\"\n try:\n db.query(Log).filter(Log.sketch_id == sketch_id).delete()\n db.commit()\n return {\"message\": f\"All logs have been deleted successfully\"}", + "detail": "spectragraph-api.app.api.routes.events", + "documentation": {} + }, + { + "label": "router", + "kind": 5, + "importPath": "spectragraph-api.app.api.routes.events", + "description": "spectragraph-api.app.api.routes.events", + "peekOfCode": "router = APIRouter()\n@router.get(\"/sketch/{sketch_id}/logs\")\ndef get_logs_by_sketch(\n sketch_id: str,\n limit: int = 100,\n since: datetime | None = None,\n db: Session = Depends(get_db),\n # current_user: Profile = Depends(get_current_user)\n):\n \"\"\"Get historical logs for a specific sketch with optional filtering\"\"\"", + "detail": "spectragraph-api.app.api.routes.events", + "documentation": {} + }, + { + "label": "FlowComputationRequest", + "kind": 6, + "importPath": "spectragraph-api.app.api.routes.flows", + "description": "spectragraph-api.app.api.routes.flows", + "peekOfCode": "class FlowComputationRequest(BaseModel):\n nodes: List[Node]\n edges: List[Edge]\n inputType: Optional[str] = None\nclass FlowComputationResponse(BaseModel):\n flowBranches: List[FlowBranch]\n initialData: Any\nclass StepSimulationRequest(BaseModel):\n flowBranches: List[FlowBranch]\n currentStepIndex: int", + "detail": "spectragraph-api.app.api.routes.flows", + "documentation": {} + }, + { + "label": "FlowComputationResponse", + "kind": 6, + "importPath": "spectragraph-api.app.api.routes.flows", + "description": "spectragraph-api.app.api.routes.flows", + "peekOfCode": "class FlowComputationResponse(BaseModel):\n flowBranches: List[FlowBranch]\n initialData: Any\nclass StepSimulationRequest(BaseModel):\n flowBranches: List[FlowBranch]\n currentStepIndex: int\nclass launchFlowPayload(BaseModel):\n values: List[str]\n sketch_id: str\nrouter = APIRouter()", + "detail": "spectragraph-api.app.api.routes.flows", + "documentation": {} + }, + { + "label": "StepSimulationRequest", + "kind": 6, + "importPath": "spectragraph-api.app.api.routes.flows", + "description": "spectragraph-api.app.api.routes.flows", + "peekOfCode": "class StepSimulationRequest(BaseModel):\n flowBranches: List[FlowBranch]\n currentStepIndex: int\nclass launchFlowPayload(BaseModel):\n values: List[str]\n sketch_id: str\nrouter = APIRouter()\n@router.get(\"/\", response_model=List[FlowRead])\ndef get_flows(\n category: Optional[str] = Query(None),", + "detail": "spectragraph-api.app.api.routes.flows", + "documentation": {} + }, + { + "label": "launchFlowPayload", + "kind": 6, + "importPath": "spectragraph-api.app.api.routes.flows", + "description": "spectragraph-api.app.api.routes.flows", + "peekOfCode": "class launchFlowPayload(BaseModel):\n values: List[str]\n sketch_id: str\nrouter = APIRouter()\n@router.get(\"/\", response_model=List[FlowRead])\ndef get_flows(\n category: Optional[str] = Query(None),\n db: Session = Depends(get_db),\n current_user: Profile = Depends(get_current_user),\n):", + "detail": "spectragraph-api.app.api.routes.flows", + "documentation": {} + }, + { + "label": "get_flows", + "kind": 2, + "importPath": "spectragraph-api.app.api.routes.flows", + "description": "spectragraph-api.app.api.routes.flows", + "peekOfCode": "def get_flows(\n category: Optional[str] = Query(None),\n db: Session = Depends(get_db),\n current_user: Profile = Depends(get_current_user),\n):\n if not category or category.lower() == \"undefined\":\n return db.query(Flow).order_by(Flow.last_updated_at.desc()).all()\n custom_type = (\n db.query(CustomType)\n .filter(", + "detail": "spectragraph-api.app.api.routes.flows", + "documentation": {} + }, + { + "label": "create_flow", + "kind": 2, + "importPath": "spectragraph-api.app.api.routes.flows", + "description": "spectragraph-api.app.api.routes.flows", + "peekOfCode": "def create_flow(\n payload: FlowCreate,\n db: Session = Depends(get_db),\n current_user: Profile = Depends(get_current_user),\n):\n new_flow = Flow(\n id=uuid4(),\n name=payload.name,\n description=payload.description,\n category=payload.category,", + "detail": "spectragraph-api.app.api.routes.flows", + "documentation": {} + }, + { + "label": "get_flow_by_id", + "kind": 2, + "importPath": "spectragraph-api.app.api.routes.flows", + "description": "spectragraph-api.app.api.routes.flows", + "peekOfCode": "def get_flow_by_id(\n flow_id: UUID,\n db: Session = Depends(get_db),\n current_user: Profile = Depends(get_current_user),\n):\n flow = db.query(Flow).filter(Flow.id == flow_id).first()\n if not flow:\n raise HTTPException(status_code=404, detail=\"flow not found\")\n return flow\n# Update a flow by ID", + "detail": "spectragraph-api.app.api.routes.flows", + "documentation": {} + }, + { + "label": "update_flow", + "kind": 2, + "importPath": "spectragraph-api.app.api.routes.flows", + "description": "spectragraph-api.app.api.routes.flows", + "peekOfCode": "def update_flow(\n flow_id: UUID,\n payload: FlowUpdate,\n db: Session = Depends(get_db),\n current_user: Profile = Depends(get_current_user),\n):\n flow = db.query(Flow).filter(Flow.id == flow_id).first()\n if not flow:\n raise HTTPException(status_code=404, detail=\"flow not found\")\n update_data = payload.model_dump(exclude_unset=True)", + "detail": "spectragraph-api.app.api.routes.flows", + "documentation": {} + }, + { + "label": "delete_flow", + "kind": 2, + "importPath": "spectragraph-api.app.api.routes.flows", + "description": "spectragraph-api.app.api.routes.flows", + "peekOfCode": "def delete_flow(\n flow_id: UUID,\n db: Session = Depends(get_db),\n current_user: Profile = Depends(get_current_user),\n):\n flow = db.query(Flow).filter(Flow.id == flow_id).first()\n if not flow:\n raise HTTPException(status_code=404, detail=\"flow not found\")\n db.delete(flow)\n db.commit()", + "detail": "spectragraph-api.app.api.routes.flows", + "documentation": {} + }, + { + "label": "compute_flows", + "kind": 2, + "importPath": "spectragraph-api.app.api.routes.flows", + "description": "spectragraph-api.app.api.routes.flows", + "peekOfCode": "def compute_flows(\n request: FlowComputationRequest, current_user: Profile = Depends(get_current_user)\n):\n initial_data = generate_sample_data(request.inputType or \"string\")\n flow_branches = compute_flow_branches(initial_data, request.nodes, request.edges)\n return FlowComputationResponse(flowBranches=flow_branches, initialData=initial_data)\ndef generate_sample_data(type_str: str) -> Any:\n type_str = type_str.lower() if type_str else \"string\"\n if type_str == \"string\":\n return \"sample_text\"", + "detail": "spectragraph-api.app.api.routes.flows", + "documentation": {} + }, + { + "label": "generate_sample_data", + "kind": 2, + "importPath": "spectragraph-api.app.api.routes.flows", + "description": "spectragraph-api.app.api.routes.flows", + "peekOfCode": "def generate_sample_data(type_str: str) -> Any:\n type_str = type_str.lower() if type_str else \"string\"\n if type_str == \"string\":\n return \"sample_text\"\n elif type_str == \"number\":\n return 42\n elif type_str == \"boolean\":\n return True\n elif type_str == \"array\":\n return [1, 2, 3]", + "detail": "spectragraph-api.app.api.routes.flows", + "documentation": {} + }, + { + "label": "compute_flow_branches", + "kind": 2, + "importPath": "spectragraph-api.app.api.routes.flows", + "description": "spectragraph-api.app.api.routes.flows", + "peekOfCode": "def compute_flow_branches(\n initial_value: Any, nodes: List[Node], edges: List[Edge]\n) -> List[FlowBranch]:\n \"\"\"Computes flow branches based on nodes and edges with proper DFS traversal\"\"\"\n # Find input nodes (starting points)\n input_nodes = [node for node in nodes if node.data.get(\"type\") == \"type\"]\n if not input_nodes:\n return [\n FlowBranch(\n id=\"error\",", + "detail": "spectragraph-api.app.api.routes.flows", + "documentation": {} + }, + { + "label": "process_node_data", + "kind": 2, + "importPath": "spectragraph-api.app.api.routes.flows", + "description": "spectragraph-api.app.api.routes.flows", + "peekOfCode": "def process_node_data(node: Node, inputs: Dict[str, Any]) -> Dict[str, Any]:\n \"\"\"Traite les données de nœud en fonction du type de nœud et des entrées\"\"\"\n outputs = {}\n output_types = node.data[\"outputs\"].get(\"properties\", [])\n for output in output_types:\n output_name = output.get(\"name\", \"output\")\n class_name = node.data.get(\"class_name\", \"\")\n # For simulation purposes, we'll return a placeholder value based on the transform type\n if class_name in [\"ReverseResolveTransform\", \"ResolveTransform\"]:\n # IP/Domain resolution transforms", + "detail": "spectragraph-api.app.api.routes.flows", + "documentation": {} + }, + { + "label": "router", + "kind": 5, + "importPath": "spectragraph-api.app.api.routes.flows", + "description": "spectragraph-api.app.api.routes.flows", + "peekOfCode": "router = APIRouter()\n@router.get(\"/\", response_model=List[FlowRead])\ndef get_flows(\n category: Optional[str] = Query(None),\n db: Session = Depends(get_db),\n current_user: Profile = Depends(get_current_user),\n):\n if not category or category.lower() == \"undefined\":\n return db.query(Flow).order_by(Flow.last_updated_at.desc()).all()\n custom_type = (", + "detail": "spectragraph-api.app.api.routes.flows", + "documentation": {} + }, + { + "label": "get_user_accessible_investigations", + "kind": 2, + "importPath": "spectragraph-api.app.api.routes.investigations", + "description": "spectragraph-api.app.api.routes.investigations", + "peekOfCode": "def get_user_accessible_investigations(\n user_id: str, db: Session, allowed_roles: list[Role] = None\n) -> list[Investigation]:\n \"\"\"\n Returns all investigations accessible to user depending on its roles\n \"\"\"\n query = db.query(Investigation).join(\n InvestigationUserRole,\n InvestigationUserRole.investigation_id == Investigation.id,\n )", + "detail": "spectragraph-api.app.api.routes.investigations", + "documentation": {} + }, + { + "label": "get_investigations", + "kind": 2, + "importPath": "spectragraph-api.app.api.routes.investigations", + "description": "spectragraph-api.app.api.routes.investigations", + "peekOfCode": "def get_investigations(\n db: Session = Depends(get_db),\n current_user: Profile = Depends(get_current_user),\n):\n \"\"\"\n Récupère toutes les investigations accessibles à l'utilisateur\n selon ses rôles (OWNER, EDITOR, VIEWER).\n \"\"\"\n allowed_roles_for_read = [Role.OWNER, Role.EDITOR, Role.VIEWER]\n investigations = get_user_accessible_investigations(", + "detail": "spectragraph-api.app.api.routes.investigations", + "documentation": {} + }, + { + "label": "create_investigation", + "kind": 2, + "importPath": "spectragraph-api.app.api.routes.investigations", + "description": "spectragraph-api.app.api.routes.investigations", + "peekOfCode": "def create_investigation(\n payload: InvestigationCreate,\n db: Session = Depends(get_db),\n current_user: Profile = Depends(get_current_user),\n):\n new_investigation = Investigation(\n id=uuid4(),\n name=payload.name,\n description=payload.description or payload.name,\n owner_id=current_user.id,", + "detail": "spectragraph-api.app.api.routes.investigations", + "documentation": {} + }, + { + "label": "get_investigation_by_id", + "kind": 2, + "importPath": "spectragraph-api.app.api.routes.investigations", + "description": "spectragraph-api.app.api.routes.investigations", + "peekOfCode": "def get_investigation_by_id(\n investigation_id: UUID,\n db: Session = Depends(get_db),\n current_user: Profile = Depends(get_current_user),\n):\n check_investigation_permission(current_user.id, investigation_id, actions=[\"read\"], db=db)\n investigation = (\n db.query(Investigation)\n .options(\n selectinload(Investigation.sketches),", + "detail": "spectragraph-api.app.api.routes.investigations", + "documentation": {} + }, + { + "label": "get_sketches_by_investigation", + "kind": 2, + "importPath": "spectragraph-api.app.api.routes.investigations", + "description": "spectragraph-api.app.api.routes.investigations", + "peekOfCode": "def get_sketches_by_investigation(\n investigation_id: UUID,\n db: Session = Depends(get_db),\n current_user: Profile = Depends(get_current_user),\n):\n sketches = (\n db.query(Sketch).filter(Sketch.investigation_id == investigation_id).all()\n )\n if not sketches:\n raise HTTPException(", + "detail": "spectragraph-api.app.api.routes.investigations", + "documentation": {} + }, + { + "label": "update_investigation", + "kind": 2, + "importPath": "spectragraph-api.app.api.routes.investigations", + "description": "spectragraph-api.app.api.routes.investigations", + "peekOfCode": "def update_investigation(\n investigation_id: UUID,\n payload: InvestigationUpdate,\n db: Session = Depends(get_db),\n current_user: Profile = Depends(get_current_user),\n):\n investigation = (\n db.query(Investigation).filter(Investigation.id == investigation_id).first()\n )\n if not investigation:", + "detail": "spectragraph-api.app.api.routes.investigations", + "documentation": {} + }, + { + "label": "delete_investigation", + "kind": 2, + "importPath": "spectragraph-api.app.api.routes.investigations", + "description": "spectragraph-api.app.api.routes.investigations", + "peekOfCode": "def delete_investigation(\n investigation_id: UUID,\n db: Session = Depends(get_db),\n current_user: Profile = Depends(get_current_user),\n):\n investigation = (\n db.query(Investigation)\n .filter(\n Investigation.id == investigation_id,\n Investigation.owner_id == current_user.id,", + "detail": "spectragraph-api.app.api.routes.investigations", + "documentation": {} + }, + { + "label": "router", + "kind": 5, + "importPath": "spectragraph-api.app.api.routes.investigations", + "description": "spectragraph-api.app.api.routes.investigations", + "peekOfCode": "router = APIRouter()\ndef get_user_accessible_investigations(\n user_id: str, db: Session, allowed_roles: list[Role] = None\n) -> list[Investigation]:\n \"\"\"\n Returns all investigations accessible to user depending on its roles\n \"\"\"\n query = db.query(Investigation).join(\n InvestigationUserRole,\n InvestigationUserRole.investigation_id == Investigation.id,", + "detail": "spectragraph-api.app.api.routes.investigations", + "documentation": {} + }, + { + "label": "get_keys", + "kind": 2, + "importPath": "spectragraph-api.app.api.routes.keys", + "description": "spectragraph-api.app.api.routes.keys", + "peekOfCode": "def get_keys(\n db: Session = Depends(get_db), current_user: Profile = Depends(get_current_user)\n):\n keys = db.query(Key).filter(Key.owner_id == current_user.id).all()\n response_data = [\n KeyRead(\n id=key.id,\n owner_id=key.owner_id,\n name=key.name,\n created_at=key.created_at,", + "detail": "spectragraph-api.app.api.routes.keys", + "documentation": {} + }, + { + "label": "get_key_by_id", + "kind": 2, + "importPath": "spectragraph-api.app.api.routes.keys", + "description": "spectragraph-api.app.api.routes.keys", + "peekOfCode": "def get_key_by_id(\n id: UUID,\n db: Session = Depends(get_db),\n current_user: Profile = Depends(get_current_user),\n):\n key = db.query(Key).filter(Key.id == id, Key.owner_id == current_user.id).first()\n if not key:\n raise HTTPException(status_code=404, detail=\"Key not found\")\n # Create a response with obfuscated key\n response_data = KeyRead(", + "detail": "spectragraph-api.app.api.routes.keys", + "documentation": {} + }, + { + "label": "create_key", + "kind": 2, + "importPath": "spectragraph-api.app.api.routes.keys", + "description": "spectragraph-api.app.api.routes.keys", + "peekOfCode": "def create_key(\n payload: KeyCreate,\n db: Session = Depends(get_db),\n current_user: Profile = Depends(get_current_user),\n):\n try:\n vault = Vault(db=db, owner_id=current_user.id)\n key = vault.set_secret(vault_ref=payload.name, plain_key=payload.key)\n if not key:\n raise HTTPException(", + "detail": "spectragraph-api.app.api.routes.keys", + "documentation": {} + }, + { + "label": "delete_key", + "kind": 2, + "importPath": "spectragraph-api.app.api.routes.keys", + "description": "spectragraph-api.app.api.routes.keys", + "peekOfCode": "def delete_key(\n id: UUID,\n db: Session = Depends(get_db),\n current_user: Profile = Depends(get_current_user),\n):\n key = db.query(Key).filter(Key.id == id, Key.owner_id == current_user.id).first()\n if not key:\n raise HTTPException(status_code=404, detail=\"Key not found\")\n db.delete(key)\n db.commit()", + "detail": "spectragraph-api.app.api.routes.keys", + "documentation": {} + }, + { + "label": "router", + "kind": 5, + "importPath": "spectragraph-api.app.api.routes.keys", + "description": "spectragraph-api.app.api.routes.keys", + "peekOfCode": "router = APIRouter()\n# Get the list of all keys for a user, just the public method for viewing\n@router.get(\"\", response_model=List[KeyRead])\ndef get_keys(\n db: Session = Depends(get_db), current_user: Profile = Depends(get_current_user)\n):\n keys = db.query(Key).filter(Key.owner_id == current_user.id).all()\n response_data = [\n KeyRead(\n id=key.id,", + "detail": "spectragraph-api.app.api.routes.keys", + "documentation": {} + }, + { + "label": "get_scans", + "kind": 2, + "importPath": "spectragraph-api.app.api.routes.scan", + "description": "spectragraph-api.app.api.routes.scan", + "peekOfCode": "def get_scans(\n db: Session = Depends(get_db), current_user: Profile = Depends(get_current_user)\n):\n scans = db.query(Scan).all()\n return scans\n# Get a scan by ID\n@router.get(\"/{id}\", response_model=ScanRead)\ndef get_scan_by_id(\n id: UUID,\n db: Session = Depends(get_db),", + "detail": "spectragraph-api.app.api.routes.scan", + "documentation": {} + }, + { + "label": "get_scan_by_id", + "kind": 2, + "importPath": "spectragraph-api.app.api.routes.scan", + "description": "spectragraph-api.app.api.routes.scan", + "peekOfCode": "def get_scan_by_id(\n id: UUID,\n db: Session = Depends(get_db),\n current_user: Profile = Depends(get_current_user),\n):\n scan = db.query(Scan).filter(Scan.id == id).first()\n if not scan:\n raise HTTPException(status_code=404, detail=\"Transform not found\")\n return scan\n# Delete a scan by ID", + "detail": "spectragraph-api.app.api.routes.scan", + "documentation": {} + }, + { + "label": "delete_scan", + "kind": 2, + "importPath": "spectragraph-api.app.api.routes.scan", + "description": "spectragraph-api.app.api.routes.scan", + "peekOfCode": "def delete_scan(db: Session = Depends(get_db)):\n db.query(Scan).delete()\n db.commit()\n return None\n# Delete a scan by ID\n@router.delete(\"/{id}\", status_code=status.HTTP_204_NO_CONTENT)\ndef delete_scan(\n id: UUID,\n db: Session = Depends(get_db),\n current_user: Profile = Depends(get_current_user),", + "detail": "spectragraph-api.app.api.routes.scan", + "documentation": {} + }, + { + "label": "delete_scan", + "kind": 2, + "importPath": "spectragraph-api.app.api.routes.scan", + "description": "spectragraph-api.app.api.routes.scan", + "peekOfCode": "def delete_scan(\n id: UUID,\n db: Session = Depends(get_db),\n current_user: Profile = Depends(get_current_user),\n):\n scan = (\n db.query(Scan).filter(Scan.id == id, Scan.owner_id == current_user.id).first()\n )\n if not scan:\n raise HTTPException(status_code=404, detail=\"Scan not found\")", + "detail": "spectragraph-api.app.api.routes.scan", + "documentation": {} + }, + { + "label": "router", + "kind": 5, + "importPath": "spectragraph-api.app.api.routes.scan", + "description": "spectragraph-api.app.api.routes.scan", + "peekOfCode": "router = APIRouter()\n# Get the list of all scans\n@router.get(\n \"\",\n response_model=List[ScanRead],\n)\ndef get_scans(\n db: Session = Depends(get_db), current_user: Profile = Depends(get_current_user)\n):\n scans = db.query(Scan).all()", + "detail": "spectragraph-api.app.api.routes.scan", + "documentation": {} + }, + { + "label": "NodeData", + "kind": 6, + "importPath": "spectragraph-api.app.api.routes.sketches", + "description": "spectragraph-api.app.api.routes.sketches", + "peekOfCode": "class NodeData(BaseModel):\n label: str = Field(default=\"Node\", description=\"Label/name of the node\")\n color: str = Field(default=\"Node\", description=\"Color of the node\")\n type: str = Field(default=\"Node\", description=\"Type of the node\")\n # Add any other specific data fields that might be common across nodes\n class Config:\n extra = \"allow\" # Accept any additional fields\nclass NodeInput(BaseModel):\n type: str = Field(..., description=\"Type of the node\")\n data: NodeData = Field(", + "detail": "spectragraph-api.app.api.routes.sketches", + "documentation": {} + }, + { + "label": "NodeInput", + "kind": 6, + "importPath": "spectragraph-api.app.api.routes.sketches", + "description": "spectragraph-api.app.api.routes.sketches", + "peekOfCode": "class NodeInput(BaseModel):\n type: str = Field(..., description=\"Type of the node\")\n data: NodeData = Field(\n default_factory=NodeData, description=\"Additional data for the node\"\n )\ndef dict_to_cypher_props(props: dict, prefix: str = \"\") -> str:\n return \", \".join(f\"{key}: ${prefix}{key}\" for key in props)\nclass NodeDeleteInput(BaseModel):\n nodeIds: List[str]\nclass NodeEditInput(BaseModel):", + "detail": "spectragraph-api.app.api.routes.sketches", + "documentation": {} + }, + { + "label": "NodeDeleteInput", + "kind": 6, + "importPath": "spectragraph-api.app.api.routes.sketches", + "description": "spectragraph-api.app.api.routes.sketches", + "peekOfCode": "class NodeDeleteInput(BaseModel):\n nodeIds: List[str]\nclass NodeEditInput(BaseModel):\n nodeId: str\n data: NodeData = Field(\n default_factory=NodeData, description=\"Updated data for the node\"\n )\nclass NodeMergeInput(BaseModel):\n id: str\n data: NodeData = Field(", + "detail": "spectragraph-api.app.api.routes.sketches", + "documentation": {} + }, + { + "label": "NodeEditInput", + "kind": 6, + "importPath": "spectragraph-api.app.api.routes.sketches", + "description": "spectragraph-api.app.api.routes.sketches", + "peekOfCode": "class NodeEditInput(BaseModel):\n nodeId: str\n data: NodeData = Field(\n default_factory=NodeData, description=\"Updated data for the node\"\n )\nclass NodeMergeInput(BaseModel):\n id: str\n data: NodeData = Field(\n default_factory=NodeData, description=\"Updated data for the node\"\n )", + "detail": "spectragraph-api.app.api.routes.sketches", + "documentation": {} + }, + { + "label": "NodeMergeInput", + "kind": 6, + "importPath": "spectragraph-api.app.api.routes.sketches", + "description": "spectragraph-api.app.api.routes.sketches", + "peekOfCode": "class NodeMergeInput(BaseModel):\n id: str\n data: NodeData = Field(\n default_factory=NodeData, description=\"Updated data for the node\"\n )\n@router.post(\"/create\", response_model=SketchRead, status_code=status.HTTP_201_CREATED)\ndef create_sketch(\n data: SketchCreate,\n db: Session = Depends(get_db),\n current_user: Profile = Depends(get_current_user),", + "detail": "spectragraph-api.app.api.routes.sketches", + "documentation": {} + }, + { + "label": "RelationInput", + "kind": 6, + "importPath": "spectragraph-api.app.api.routes.sketches", + "description": "spectragraph-api.app.api.routes.sketches", + "peekOfCode": "class RelationInput(BaseModel):\n source: str\n target: str\n type: Literal[\"one-way\", \"two-way\"]\n label: str = \"RELATED_TO\" # Optionnel : nom de la relation\n@router.post(\"/{sketch_id}/relations/add\")\n@update_sketch_timestamp\ndef add_edge(\n sketch_id: str,\n relation: RelationInput,", + "detail": "spectragraph-api.app.api.routes.sketches", + "documentation": {} + }, + { + "label": "EntityPreviewModel", + "kind": 6, + "importPath": "spectragraph-api.app.api.routes.sketches", + "description": "spectragraph-api.app.api.routes.sketches", + "peekOfCode": "class EntityPreviewModel(BaseModel):\n \"\"\"Preview model for a single entity.\"\"\"\n row_index: int\n data: Dict[str, Any]\n detected_type: str\n primary_value: str\n confidence: str\nclass AnalyzeFileResponse(BaseModel):\n \"\"\"Response model for file analysis.\"\"\"\n entities: List[EntityPreviewModel]", + "detail": "spectragraph-api.app.api.routes.sketches", + "documentation": {} + }, + { + "label": "AnalyzeFileResponse", + "kind": 6, + "importPath": "spectragraph-api.app.api.routes.sketches", + "description": "spectragraph-api.app.api.routes.sketches", + "peekOfCode": "class AnalyzeFileResponse(BaseModel):\n \"\"\"Response model for file analysis.\"\"\"\n entities: List[EntityPreviewModel]\n total_entities: int\n type_distribution: Dict[str, int]\n columns: List[str]\n@router.post(\"/{sketch_id}/import/analyze\", response_model=AnalyzeFileResponse)\nasync def analyze_import_file(\n sketch_id: str,\n file: UploadFile = File(...),", + "detail": "spectragraph-api.app.api.routes.sketches", + "documentation": {} + }, + { + "label": "EntityMapping", + "kind": 6, + "importPath": "spectragraph-api.app.api.routes.sketches", + "description": "spectragraph-api.app.api.routes.sketches", + "peekOfCode": "class EntityMapping(BaseModel):\n \"\"\"Mapping configuration for an entity (row).\"\"\"\n row_index: int\n entity_type: str\n include: bool = True\n label: Optional[str] = None\n data: Optional[Dict[str, Any]] = None # Edited data from frontend\nclass ImportExecuteResponse(BaseModel):\n \"\"\"Response model for import execution.\"\"\"\n status: str", + "detail": "spectragraph-api.app.api.routes.sketches", + "documentation": {} + }, + { + "label": "ImportExecuteResponse", + "kind": 6, + "importPath": "spectragraph-api.app.api.routes.sketches", + "description": "spectragraph-api.app.api.routes.sketches", + "peekOfCode": "class ImportExecuteResponse(BaseModel):\n \"\"\"Response model for import execution.\"\"\"\n status: str\n nodes_created: int\n nodes_skipped: int\n errors: List[str]\n@router.post(\"/{sketch_id}/import/execute\", response_model=ImportExecuteResponse)\n@update_sketch_timestamp\nasync def execute_import(\n sketch_id: str,", + "detail": "spectragraph-api.app.api.routes.sketches", + "documentation": {} + }, + { + "label": "dict_to_cypher_props", + "kind": 2, + "importPath": "spectragraph-api.app.api.routes.sketches", + "description": "spectragraph-api.app.api.routes.sketches", + "peekOfCode": "def dict_to_cypher_props(props: dict, prefix: str = \"\") -> str:\n return \", \".join(f\"{key}: ${prefix}{key}\" for key in props)\nclass NodeDeleteInput(BaseModel):\n nodeIds: List[str]\nclass NodeEditInput(BaseModel):\n nodeId: str\n data: NodeData = Field(\n default_factory=NodeData, description=\"Updated data for the node\"\n )\nclass NodeMergeInput(BaseModel):", + "detail": "spectragraph-api.app.api.routes.sketches", + "documentation": {} + }, + { + "label": "create_sketch", + "kind": 2, + "importPath": "spectragraph-api.app.api.routes.sketches", + "description": "spectragraph-api.app.api.routes.sketches", + "peekOfCode": "def create_sketch(\n data: SketchCreate,\n db: Session = Depends(get_db),\n current_user: Profile = Depends(get_current_user),\n):\n sketch_data = data.dict()\n check_investigation_permission(\n current_user.id, sketch_data.get(\"investigation_id\"), actions=[\"create\"], db=db\n )\n sketch_data[\"owner_id\"] = current_user.id", + "detail": "spectragraph-api.app.api.routes.sketches", + "documentation": {} + }, + { + "label": "list_sketches", + "kind": 2, + "importPath": "spectragraph-api.app.api.routes.sketches", + "description": "spectragraph-api.app.api.routes.sketches", + "peekOfCode": "def list_sketches(\n db: Session = Depends(get_db), current_user: Profile = Depends(get_current_user)\n):\n return db.query(Sketch).filter(Sketch.owner_id == current_user.id).all()\n@router.get(\"/{sketch_id}\")\ndef get_sketch_by_id(\n sketch_id: UUID,\n db: Session = Depends(get_db),\n current_user: Profile = Depends(get_current_user),\n):", + "detail": "spectragraph-api.app.api.routes.sketches", + "documentation": {} + }, + { + "label": "get_sketch_by_id", + "kind": 2, + "importPath": "spectragraph-api.app.api.routes.sketches", + "description": "spectragraph-api.app.api.routes.sketches", + "peekOfCode": "def get_sketch_by_id(\n sketch_id: UUID,\n db: Session = Depends(get_db),\n current_user: Profile = Depends(get_current_user),\n):\n sketch = db.query(Sketch).filter(Sketch.id == sketch_id).first()\n if not sketch:\n raise HTTPException(status_code=404, detail=\"Sketch not found\")\n check_investigation_permission(\n current_user.id, sketch.investigation_id, actions=[\"read\"], db=db", + "detail": "spectragraph-api.app.api.routes.sketches", + "documentation": {} + }, + { + "label": "update_sketch", + "kind": 2, + "importPath": "spectragraph-api.app.api.routes.sketches", + "description": "spectragraph-api.app.api.routes.sketches", + "peekOfCode": "def update_sketch(\n id: UUID,\n payload: SketchUpdate,\n db: Session = Depends(get_db),\n current_user: Profile = Depends(get_current_user),\n):\n sketch = (\n db.query(Sketch)\n .filter(Sketch.id == id)\n .first()", + "detail": "spectragraph-api.app.api.routes.sketches", + "documentation": {} + }, + { + "label": "delete_sketch", + "kind": 2, + "importPath": "spectragraph-api.app.api.routes.sketches", + "description": "spectragraph-api.app.api.routes.sketches", + "peekOfCode": "def delete_sketch(\n id: UUID,\n db: Session = Depends(get_db),\n current_user: Profile = Depends(get_current_user),\n):\n sketch = (\n db.query(Sketch)\n .filter(Sketch.id == id)\n .first()\n )", + "detail": "spectragraph-api.app.api.routes.sketches", + "documentation": {} + }, + { + "label": "add_node", + "kind": 2, + "importPath": "spectragraph-api.app.api.routes.sketches", + "description": "spectragraph-api.app.api.routes.sketches", + "peekOfCode": "def add_node(\n sketch_id: str,\n node: NodeInput,\n background_tasks: BackgroundTasks,\n db: Session = Depends(get_db),\n current_user: Profile = Depends(get_current_user),\n):\n sketch = db.query(Sketch).filter(Sketch.id == sketch_id).first()\n if not sketch:\n raise HTTPException(status_code=404, detail=\"Sketch not found\")", + "detail": "spectragraph-api.app.api.routes.sketches", + "documentation": {} + }, + { + "label": "add_edge", + "kind": 2, + "importPath": "spectragraph-api.app.api.routes.sketches", + "description": "spectragraph-api.app.api.routes.sketches", + "peekOfCode": "def add_edge(\n sketch_id: str,\n relation: RelationInput,\n background_tasks: BackgroundTasks,\n db: Session = Depends(get_db),\n current_user: Profile = Depends(get_current_user),\n):\n sketch = db.query(Sketch).filter(Sketch.id == sketch_id).first()\n if not sketch:\n raise HTTPException(status_code=404, detail=\"Sketch not found\")", + "detail": "spectragraph-api.app.api.routes.sketches", + "documentation": {} + }, + { + "label": "edit_node", + "kind": 2, + "importPath": "spectragraph-api.app.api.routes.sketches", + "description": "spectragraph-api.app.api.routes.sketches", + "peekOfCode": "def edit_node(\n sketch_id: str,\n node_edit: NodeEditInput,\n background_tasks: BackgroundTasks,\n db: Session = Depends(get_db),\n current_user: Profile = Depends(get_current_user),\n):\n # First verify the sketch exists and belongs to the user\n sketch = db.query(Sketch).filter(Sketch.id == sketch_id).first()\n if not sketch:", + "detail": "spectragraph-api.app.api.routes.sketches", + "documentation": {} + }, + { + "label": "delete_nodes", + "kind": 2, + "importPath": "spectragraph-api.app.api.routes.sketches", + "description": "spectragraph-api.app.api.routes.sketches", + "peekOfCode": "def delete_nodes(\n sketch_id: str,\n nodes: NodeDeleteInput,\n background_tasks: BackgroundTasks,\n db: Session = Depends(get_db),\n current_user: Profile = Depends(get_current_user),\n):\n # First verify the sketch exists and belongs to the user\n sketch = db.query(Sketch).filter(Sketch.id == sketch_id).first()\n if not sketch:", + "detail": "spectragraph-api.app.api.routes.sketches", + "documentation": {} + }, + { + "label": "merge_nodes", + "kind": 2, + "importPath": "spectragraph-api.app.api.routes.sketches", + "description": "spectragraph-api.app.api.routes.sketches", + "peekOfCode": "def merge_nodes(\n sketch_id: str,\n oldNodes: List[str],\n newNode: NodeMergeInput,\n background_tasks: BackgroundTasks,\n db: Session = Depends(get_db),\n current_user: Profile = Depends(get_current_user),\n):\n # 1. Verify the sketch exists\n sketch = db.query(Sketch).filter(Sketch.id == sketch_id).first()", + "detail": "spectragraph-api.app.api.routes.sketches", + "documentation": {} + }, + { + "label": "get_related_nodes", + "kind": 2, + "importPath": "spectragraph-api.app.api.routes.sketches", + "description": "spectragraph-api.app.api.routes.sketches", + "peekOfCode": "def get_related_nodes(\n sketch_id: str,\n node_id: str,\n db: Session = Depends(get_db),\n current_user: Profile = Depends(get_current_user)\n):\n # First verify the sketch exists and belongs to the user\n sketch = db.query(Sketch).filter(Sketch.id == sketch_id).first()\n if not sketch:\n raise HTTPException(status_code=404, detail=\"Sketch not found\")", + "detail": "spectragraph-api.app.api.routes.sketches", + "documentation": {} + }, + { + "label": "router", + "kind": 5, + "importPath": "spectragraph-api.app.api.routes.sketches", + "description": "spectragraph-api.app.api.routes.sketches", + "peekOfCode": "router = APIRouter()\nclass NodeData(BaseModel):\n label: str = Field(default=\"Node\", description=\"Label/name of the node\")\n color: str = Field(default=\"Node\", description=\"Color of the node\")\n type: str = Field(default=\"Node\", description=\"Type of the node\")\n # Add any other specific data fields that might be common across nodes\n class Config:\n extra = \"allow\" # Accept any additional fields\nclass NodeInput(BaseModel):\n type: str = Field(..., description=\"Type of the node\")", + "detail": "spectragraph-api.app.api.routes.sketches", + "documentation": {} + }, + { + "label": "FlowComputationRequest", + "kind": 6, + "importPath": "spectragraph-api.app.api.routes.transforms", + "description": "spectragraph-api.app.api.routes.transforms", + "peekOfCode": "class FlowComputationRequest(BaseModel):\n nodes: List[Node]\n edges: List[Edge]\n inputType: Optional[str] = None\nclass FlowComputationResponse(BaseModel):\n flowBranches: List[FlowBranch]\n initialData: Any\nclass StepSimulationRequest(BaseModel):\n flowBranches: List[FlowBranch]\n currentStepIndex: int", + "detail": "spectragraph-api.app.api.routes.transforms", + "documentation": {} + }, + { + "label": "FlowComputationResponse", + "kind": 6, + "importPath": "spectragraph-api.app.api.routes.transforms", + "description": "spectragraph-api.app.api.routes.transforms", + "peekOfCode": "class FlowComputationResponse(BaseModel):\n flowBranches: List[FlowBranch]\n initialData: Any\nclass StepSimulationRequest(BaseModel):\n flowBranches: List[FlowBranch]\n currentStepIndex: int\nclass launchTransformPayload(BaseModel):\n values: List[str]\n sketch_id: str\nrouter = APIRouter()", + "detail": "spectragraph-api.app.api.routes.transforms", + "documentation": {} + }, + { + "label": "StepSimulationRequest", + "kind": 6, + "importPath": "spectragraph-api.app.api.routes.transforms", + "description": "spectragraph-api.app.api.routes.transforms", + "peekOfCode": "class StepSimulationRequest(BaseModel):\n flowBranches: List[FlowBranch]\n currentStepIndex: int\nclass launchTransformPayload(BaseModel):\n values: List[str]\n sketch_id: str\nrouter = APIRouter()\n# Get the list of all transforms\n@router.get(\"/\")\ndef get_transforms(", + "detail": "spectragraph-api.app.api.routes.transforms", + "documentation": {} + }, + { + "label": "launchTransformPayload", + "kind": 6, + "importPath": "spectragraph-api.app.api.routes.transforms", + "description": "spectragraph-api.app.api.routes.transforms", + "peekOfCode": "class launchTransformPayload(BaseModel):\n values: List[str]\n sketch_id: str\nrouter = APIRouter()\n# Get the list of all transforms\n@router.get(\"/\")\ndef get_transforms(\n category: Optional[str] = Query(None),\n db: Session = Depends(get_db),\n current_user: Profile = Depends(get_current_user),", + "detail": "spectragraph-api.app.api.routes.transforms", + "documentation": {} + }, + { + "label": "get_transforms", + "kind": 2, + "importPath": "spectragraph-api.app.api.routes.transforms", + "description": "spectragraph-api.app.api.routes.transforms", + "peekOfCode": "def get_transforms(\n category: Optional[str] = Query(None),\n db: Session = Depends(get_db),\n current_user: Profile = Depends(get_current_user),\n):\n if not category or category.lower() == \"undefined\":\n return TransformRegistry.list(exclude=[\"n8n_connector\"])\n # Si catégorie custom\n custom_type = (\n db.query(CustomType)", + "detail": "spectragraph-api.app.api.routes.transforms", + "documentation": {} + }, + { + "label": "router", + "kind": 5, + "importPath": "spectragraph-api.app.api.routes.transforms", + "description": "spectragraph-api.app.api.routes.transforms", + "peekOfCode": "router = APIRouter()\n# Get the list of all transforms\n@router.get(\"/\")\ndef get_transforms(\n category: Optional[str] = Query(None),\n db: Session = Depends(get_db),\n current_user: Profile = Depends(get_current_user),\n):\n if not category or category.lower() == \"undefined\":\n return TransformRegistry.list(exclude=[\"n8n_connector\"])", + "detail": "spectragraph-api.app.api.routes.transforms", + "documentation": {} + }, + { + "label": "extract_input_schema", + "kind": 2, + "importPath": "spectragraph-api.app.api.routes.types", + "description": "spectragraph-api.app.api.routes.types", + "peekOfCode": "def extract_input_schema(\n model: Type[BaseModel], label_key: str, icon: Optional[str] = None\n) -> Dict[str, Any]:\n adapter = TypeAdapter(model)\n schema = adapter.json_schema()\n # Use the main schema properties, not the $defs\n type_name = model.__name__\n details = schema\n return {\n \"id\": uuid4(),", + "detail": "spectragraph-api.app.api.routes.types", + "documentation": {} + }, + { + "label": "resolve_field", + "kind": 2, + "importPath": "spectragraph-api.app.api.routes.types", + "description": "spectragraph-api.app.api.routes.types", + "peekOfCode": "def resolve_field(prop: str, details: dict, schema: dict = None) -> Dict:\n \"\"\"_summary_\n The fields can sometimes contain nested complex objects, like:\n - Organization having Individual[] as dirigeants, so we want to skip those.\n Args:\n details (dict): _description_\n schema_context (dict, optional): _description_. Defaults to None.\n Returns:\n str: _description_\n \"\"\"", + "detail": "spectragraph-api.app.api.routes.types", + "documentation": {} + }, + { + "label": "has_enum", + "kind": 2, + "importPath": "spectragraph-api.app.api.routes.types", + "description": "spectragraph-api.app.api.routes.types", + "peekOfCode": "def has_enum(schema: dict) -> bool:\n any_of = schema.get(\"anyOf\", [])\n return any(isinstance(entry, dict) and \"enum\" in entry for entry in any_of)\ndef is_required(schema: dict) -> bool:\n any_of = schema.get(\"anyOf\", [])\n return not any(entry == {\"type\": \"null\"} for entry in any_of)\ndef get_enum_values(schema: dict) -> list:\n enum_values = []\n for entry in schema.get(\"anyOf\", []):\n if isinstance(entry, dict) and \"enum\" in entry:", + "detail": "spectragraph-api.app.api.routes.types", + "documentation": {} + }, + { + "label": "is_required", + "kind": 2, + "importPath": "spectragraph-api.app.api.routes.types", + "description": "spectragraph-api.app.api.routes.types", + "peekOfCode": "def is_required(schema: dict) -> bool:\n any_of = schema.get(\"anyOf\", [])\n return not any(entry == {\"type\": \"null\"} for entry in any_of)\ndef get_enum_values(schema: dict) -> list:\n enum_values = []\n for entry in schema.get(\"anyOf\", []):\n if isinstance(entry, dict) and \"enum\" in entry:\n enum_values.extend(entry[\"enum\"])\n return enum_values", + "detail": "spectragraph-api.app.api.routes.types", + "documentation": {} + }, + { + "label": "get_enum_values", + "kind": 2, + "importPath": "spectragraph-api.app.api.routes.types", + "description": "spectragraph-api.app.api.routes.types", + "peekOfCode": "def get_enum_values(schema: dict) -> list:\n enum_values = []\n for entry in schema.get(\"anyOf\", []):\n if isinstance(entry, dict) and \"enum\" in entry:\n enum_values.extend(entry[\"enum\"])\n return enum_values", + "detail": "spectragraph-api.app.api.routes.types", + "documentation": {} + }, + { + "label": "router", + "kind": 5, + "importPath": "spectragraph-api.app.api.routes.types", + "description": "spectragraph-api.app.api.routes.types", + "peekOfCode": "router = APIRouter()\n# Returns the \"types\" for the sketches\n@router.get(\"/\")\nasync def get_types_list(\n db: Session = Depends(get_db),\n current_user: Profile = Depends(get_current_user)\n):\n types = [\n {\n \"id\": uuid4(),", + "detail": "spectragraph-api.app.api.routes.types", + "documentation": {} + }, + { + "label": "AnalysisCreate", + "kind": 6, + "importPath": "spectragraph-api.app.api.schemas.analysis", + "description": "spectragraph-api.app.api.schemas.analysis", + "peekOfCode": "class AnalysisCreate(BaseModel):\n title: str\n description: Optional[str] = None\n content: Optional[Any] = None\n owner_id: Optional[UUID4] = None\n investigation_id: Optional[UUID4] = None\nclass AnalysisRead(ORMBase):\n id: UUID4\n title: str\n description: Optional[str]", + "detail": "spectragraph-api.app.api.schemas.analysis", + "documentation": {} + }, + { + "label": "AnalysisRead", + "kind": 6, + "importPath": "spectragraph-api.app.api.schemas.analysis", + "description": "spectragraph-api.app.api.schemas.analysis", + "peekOfCode": "class AnalysisRead(ORMBase):\n id: UUID4\n title: str\n description: Optional[str]\n content: Optional[Any]\n created_at: datetime\n last_updated_at: datetime\n owner_id: Optional[UUID4]\n investigation_id: Optional[UUID4]\nclass AnalysisUpdate(BaseModel):", + "detail": "spectragraph-api.app.api.schemas.analysis", + "documentation": {} + }, + { + "label": "AnalysisUpdate", + "kind": 6, + "importPath": "spectragraph-api.app.api.schemas.analysis", + "description": "spectragraph-api.app.api.schemas.analysis", + "peekOfCode": "class AnalysisUpdate(BaseModel):\n title: Optional[str] = None\n description: Optional[str] = None\n content: Optional[Any] = None\n last_updated_at: Optional[datetime] = None\n owner_id: Optional[UUID4] = None\n investigation_id: Optional[UUID4] = None\nclass PaginationMetadata(BaseModel):\n total_count: int\n limit: int", + "detail": "spectragraph-api.app.api.schemas.analysis", + "documentation": {} + }, + { + "label": "PaginationMetadata", + "kind": 6, + "importPath": "spectragraph-api.app.api.schemas.analysis", + "description": "spectragraph-api.app.api.schemas.analysis", + "peekOfCode": "class PaginationMetadata(BaseModel):\n total_count: int\n limit: int\n skip: int\n has_next: bool\nclass AnalysisListResponse(BaseModel):\n items: List[AnalysisRead]\n metadata: PaginationMetadata", + "detail": "spectragraph-api.app.api.schemas.analysis", + "documentation": {} + }, + { + "label": "AnalysisListResponse", + "kind": 6, + "importPath": "spectragraph-api.app.api.schemas.analysis", + "description": "spectragraph-api.app.api.schemas.analysis", + "peekOfCode": "class AnalysisListResponse(BaseModel):\n items: List[AnalysisRead]\n metadata: PaginationMetadata", + "detail": "spectragraph-api.app.api.schemas.analysis", + "documentation": {} + }, + { + "label": "ORMBase", + "kind": 6, + "importPath": "spectragraph-api.app.api.schemas.base", + "description": "spectragraph-api.app.api.schemas.base", + "peekOfCode": "class ORMBase(BaseModel):\n class Config:\n from_attributes = True", + "detail": "spectragraph-api.app.api.schemas.base", + "documentation": {} + }, + { + "label": "ChatMessageRead", + "kind": 6, + "importPath": "spectragraph-api.app.api.schemas.chat", + "description": "spectragraph-api.app.api.schemas.chat", + "peekOfCode": "class ChatMessageRead(BaseModel):\n id: UUID4\n content: Optional[Any] = None\n is_bot: bool\n created_at: datetime\n chat_id: UUID4\n context: Optional[Any] = None\n class Config:\n from_attributes = True\nclass ChatCreate(BaseModel):", + "detail": "spectragraph-api.app.api.schemas.chat", + "documentation": {} + }, + { + "label": "ChatCreate", + "kind": 6, + "importPath": "spectragraph-api.app.api.schemas.chat", + "description": "spectragraph-api.app.api.schemas.chat", + "peekOfCode": "class ChatCreate(BaseModel):\n title: str\n description: Optional[str] = None\n owner_id: Optional[UUID4] = None\n investigation_id: Optional[UUID4] = None\nclass ChatRead(ORMBase):\n id: UUID4\n title: str\n description: Optional[str]\n created_at: datetime", + "detail": "spectragraph-api.app.api.schemas.chat", + "documentation": {} + }, + { + "label": "ChatRead", + "kind": 6, + "importPath": "spectragraph-api.app.api.schemas.chat", + "description": "spectragraph-api.app.api.schemas.chat", + "peekOfCode": "class ChatRead(ORMBase):\n id: UUID4\n title: str\n description: Optional[str]\n created_at: datetime\n last_updated_at: datetime\n owner_id: Optional[UUID4]\n investigation_id: Optional[UUID4]\n messages: List[ChatMessageRead]", + "detail": "spectragraph-api.app.api.schemas.chat", + "documentation": {} + }, + { + "label": "CustomTypeCreate", + "kind": 6, + "importPath": "spectragraph-api.app.api.schemas.custom_type", + "description": "spectragraph-api.app.api.schemas.custom_type", + "peekOfCode": "class CustomTypeCreate(BaseModel):\n \"\"\"Schema for creating a new custom type.\"\"\"\n name: str = Field(..., min_length=1, max_length=255, description=\"Name of the custom type\")\n json_schema: Dict[str, Any] = Field(..., description=\"JSON Schema definition\", alias=\"schema\")\n description: Optional[str] = Field(None, description=\"Optional description of the custom type\")\n status: Optional[str] = Field(\"draft\", description=\"Status: draft or published\")\n class Config:\n populate_by_name = True\n @field_validator('status')\n @classmethod", + "detail": "spectragraph-api.app.api.schemas.custom_type", + "documentation": {} + }, + { + "label": "CustomTypeUpdate", + "kind": 6, + "importPath": "spectragraph-api.app.api.schemas.custom_type", + "description": "spectragraph-api.app.api.schemas.custom_type", + "peekOfCode": "class CustomTypeUpdate(BaseModel):\n \"\"\"Schema for updating an existing custom type.\"\"\"\n name: Optional[str] = Field(None, min_length=1, max_length=255)\n json_schema: Optional[Dict[str, Any]] = Field(None, alias=\"schema\")\n description: Optional[str] = None\n status: Optional[str] = None\n class Config:\n populate_by_name = True\n @field_validator('status')\n @classmethod", + "detail": "spectragraph-api.app.api.schemas.custom_type", + "documentation": {} + }, + { + "label": "CustomTypeRead", + "kind": 6, + "importPath": "spectragraph-api.app.api.schemas.custom_type", + "description": "spectragraph-api.app.api.schemas.custom_type", + "peekOfCode": "class CustomTypeRead(ORMBase):\n \"\"\"Schema for reading a custom type.\"\"\"\n id: UUID4\n name: str\n owner_id: UUID4\n json_schema: Dict[str, Any] = Field(..., alias=\"schema\")\n status: str\n checksum: Optional[str]\n description: Optional[str]\n created_at: datetime", + "detail": "spectragraph-api.app.api.schemas.custom_type", + "documentation": {} + }, + { + "label": "CustomTypeValidatePayload", + "kind": 6, + "importPath": "spectragraph-api.app.api.schemas.custom_type", + "description": "spectragraph-api.app.api.schemas.custom_type", + "peekOfCode": "class CustomTypeValidatePayload(BaseModel):\n \"\"\"Schema for validating a payload against a custom type schema.\"\"\"\n payload: Dict[str, Any] = Field(..., description=\"Data to validate against the schema\")\nclass CustomTypeValidateResponse(BaseModel):\n \"\"\"Response schema for validation.\"\"\"\n valid: bool\n errors: Optional[list[str]] = None", + "detail": "spectragraph-api.app.api.schemas.custom_type", + "documentation": {} + }, + { + "label": "CustomTypeValidateResponse", + "kind": 6, + "importPath": "spectragraph-api.app.api.schemas.custom_type", + "description": "spectragraph-api.app.api.schemas.custom_type", + "peekOfCode": "class CustomTypeValidateResponse(BaseModel):\n \"\"\"Response schema for validation.\"\"\"\n valid: bool\n errors: Optional[list[str]] = None", + "detail": "spectragraph-api.app.api.schemas.custom_type", + "documentation": {} + }, + { + "label": "FeedbackCreate", + "kind": 6, + "importPath": "spectragraph-api.app.api.schemas.feedback", + "description": "spectragraph-api.app.api.schemas.feedback", + "peekOfCode": "class FeedbackCreate(BaseModel):\n content: Optional[str] = None\n owner_id: Optional[UUID4] = None\nclass FeedbackRead(ORMBase):\n id: int\n created_at: datetime\n content: Optional[str] = None\n owner_id: Optional[UUID4]", + "detail": "spectragraph-api.app.api.schemas.feedback", + "documentation": {} + }, + { + "label": "FeedbackRead", + "kind": 6, + "importPath": "spectragraph-api.app.api.schemas.feedback", + "description": "spectragraph-api.app.api.schemas.feedback", + "peekOfCode": "class FeedbackRead(ORMBase):\n id: int\n created_at: datetime\n content: Optional[str] = None\n owner_id: Optional[UUID4]", + "detail": "spectragraph-api.app.api.schemas.feedback", + "documentation": {} + }, + { + "label": "FlowCreate", + "kind": 6, + "importPath": "spectragraph-api.app.api.schemas.flow", + "description": "spectragraph-api.app.api.schemas.flow", + "peekOfCode": "class FlowCreate(BaseModel):\n name: str\n description: Optional[str] = None\n category: Optional[List[str]] = None\n flow_schema: Optional[Dict[str, Any]] = None\nclass FlowRead(ORMBase):\n id: UUID4\n name: str\n description: Optional[str]\n category: Optional[List[str]]", + "detail": "spectragraph-api.app.api.schemas.flow", + "documentation": {} + }, + { + "label": "FlowRead", + "kind": 6, + "importPath": "spectragraph-api.app.api.schemas.flow", + "description": "spectragraph-api.app.api.schemas.flow", + "peekOfCode": "class FlowRead(ORMBase):\n id: UUID4\n name: str\n description: Optional[str]\n category: Optional[List[str]]\n flow_schema: Optional[Dict[str, Any]]\n created_at: datetime\n last_updated_at: datetime\nclass FlowUpdate(BaseModel):\n name: Optional[str] = None", + "detail": "spectragraph-api.app.api.schemas.flow", + "documentation": {} + }, + { + "label": "FlowUpdate", + "kind": 6, + "importPath": "spectragraph-api.app.api.schemas.flow", + "description": "spectragraph-api.app.api.schemas.flow", + "peekOfCode": "class FlowUpdate(BaseModel):\n name: Optional[str] = None\n description: Optional[str] = None\n category: Optional[List[str]] = None\n flow_schema: Optional[Dict[str, Any]] = None", + "detail": "spectragraph-api.app.api.schemas.flow", + "documentation": {} + }, + { + "label": "InvestigationCreate", + "kind": 6, + "importPath": "spectragraph-api.app.api.schemas.investigation", + "description": "spectragraph-api.app.api.schemas.investigation", + "peekOfCode": "class InvestigationCreate(BaseModel):\n name: str\n description: str\n owner_id: Optional[UUID4] = None\n status: Optional[str] = \"active\"\nclass InvestigationRead(ORMBase):\n id: UUID4\n created_at: datetime\n name: str\n description: str", + "detail": "spectragraph-api.app.api.schemas.investigation", + "documentation": {} + }, + { + "label": "InvestigationRead", + "kind": 6, + "importPath": "spectragraph-api.app.api.schemas.investigation", + "description": "spectragraph-api.app.api.schemas.investigation", + "peekOfCode": "class InvestigationRead(ORMBase):\n id: UUID4\n created_at: datetime\n name: str\n description: str\n owner_id: Optional[UUID4]\n last_updated_at: datetime\n status: str\n owner: Optional[ProfileRead] = None\n sketches: list[SketchRead] = []", + "detail": "spectragraph-api.app.api.schemas.investigation", + "documentation": {} + }, + { + "label": "InvestigationProfileCreate", + "kind": 6, + "importPath": "spectragraph-api.app.api.schemas.investigation", + "description": "spectragraph-api.app.api.schemas.investigation", + "peekOfCode": "class InvestigationProfileCreate(BaseModel):\n investigation_id: UUID4\n profile_id: UUID4\n role: Optional[str] = \"member\"\nclass InvestigationProfileRead(ORMBase):\n id: int\n created_at: datetime\n investigation_id: UUID4\n profile_id: UUID4\n role: str", + "detail": "spectragraph-api.app.api.schemas.investigation", + "documentation": {} + }, + { + "label": "InvestigationProfileRead", + "kind": 6, + "importPath": "spectragraph-api.app.api.schemas.investigation", + "description": "spectragraph-api.app.api.schemas.investigation", + "peekOfCode": "class InvestigationProfileRead(ORMBase):\n id: int\n created_at: datetime\n investigation_id: UUID4\n profile_id: UUID4\n role: str\nclass InvestigationUpdate(BaseModel):\n name: str\n description: Optional[str] = None\n last_updated_at: datetime", + "detail": "spectragraph-api.app.api.schemas.investigation", + "documentation": {} + }, + { + "label": "InvestigationUpdate", + "kind": 6, + "importPath": "spectragraph-api.app.api.schemas.investigation", + "description": "spectragraph-api.app.api.schemas.investigation", + "peekOfCode": "class InvestigationUpdate(BaseModel):\n name: str\n description: Optional[str] = None\n last_updated_at: datetime\n status: str", + "detail": "spectragraph-api.app.api.schemas.investigation", + "documentation": {} + }, + { + "label": "InvestigationProfileCreate", + "kind": 6, + "importPath": "spectragraph-api.app.api.schemas.investigation_profiles", + "description": "spectragraph-api.app.api.schemas.investigation_profiles", + "peekOfCode": "class InvestigationProfileCreate(BaseModel):\n investigation_id: UUID4\n profile_id: UUID4\n role: Optional[str] = \"member\"\nclass InvestigationProfileRead(ORMBase):\n id: int\n created_at: datetime\n investigation_id: UUID4\n profile_id: UUID4\n role: str", + "detail": "spectragraph-api.app.api.schemas.investigation_profiles", + "documentation": {} + }, + { + "label": "InvestigationProfileRead", + "kind": 6, + "importPath": "spectragraph-api.app.api.schemas.investigation_profiles", + "description": "spectragraph-api.app.api.schemas.investigation_profiles", + "peekOfCode": "class InvestigationProfileRead(ORMBase):\n id: int\n created_at: datetime\n investigation_id: UUID4\n profile_id: UUID4\n role: str", + "detail": "spectragraph-api.app.api.schemas.investigation_profiles", + "documentation": {} + }, + { + "label": "KeyCreate", + "kind": 6, + "importPath": "spectragraph-api.app.api.schemas.key", + "description": "spectragraph-api.app.api.schemas.key", + "peekOfCode": "class KeyCreate(BaseModel):\n key: str\n name: str\nclass KeyRead(ORMBase):\n id: UUID4\n owner_id: UUID4\n name: str\n created_at: datetime", + "detail": "spectragraph-api.app.api.schemas.key", + "documentation": {} + }, + { + "label": "KeyRead", + "kind": 6, + "importPath": "spectragraph-api.app.api.schemas.key", + "description": "spectragraph-api.app.api.schemas.key", + "peekOfCode": "class KeyRead(ORMBase):\n id: UUID4\n owner_id: UUID4\n name: str\n created_at: datetime", + "detail": "spectragraph-api.app.api.schemas.key", + "documentation": {} + }, + { + "label": "ProfileCreate", + "kind": 6, + "importPath": "spectragraph-api.app.api.schemas.profile", + "description": "spectragraph-api.app.api.schemas.profile", + "peekOfCode": "class ProfileCreate(BaseModel):\n email: EmailStr\n password: str\nclass ProfileRead(ORMBase):\n id: UUID4\n first_name: Optional[str]\n last_name: Optional[str]\n avatar_url: Optional[str]", + "detail": "spectragraph-api.app.api.schemas.profile", + "documentation": {} + }, + { + "label": "ProfileRead", + "kind": 6, + "importPath": "spectragraph-api.app.api.schemas.profile", + "description": "spectragraph-api.app.api.schemas.profile", + "peekOfCode": "class ProfileRead(ORMBase):\n id: UUID4\n first_name: Optional[str]\n last_name: Optional[str]\n avatar_url: Optional[str]", + "detail": "spectragraph-api.app.api.schemas.profile", + "documentation": {} + }, + { + "label": "ScanCreate", + "kind": 6, + "importPath": "spectragraph-api.app.api.schemas.scan", + "description": "spectragraph-api.app.api.schemas.scan", + "peekOfCode": "class ScanCreate(BaseModel):\n values: Optional[List[str]] = None\n sketch_id: Optional[UUID4] = None\n status: Optional[str] = None\n results: Optional[Any] = None\nclass ScanRead(ORMBase):\n id: UUID4\n sketch_id: Optional[UUID4]\n status: Optional[str]", + "detail": "spectragraph-api.app.api.schemas.scan", + "documentation": {} + }, + { + "label": "ScanRead", + "kind": 6, + "importPath": "spectragraph-api.app.api.schemas.scan", + "description": "spectragraph-api.app.api.schemas.scan", + "peekOfCode": "class ScanRead(ORMBase):\n id: UUID4\n sketch_id: Optional[UUID4]\n status: Optional[str]", + "detail": "spectragraph-api.app.api.schemas.scan", + "documentation": {} + }, + { + "label": "SketchCreate", + "kind": 6, + "importPath": "spectragraph-api.app.api.schemas.sketch", + "description": "spectragraph-api.app.api.schemas.sketch", + "peekOfCode": "class SketchCreate(BaseModel):\n title: str\n description: str\n owner_id: Optional[UUID4] = None\n investigation_id: UUID4\n status: Optional[str] = \"active\"\nclass SketchRead(ORMBase):\n id: UUID4\n title: str\n description: str", + "detail": "spectragraph-api.app.api.schemas.sketch", + "documentation": {} + }, + { + "label": "SketchRead", + "kind": 6, + "importPath": "spectragraph-api.app.api.schemas.sketch", + "description": "spectragraph-api.app.api.schemas.sketch", + "peekOfCode": "class SketchRead(ORMBase):\n id: UUID4\n title: str\n description: str\n created_at: datetime\n owner_id: Optional[UUID4]\n investigation_id: UUID4\n last_updated_at: datetime\n status: str\nclass SketchProfileCreate(BaseModel):", + "detail": "spectragraph-api.app.api.schemas.sketch", + "documentation": {} + }, + { + "label": "SketchProfileCreate", + "kind": 6, + "importPath": "spectragraph-api.app.api.schemas.sketch", + "description": "spectragraph-api.app.api.schemas.sketch", + "peekOfCode": "class SketchProfileCreate(BaseModel):\n sketch_id: UUID4\n profile_id: UUID4\n role: Optional[str] = \"editor\"\nclass SketchProfileRead(ORMBase):\n id: int\n created_at: datetime\n sketch_id: UUID4\n profile_id: UUID4\n role: str", + "detail": "spectragraph-api.app.api.schemas.sketch", + "documentation": {} + }, + { + "label": "SketchProfileRead", + "kind": 6, + "importPath": "spectragraph-api.app.api.schemas.sketch", + "description": "spectragraph-api.app.api.schemas.sketch", + "peekOfCode": "class SketchProfileRead(ORMBase):\n id: int\n created_at: datetime\n sketch_id: UUID4\n profile_id: UUID4\n role: str\nclass SketchUpdate(BaseModel):\n title: Optional[str] = None\n description: Optional[str] = None\n owner_id: Optional[UUID] = None", + "detail": "spectragraph-api.app.api.schemas.sketch", + "documentation": {} + }, + { + "label": "SketchUpdate", + "kind": 6, + "importPath": "spectragraph-api.app.api.schemas.sketch", + "description": "spectragraph-api.app.api.schemas.sketch", + "peekOfCode": "class SketchUpdate(BaseModel):\n title: Optional[str] = None\n description: Optional[str] = None\n owner_id: Optional[UUID] = None\n status: Optional[str] = None\n investigation_id: Optional[UUID] = None\nclass SketchIn(BaseModel):\n title: Optional[str] = None\n description: Optional[str] = None\n owner_id: Optional[UUID] = None", + "detail": "spectragraph-api.app.api.schemas.sketch", + "documentation": {} + }, + { + "label": "SketchIn", + "kind": 6, + "importPath": "spectragraph-api.app.api.schemas.sketch", + "description": "spectragraph-api.app.api.schemas.sketch", + "peekOfCode": "class SketchIn(BaseModel):\n title: Optional[str] = None\n description: Optional[str] = None\n owner_id: Optional[UUID] = None\n status: Optional[str] = \"active\"\n investigation_id: UUID # requis", + "detail": "spectragraph-api.app.api.schemas.sketch", + "documentation": {} + }, + { + "label": "TransformCreate", + "kind": 6, + "importPath": "spectragraph-api.app.api.schemas.transform", + "description": "spectragraph-api.app.api.schemas.transform", + "peekOfCode": "class TransformCreate(BaseModel):\n name: str\n description: Optional[str] = None\n category: Optional[List[str]] = None\nclass TransformRead(ORMBase):\n id: UUID4\n name: str\n class_name: str\n description: Optional[str]\n category: Optional[List[str]]", + "detail": "spectragraph-api.app.api.schemas.transform", + "documentation": {} + }, + { + "label": "TransformRead", + "kind": 6, + "importPath": "spectragraph-api.app.api.schemas.transform", + "description": "spectragraph-api.app.api.schemas.transform", + "peekOfCode": "class TransformRead(ORMBase):\n id: UUID4\n name: str\n class_name: str\n description: Optional[str]\n category: Optional[List[str]]\n flow_schema: Optional[Dict[str, Any]]\nclass TransformUpdate(BaseModel):\n name: Optional[str] = None\n class_name: str = None", + "detail": "spectragraph-api.app.api.schemas.transform", + "documentation": {} + }, + { + "label": "TransformUpdate", + "kind": 6, + "importPath": "spectragraph-api.app.api.schemas.transform", + "description": "spectragraph-api.app.api.schemas.transform", + "peekOfCode": "class TransformUpdate(BaseModel):\n name: Optional[str] = None\n class_name: str = None\n description: Optional[str] = None\n category: Optional[List[str]] = None", + "detail": "spectragraph-api.app.api.schemas.transform", + "documentation": {} + }, + { + "label": "get_current_user", + "kind": 2, + "importPath": "spectragraph-api.app.api.deps", + "description": "spectragraph-api.app.api.deps", + "peekOfCode": "def get_current_user(\n token: str = Depends(oauth2_scheme), db: Session = Depends(get_db)\n) -> Profile:\n credentials_exception = HTTPException(\n status_code=status.HTTP_401_UNAUTHORIZED,\n detail=\"Could not validate credentials\",\n headers={\"WWW-Authenticate\": \"Bearer\"},\n )\n try:\n payload = jwt.decode(token, AUTH_SECRET, algorithms=[ALGORITHM])", + "detail": "spectragraph-api.app.api.deps", + "documentation": {} + }, + { + "label": "AUTH_SECRET", + "kind": 5, + "importPath": "spectragraph-api.app.api.deps", + "description": "spectragraph-api.app.api.deps", + "peekOfCode": "AUTH_SECRET = os.getenv(\"AUTH_SECRET\")\nload_dotenv()\noauth2_scheme = OAuth2PasswordBearer(tokenUrl=\"token\")\ndef get_current_user(\n token: str = Depends(oauth2_scheme), db: Session = Depends(get_db)\n) -> Profile:\n credentials_exception = HTTPException(\n status_code=status.HTTP_401_UNAUTHORIZED,\n detail=\"Could not validate credentials\",\n headers={\"WWW-Authenticate\": \"Bearer\"},", + "detail": "spectragraph-api.app.api.deps", + "documentation": {} + }, + { + "label": "oauth2_scheme", + "kind": 5, + "importPath": "spectragraph-api.app.api.deps", + "description": "spectragraph-api.app.api.deps", + "peekOfCode": "oauth2_scheme = OAuth2PasswordBearer(tokenUrl=\"token\")\ndef get_current_user(\n token: str = Depends(oauth2_scheme), db: Session = Depends(get_db)\n) -> Profile:\n credentials_exception = HTTPException(\n status_code=status.HTTP_401_UNAUTHORIZED,\n detail=\"Could not validate credentials\",\n headers={\"WWW-Authenticate\": \"Bearer\"},\n )\n try:", + "detail": "spectragraph-api.app.api.deps", + "documentation": {} + }, + { + "label": "update_sketch_last_modified", + "kind": 2, + "importPath": "spectragraph-api.app.api.sketch_utils", + "description": "spectragraph-api.app.api.sketch_utils", + "peekOfCode": "def update_sketch_last_modified(db: Session, sketch_id: str | UUID) -> None:\n \"\"\"\n Update the last_updated_at timestamp for a sketch and its parent investigation.\n This function is designed to be run as a background task to avoid\n blocking the response. It updates both the sketch's and its parent\n investigation's last_updated_at fields to the current time.\n Args:\n db: SQLAlchemy database session\n sketch_id: The ID of the sketch to update\n \"\"\"", + "detail": "spectragraph-api.app.api.sketch_utils", + "documentation": {} + }, + { + "label": "update_sketch_timestamp", + "kind": 2, + "importPath": "spectragraph-api.app.api.sketch_utils", + "description": "spectragraph-api.app.api.sketch_utils", + "peekOfCode": "def update_sketch_timestamp(func: Callable) -> Callable:\n \"\"\"\n Decorator to automatically update sketch's last_updated_at timestamp.\n This decorator:\n 1. Extracts the sketch_id from route parameters\n 2. Schedules a background task to update last_updated_at\n 3. Returns the response immediately (non-blocking)\n Usage:\n @router.post(\"/{sketch_id}/nodes/add\")\n @update_sketch_timestamp", + "detail": "spectragraph-api.app.api.sketch_utils", + "documentation": {} + }, + { + "label": "can_user", + "kind": 2, + "importPath": "spectragraph-api.app.security.permissions", + "description": "spectragraph-api.app.security.permissions", + "peekOfCode": "def can_user(roles: list[Role], actions: list[str]) -> bool:\n \"\"\"\n Vérifie si au moins un rôle de la liste autorise au moins une action de la liste.\n \"\"\"\n for role in roles:\n for action in actions:\n if role == Role.OWNER:\n return True\n if role == Role.EDITOR and action in [\"read\", \"create\", \"update\"]:\n return True", + "detail": "spectragraph-api.app.security.permissions", + "documentation": {} + }, + { + "label": "check_investigation_permission", + "kind": 2, + "importPath": "spectragraph-api.app.security.permissions", + "description": "spectragraph-api.app.security.permissions", + "peekOfCode": "def check_investigation_permission(user_id: str, investigation_id: str, actions: list[str], db):\n role_entry = (\n db.query(InvestigationUserRole)\n .filter_by(user_id=user_id, investigation_id=investigation_id)\n .first()\n )\n if not role_entry or not can_user(role_entry.roles, actions):\n raise HTTPException(status_code=403, detail=\"Forbidden\")\n return True", + "detail": "spectragraph-api.app.security.permissions", + "documentation": {} + }, + { + "label": "validate_json_schema", + "kind": 2, + "importPath": "spectragraph-api.app.utils.custom_types", + "description": "spectragraph-api.app.utils.custom_types", + "peekOfCode": "def validate_json_schema(schema: Dict[str, Any]) -> None:\n \"\"\"\n Validate that a schema is a valid JSON Schema.\n Args:\n schema: The JSON Schema to validate\n Raises:\n HTTPException: If the schema is invalid\n \"\"\"\n try:\n Draft7Validator.check_schema(schema)", + "detail": "spectragraph-api.app.utils.custom_types", + "documentation": {} + }, + { + "label": "validate_payload_against_schema", + "kind": 2, + "importPath": "spectragraph-api.app.utils.custom_types", + "description": "spectragraph-api.app.utils.custom_types", + "peekOfCode": "def validate_payload_against_schema(payload: Dict[str, Any], schema: Dict[str, Any]) -> tuple[bool, list[str]]:\n \"\"\"\n Validate a payload against a JSON Schema.\n Args:\n payload: The data to validate\n schema: The JSON Schema to validate against\n Returns:\n Tuple of (is_valid, error_messages)\n \"\"\"\n validator = Draft7Validator(schema)", + "detail": "spectragraph-api.app.utils.custom_types", + "documentation": {} + }, + { + "label": "calculate_schema_checksum", + "kind": 2, + "importPath": "spectragraph-api.app.utils.custom_types", + "description": "spectragraph-api.app.utils.custom_types", + "peekOfCode": "def calculate_schema_checksum(schema: Dict[str, Any]) -> str:\n \"\"\"\n Calculate a checksum for a schema to detect changes.\n Args:\n schema: The JSON Schema\n Returns:\n SHA256 checksum of the schema\n \"\"\"\n schema_str = json.dumps(schema, sort_keys=True)\n return hashlib.sha256(schema_str.encode()).hexdigest()", + "detail": "spectragraph-api.app.utils.custom_types", + "documentation": {} + }, + { + "label": "jsonschema_to_pydantic", + "kind": 2, + "importPath": "spectragraph-api.app.utils.custom_types", + "description": "spectragraph-api.app.utils.custom_types", + "peekOfCode": "def jsonschema_to_pydantic(schema: Dict[str, Any], model_name: str = \"DynamicModel\") -> Type[BaseModel]:\n \"\"\"\n Convert a JSON Schema to a Pydantic model.\n Args:\n schema: The JSON Schema definition\n model_name: Name for the generated Pydantic model\n Returns:\n A dynamically created Pydantic model class\n Raises:\n HTTPException: If conversion fails", + "detail": "spectragraph-api.app.utils.custom_types", + "documentation": {} + }, + { + "label": "TYPE_MAP", + "kind": 5, + "importPath": "spectragraph-api.app.utils.custom_types", + "description": "spectragraph-api.app.utils.custom_types", + "peekOfCode": "TYPE_MAP = {\n \"string\": str,\n \"integer\": int,\n \"number\": float,\n \"boolean\": bool,\n \"object\": dict,\n \"array\": list,\n \"null\": type(None),\n}\n# Mapping of JSON Schema formats to Pydantic types", + "detail": "spectragraph-api.app.utils.custom_types", + "documentation": {} + }, + { + "label": "FORMAT_MAP", + "kind": 5, + "importPath": "spectragraph-api.app.utils.custom_types", + "description": "spectragraph-api.app.utils.custom_types", + "peekOfCode": "FORMAT_MAP = {\n \"email\": EmailStr,\n \"uri\": str,\n \"uuid\": str,\n \"date\": str,\n \"date-time\": str,\n}\n# Whitelist of allowed JSON Schema types for security\nALLOWED_TYPES = {\"string\", \"integer\", \"number\", \"boolean\", \"object\", \"array\"}\ndef validate_json_schema(schema: Dict[str, Any]) -> None:", + "detail": "spectragraph-api.app.utils.custom_types", + "documentation": {} + }, + { + "label": "ALLOWED_TYPES", + "kind": 5, + "importPath": "spectragraph-api.app.utils.custom_types", + "description": "spectragraph-api.app.utils.custom_types", + "peekOfCode": "ALLOWED_TYPES = {\"string\", \"integer\", \"number\", \"boolean\", \"object\", \"array\"}\ndef validate_json_schema(schema: Dict[str, Any]) -> None:\n \"\"\"\n Validate that a schema is a valid JSON Schema.\n Args:\n schema: The JSON Schema to validate\n Raises:\n HTTPException: If the schema is invalid\n \"\"\"\n try:", + "detail": "spectragraph-api.app.utils.custom_types", + "documentation": {} + }, + { + "label": "logger", + "kind": 5, + "importPath": "spectragraph-api.app.exceptions", + "description": "spectragraph-api.app.exceptions", + "peekOfCode": "logger = logging.getLogger(__name__)\nasync def global_exception_handler(request: Request, exc: Exception) -> JSONResponse:\n logger.error(f\"Global exception: {str(exc)}\", exc_info=True)\n return JSONResponse(\n status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,\n content={\n \"type\": \"about:blank\",\n \"title\": \"Internal Server Error\",\n \"status\": 500,\n \"detail\": \"An unexpected error occurred. Please verify your request or contact support.\",", + "detail": "spectragraph-api.app.exceptions", + "documentation": {} + }, + { + "label": "JSONFormatter", + "kind": 6, + "importPath": "spectragraph-api.app.logging_config", + "description": "spectragraph-api.app.logging_config", + "peekOfCode": "class JSONFormatter(logging.Formatter):\n def format(self, record: logging.LogRecord) -> str:\n log_record: Dict[str, Any] = {\n \"timestamp\": self.formatTime(record, self.datefmt),\n \"level\": record.levelname,\n \"message\": record.getMessage(),\n \"module\": record.module,\n \"funcName\": record.funcName,\n \"lineNo\": record.lineno,\n }", + "detail": "spectragraph-api.app.logging_config", + "documentation": {} + }, + { + "label": "setup_logging", + "kind": 2, + "importPath": "spectragraph-api.app.logging_config", + "description": "spectragraph-api.app.logging_config", + "peekOfCode": "def setup_logging():\n root_logger = logging.getLogger()\n root_logger.setLevel(logging.INFO)\n handler = logging.StreamHandler(sys.stdout)\n formatter = JSONFormatter()\n handler.setFormatter(formatter)\n root_logger.handlers = []\n root_logger.addHandler(handler)\n for logger_name in [\"uvicorn\", \"uvicorn.access\", \"uvicorn.error\"]:\n logger = logging.getLogger(logger_name)", + "detail": "spectragraph-api.app.logging_config", + "documentation": {} + }, + { + "label": "URI", + "kind": 5, + "importPath": "spectragraph-api.app.main", + "description": "spectragraph-api.app.main", + "peekOfCode": "URI = os.getenv(\"NEO4J_URI_BOLT\")\nUSERNAME = os.getenv(\"NEO4J_USERNAME\")\nPASSWORD = os.getenv(\"NEO4J_PASSWORD\")\norigins = [\n \"*\",\n]\nsetup_logging()\napp = FastAPI()\nneo4j_connection = Neo4jConnection(URI, USERNAME, PASSWORD)\n@app.on_event(\"startup\")", + "detail": "spectragraph-api.app.main", + "documentation": {} + }, + { + "label": "USERNAME", + "kind": 5, + "importPath": "spectragraph-api.app.main", + "description": "spectragraph-api.app.main", + "peekOfCode": "USERNAME = os.getenv(\"NEO4J_USERNAME\")\nPASSWORD = os.getenv(\"NEO4J_PASSWORD\")\norigins = [\n \"*\",\n]\nsetup_logging()\napp = FastAPI()\nneo4j_connection = Neo4jConnection(URI, USERNAME, PASSWORD)\n@app.on_event(\"startup\")\nasync def startup_db_check():", + "detail": "spectragraph-api.app.main", + "documentation": {} + }, + { + "label": "PASSWORD", + "kind": 5, + "importPath": "spectragraph-api.app.main", + "description": "spectragraph-api.app.main", + "peekOfCode": "PASSWORD = os.getenv(\"NEO4J_PASSWORD\")\norigins = [\n \"*\",\n]\nsetup_logging()\napp = FastAPI()\nneo4j_connection = Neo4jConnection(URI, USERNAME, PASSWORD)\n@app.on_event(\"startup\")\nasync def startup_db_check():\n logger = logging.getLogger(__name__)", + "detail": "spectragraph-api.app.main", + "documentation": {} + }, + { + "label": "origins", + "kind": 5, + "importPath": "spectragraph-api.app.main", + "description": "spectragraph-api.app.main", + "peekOfCode": "origins = [\n \"*\",\n]\nsetup_logging()\napp = FastAPI()\nneo4j_connection = Neo4jConnection(URI, USERNAME, PASSWORD)\n@app.on_event(\"startup\")\nasync def startup_db_check():\n logger = logging.getLogger(__name__)\n try:", + "detail": "spectragraph-api.app.main", + "documentation": {} + }, + { + "label": "app", + "kind": 5, + "importPath": "spectragraph-api.app.main", + "description": "spectragraph-api.app.main", + "peekOfCode": "app = FastAPI()\nneo4j_connection = Neo4jConnection(URI, USERNAME, PASSWORD)\n@app.on_event(\"startup\")\nasync def startup_db_check():\n logger = logging.getLogger(__name__)\n try:\n ensure_db_connection()\n except DatabaseUnavailableError as exc:\n logger.error(\"Database unavailable on startup: %s\", exc)\n # exit cleanly for local/dev environment", + "detail": "spectragraph-api.app.main", + "documentation": {} + }, + { + "label": "neo4j_connection", + "kind": 5, + "importPath": "spectragraph-api.app.main", + "description": "spectragraph-api.app.main", + "peekOfCode": "neo4j_connection = Neo4jConnection(URI, USERNAME, PASSWORD)\n@app.on_event(\"startup\")\nasync def startup_db_check():\n logger = logging.getLogger(__name__)\n try:\n ensure_db_connection()\n except DatabaseUnavailableError as exc:\n logger.error(\"Database unavailable on startup: %s\", exc)\n # exit cleanly for local/dev environment\n sys.exit(1)", + "detail": "spectragraph-api.app.main", + "documentation": {} + }, + { + "label": "is_valid_ip", + "kind": 2, + "importPath": "spectragraph-api.app.utils", + "description": "spectragraph-api.app.utils", + "peekOfCode": "def is_valid_ip(address: str) -> bool:\n try:\n ipaddress.ip_address(address)\n return True\n except ValueError:\n return False\ndef is_valid_username(username: str) -> bool:\n if not re.match(r\"^[a-zA-Z0-9_-]{3,30}$\", username):\n return False\n return True", + "detail": "spectragraph-api.app.utils", + "documentation": {} + }, + { + "label": "is_valid_username", + "kind": 2, + "importPath": "spectragraph-api.app.utils", + "description": "spectragraph-api.app.utils", + "peekOfCode": "def is_valid_username(username: str) -> bool:\n if not re.match(r\"^[a-zA-Z0-9_-]{3,30}$\", username):\n return False\n return True\ndef is_valid_email(email: str) -> bool:\n if not re.match(r\"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$\", email):\n return False\n return True\ndef is_valid_domain(url_or_domain: str) -> str:\n try:", + "detail": "spectragraph-api.app.utils", + "documentation": {} + }, + { + "label": "is_valid_email", + "kind": 2, + "importPath": "spectragraph-api.app.utils", + "description": "spectragraph-api.app.utils", + "peekOfCode": "def is_valid_email(email: str) -> bool:\n if not re.match(r\"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$\", email):\n return False\n return True\ndef is_valid_domain(url_or_domain: str) -> str:\n try:\n parsed = urlparse(\n url_or_domain if \"://\" in url_or_domain else \"http://\" + url_or_domain\n )\n hostname = parsed.hostname or url_or_domain", + "detail": "spectragraph-api.app.utils", + "documentation": {} + }, + { + "label": "is_valid_domain", + "kind": 2, + "importPath": "spectragraph-api.app.utils", + "description": "spectragraph-api.app.utils", + "peekOfCode": "def is_valid_domain(url_or_domain: str) -> str:\n try:\n parsed = urlparse(\n url_or_domain if \"://\" in url_or_domain else \"http://\" + url_or_domain\n )\n hostname = parsed.hostname or url_or_domain\n if not hostname or \".\" not in hostname:\n return False\n if not re.match(r\"^[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$\", hostname):\n return False", + "detail": "spectragraph-api.app.utils", + "documentation": {} + }, + { + "label": "is_root_domain", + "kind": 2, + "importPath": "spectragraph-api.app.utils", + "description": "spectragraph-api.app.utils", + "peekOfCode": "def is_root_domain(domain: str) -> bool:\n \"\"\"\n Determine if a domain is a root domain or subdomain.\n Args:\n domain: The domain string to check\n Returns:\n True if it's a root domain (e.g., example.com), False if it's a subdomain (e.g., sub.example.com)\n \"\"\"\n try:\n # Remove protocol if present", + "detail": "spectragraph-api.app.utils", + "documentation": {} + }, + { + "label": "is_valid_number", + "kind": 2, + "importPath": "spectragraph-api.app.utils", + "description": "spectragraph-api.app.utils", + "peekOfCode": "def is_valid_number(phone: str, region: str = \"FR\") -> None:\n \"\"\"\n Validates a phone number. Raises InvalidPhoneNumberError if invalid.\n - `region` should be ISO 3166-1 alpha-2 country code (e.g., 'FR' for France)\n \"\"\"\n try:\n parsed = phonenumbers.parse(phone, region)\n if not phonenumbers.is_valid_number(parsed):\n return False\n except NumberParseException:", + "detail": "spectragraph-api.app.utils", + "documentation": {} + }, + { + "label": "parse_asn", + "kind": 2, + "importPath": "spectragraph-api.app.utils", + "description": "spectragraph-api.app.utils", + "peekOfCode": "def parse_asn(asn: str) -> int:\n if not is_valid_asn(asn):\n raise ValueError(f\"Invalid ASN format: {asn}\")\n return int(re.sub(r\"(?i)^AS\", \"\", asn))\ndef is_valid_asn(asn: str) -> bool:\n if not re.fullmatch(r\"(AS)?\\d+\", asn, re.IGNORECASE):\n return False\n asn_num = int(re.sub(r\"(?i)^AS\", \"\", asn))\n return 0 <= asn_num <= 4294967295\ndef resolve_type(details: dict, schema_context: dict = None) -> str:", + "detail": "spectragraph-api.app.utils", + "documentation": {} + }, + { + "label": "is_valid_asn", + "kind": 2, + "importPath": "spectragraph-api.app.utils", + "description": "spectragraph-api.app.utils", + "peekOfCode": "def is_valid_asn(asn: str) -> bool:\n if not re.fullmatch(r\"(AS)?\\d+\", asn, re.IGNORECASE):\n return False\n asn_num = int(re.sub(r\"(?i)^AS\", \"\", asn))\n return 0 <= asn_num <= 4294967295\ndef resolve_type(details: dict, schema_context: dict = None) -> str:\n if \"anyOf\" in details:\n types = []\n for option in details[\"anyOf\"]:\n if \"$ref\" in option:", + "detail": "spectragraph-api.app.utils", + "documentation": {} + }, + { + "label": "resolve_type", + "kind": 2, + "importPath": "spectragraph-api.app.utils", + "description": "spectragraph-api.app.utils", + "peekOfCode": "def resolve_type(details: dict, schema_context: dict = None) -> str:\n if \"anyOf\" in details:\n types = []\n for option in details[\"anyOf\"]:\n if \"$ref\" in option:\n ref = option[\"$ref\"].split(\"/\")[-1]\n types.append(ref)\n elif option.get(\"type\") == \"array\":\n # Handle array types within anyOf\n item_type = resolve_type(option.get(\"items\", {}), schema_context)", + "detail": "spectragraph-api.app.utils", + "documentation": {} + }, + { + "label": "extract_input_schema_flow", + "kind": 2, + "importPath": "spectragraph-api.app.utils", + "description": "spectragraph-api.app.utils", + "peekOfCode": "def extract_input_schema_flow(model: Type[BaseModel]) -> Dict[str, Any]:\n adapter = TypeAdapter(model)\n schema = adapter.json_schema()\n # Use the main schema properties, not the $defs\n type_name = model.__name__\n details = schema\n return {\n \"class_name\": model.__name__,\n \"name\": model.__name__,\n \"module\": model.__module__,", + "detail": "spectragraph-api.app.utils", + "documentation": {} + }, + { + "label": "get_domain_from_ssl", + "kind": 2, + "importPath": "spectragraph-api.app.utils", + "description": "spectragraph-api.app.utils", + "peekOfCode": "def get_domain_from_ssl(ip: str, port: int = 443) -> str | None:\n try:\n context = ssl.create_default_context()\n with socket.create_connection((ip, port), timeout=3) as sock:\n with context.wrap_socket(sock, server_hostname=ip) as ssock:\n cert = ssock.getpeercert()\n subject = cert.get(\"subject\", [])\n for entry in subject:\n if entry[0][0] == \"commonName\":\n return entry[0][1]", + "detail": "spectragraph-api.app.utils", + "documentation": {} + }, + { + "label": "extract_transform", + "kind": 2, + "importPath": "spectragraph-api.app.utils", + "description": "spectragraph-api.app.utils", + "peekOfCode": "def extract_transform(transform: Dict[str, Any]) -> Dict[str, Any]:\n nodes = transform[\"nodes\"]\n edges = transform[\"edges\"]\n input_node = next((node for node in nodes if node[\"data\"][\"type\"] == \"type\"), None)\n if not input_node:\n raise ValueError(\"No input node found.\")\n input_output = input_node[\"data\"][\"outputs\"]\n node_lookup = {node[\"id\"]: node for node in nodes}\n transforms = []\n for edge in edges:", + "detail": "spectragraph-api.app.utils", + "documentation": {} + }, + { + "label": "get_label_color", + "kind": 2, + "importPath": "spectragraph-api.app.utils", + "description": "spectragraph-api.app.utils", + "peekOfCode": "def get_label_color(label: str) -> str:\n color_map = {\"subdomain\": \"#A5ABB6\", \"domain\": \"#68BDF6\", \"default\": \"#A5ABB6\"}\n return color_map.get(label, color_map[\"default\"])\ndef flatten(data_dict, prefix=\"\"):\n \"\"\"\n Flattens a dictionary to contain only Neo4j-compatible property values.\n Neo4j supports primitive types (string, number, boolean) and arrays of those types.\n Args:\n data_dict (dict): Dictionary to flatten\n Returns:", + "detail": "spectragraph-api.app.utils", + "documentation": {} + }, + { + "label": "flatten", + "kind": 2, + "importPath": "spectragraph-api.app.utils", + "description": "spectragraph-api.app.utils", + "peekOfCode": "def flatten(data_dict, prefix=\"\"):\n \"\"\"\n Flattens a dictionary to contain only Neo4j-compatible property values.\n Neo4j supports primitive types (string, number, boolean) and arrays of those types.\n Args:\n data_dict (dict): Dictionary to flatten\n Returns:\n dict: Flattened dictionary with only Neo4j-compatible values\n \"\"\"\n flattened = {}", + "detail": "spectragraph-api.app.utils", + "documentation": {} + }, + { + "label": "get_inline_relationships", + "kind": 2, + "importPath": "spectragraph-api.app.utils", + "description": "spectragraph-api.app.utils", + "peekOfCode": "def get_inline_relationships(nodes: List[Any], edges: List[Any]) -> List[str]:\n \"\"\"\n Get the inline relationships for a list of nodes and edges.\n \"\"\"\n relationships = []\n for edge in edges:\n source = next((node for node in nodes if node[\"id\"] == edge[\"source\"]), None)\n target = next((node for node in nodes if node[\"id\"] == edge[\"target\"]), None)\n if source and target:\n relationships.append({\"source\": source, \"edge\": edge, \"target\": target})", + "detail": "spectragraph-api.app.utils", + "documentation": {} + }, + { + "label": "to_json_serializable", + "kind": 2, + "importPath": "spectragraph-api.app.utils", + "description": "spectragraph-api.app.utils", + "peekOfCode": "def to_json_serializable(obj):\n \"\"\"Convert any object to a JSON-serializable format.\"\"\"\n import json\n from pydantic import BaseModel\n try:\n # Test if already JSON serializable\n json.dumps(obj)\n return obj\n except (TypeError, ValueError):\n # Handle common cases", + "detail": "spectragraph-api.app.utils", + "documentation": {} + }, + { + "label": "verify_password", + "kind": 2, + "importPath": "spectragraph-core.src.spectragraph_core.core.auth", + "description": "spectragraph-core.src.spectragraph_core.core.auth", + "peekOfCode": "def verify_password(plain_password: str, hashed_password: str) -> bool:\n return pwd_context.verify(plain_password, hashed_password)\ndef get_password_hash(password: str) -> str:\n return pwd_context.hash(password)\ndef create_access_token(data: dict, expires_delta: timedelta | None = None):\n to_encode = data.copy()\n expire = datetime.utcnow() + (\n expires_delta or timedelta(minutes=ACCESS_TOKEN_EXPIRE_MINUTES)\n )\n to_encode.update({\"exp\": expire})", + "detail": "spectragraph-core.src.spectragraph_core.core.auth", + "documentation": {} + }, + { + "label": "get_password_hash", + "kind": 2, + "importPath": "spectragraph-core.src.spectragraph_core.core.auth", + "description": "spectragraph-core.src.spectragraph_core.core.auth", + "peekOfCode": "def get_password_hash(password: str) -> str:\n return pwd_context.hash(password)\ndef create_access_token(data: dict, expires_delta: timedelta | None = None):\n to_encode = data.copy()\n expire = datetime.utcnow() + (\n expires_delta or timedelta(minutes=ACCESS_TOKEN_EXPIRE_MINUTES)\n )\n to_encode.update({\"exp\": expire})\n encoded_jwt = jwt.encode(to_encode, AUTH_SECRET, algorithm=ALGORITHM)\n return encoded_jwt", + "detail": "spectragraph-core.src.spectragraph_core.core.auth", + "documentation": {} + }, + { + "label": "create_access_token", + "kind": 2, + "importPath": "spectragraph-core.src.spectragraph_core.core.auth", + "description": "spectragraph-core.src.spectragraph_core.core.auth", + "peekOfCode": "def create_access_token(data: dict, expires_delta: timedelta | None = None):\n to_encode = data.copy()\n expire = datetime.utcnow() + (\n expires_delta or timedelta(minutes=ACCESS_TOKEN_EXPIRE_MINUTES)\n )\n to_encode.update({\"exp\": expire})\n encoded_jwt = jwt.encode(to_encode, AUTH_SECRET, algorithm=ALGORITHM)\n return encoded_jwt", + "detail": "spectragraph-core.src.spectragraph_core.core.auth", + "documentation": {} + }, + { + "label": "AUTH_SECRET", + "kind": 5, + "importPath": "spectragraph-core.src.spectragraph_core.core.auth", + "description": "spectragraph-core.src.spectragraph_core.core.auth", + "peekOfCode": "AUTH_SECRET = os.getenv(\"AUTH_SECRET\")\nif not AUTH_SECRET:\n raise ValueError(\n \"AUTH_SECRET environment variable is not set. Please set it in your .env file.\"\n )\nALGORITHM = \"HS256\"\nACCESS_TOKEN_EXPIRE_MINUTES = 60 # 60 minutes = 1 hour\npwd_context = CryptContext(schemes=[\"bcrypt\"], deprecated=\"auto\")\ndef verify_password(plain_password: str, hashed_password: str) -> bool:\n return pwd_context.verify(plain_password, hashed_password)", + "detail": "spectragraph-core.src.spectragraph_core.core.auth", + "documentation": {} + }, + { + "label": "ALGORITHM", + "kind": 5, + "importPath": "spectragraph-core.src.spectragraph_core.core.auth", + "description": "spectragraph-core.src.spectragraph_core.core.auth", + "peekOfCode": "ALGORITHM = \"HS256\"\nACCESS_TOKEN_EXPIRE_MINUTES = 60 # 60 minutes = 1 hour\npwd_context = CryptContext(schemes=[\"bcrypt\"], deprecated=\"auto\")\ndef verify_password(plain_password: str, hashed_password: str) -> bool:\n return pwd_context.verify(plain_password, hashed_password)\ndef get_password_hash(password: str) -> str:\n return pwd_context.hash(password)\ndef create_access_token(data: dict, expires_delta: timedelta | None = None):\n to_encode = data.copy()\n expire = datetime.utcnow() + (", + "detail": "spectragraph-core.src.spectragraph_core.core.auth", + "documentation": {} + }, + { + "label": "ACCESS_TOKEN_EXPIRE_MINUTES", + "kind": 5, + "importPath": "spectragraph-core.src.spectragraph_core.core.auth", + "description": "spectragraph-core.src.spectragraph_core.core.auth", + "peekOfCode": "ACCESS_TOKEN_EXPIRE_MINUTES = 60 # 60 minutes = 1 hour\npwd_context = CryptContext(schemes=[\"bcrypt\"], deprecated=\"auto\")\ndef verify_password(plain_password: str, hashed_password: str) -> bool:\n return pwd_context.verify(plain_password, hashed_password)\ndef get_password_hash(password: str) -> str:\n return pwd_context.hash(password)\ndef create_access_token(data: dict, expires_delta: timedelta | None = None):\n to_encode = data.copy()\n expire = datetime.utcnow() + (\n expires_delta or timedelta(minutes=ACCESS_TOKEN_EXPIRE_MINUTES)", + "detail": "spectragraph-core.src.spectragraph_core.core.auth", + "documentation": {} + }, + { + "label": "pwd_context", + "kind": 5, + "importPath": "spectragraph-core.src.spectragraph_core.core.auth", + "description": "spectragraph-core.src.spectragraph_core.core.auth", + "peekOfCode": "pwd_context = CryptContext(schemes=[\"bcrypt\"], deprecated=\"auto\")\ndef verify_password(plain_password: str, hashed_password: str) -> bool:\n return pwd_context.verify(plain_password, hashed_password)\ndef get_password_hash(password: str) -> str:\n return pwd_context.hash(password)\ndef create_access_token(data: dict, expires_delta: timedelta | None = None):\n to_encode = data.copy()\n expire = datetime.utcnow() + (\n expires_delta or timedelta(minutes=ACCESS_TOKEN_EXPIRE_MINUTES)\n )", + "detail": "spectragraph-core.src.spectragraph_core.core.auth", + "documentation": {} + }, + { + "label": "celery", + "kind": 5, + "importPath": "spectragraph-core.src.spectragraph_core.core.celery", + "description": "spectragraph-core.src.spectragraph_core.core.celery", + "peekOfCode": "celery = Celery(\n \"spectragraph\",\n broker=settings.CELERY_BROKER_URL,\n backend=settings.CELERY_RESULT_BACKEND,\n include=[\n \"spectragraph_core.tasks.event\",\n \"spectragraph_core.tasks.transform\",\n \"spectragraph_core.tasks.flow\",\n ],\n)", + "detail": "spectragraph-core.src.spectragraph_core.core.celery", + "documentation": {} + }, + { + "label": "Settings", + "kind": 6, + "importPath": "spectragraph-core.src.spectragraph_core.core.config", + "description": "spectragraph-core.src.spectragraph_core.core.config", + "peekOfCode": "class Settings:\n CELERY_BROKER_URL = os.environ[\"REDIS_URL\"]\n CELERY_RESULT_BACKEND = os.environ[\"REDIS_URL\"]\nsettings = Settings()", + "detail": "spectragraph-core.src.spectragraph_core.core.config", + "documentation": {} + }, + { + "label": "settings", + "kind": 5, + "importPath": "spectragraph-core.src.spectragraph_core.core.config", + "description": "spectragraph-core.src.spectragraph_core.core.config", + "peekOfCode": "settings = Settings()", + "detail": "spectragraph-core.src.spectragraph_core.core.config", + "documentation": {} + }, + { + "label": "EventLevel", + "kind": 6, + "importPath": "spectragraph-core.src.spectragraph_core.core.enums", + "description": "spectragraph-core.src.spectragraph_core.core.enums", + "peekOfCode": "class EventLevel(str, Enum):\n # Standard log levels\n INFO = \"INFO\"\n WARNING = \"WARNING\"\n FAILED = \"FAILED\"\n SUCCESS = \"SUCCESS\"\n DEBUG = \"DEBUG\"\n # Transform-specific statuses\n PENDING = \"PENDING\"\n RUNNING = \"RUNNING\"", + "detail": "spectragraph-core.src.spectragraph_core.core.enums", + "documentation": {} + }, + { + "label": "EventEmitter", + "kind": 6, + "importPath": "spectragraph-core.src.spectragraph_core.core.events", + "description": "spectragraph-core.src.spectragraph_core.core.events", + "peekOfCode": "class EventEmitter:\n def __init__(self):\n self.id = uuid.uuid4()\n self.redis = redis.from_url(os.environ[\"REDIS_URL\"])\n self.pubsubs: Dict[str, redis.client.PubSub] = {}\n async def subscribe(self, channel: str):\n \"\"\"Subscribe to Redis channel\"\"\"\n if channel not in self.pubsubs:\n pubsub = self.redis.pubsub()\n await pubsub.subscribe(channel)", + "detail": "spectragraph-core.src.spectragraph_core.core.events", + "documentation": {} + }, + { + "label": "init_events", + "kind": 2, + "importPath": "spectragraph-core.src.spectragraph_core.core.events", + "description": "spectragraph-core.src.spectragraph_core.core.events", + "peekOfCode": "def init_events(app: FastAPI):\n \"\"\"Initialize the event system in the FastAPI app\"\"\"\n print(\"[EventEmitter] Events initialized in FastAPI app\")", + "detail": "spectragraph-core.src.spectragraph_core.core.events", + "documentation": {} + }, + { + "label": "event_emitter", + "kind": 5, + "importPath": "spectragraph-core.src.spectragraph_core.core.events", + "description": "spectragraph-core.src.spectragraph_core.core.events", + "peekOfCode": "event_emitter = EventEmitter()\ndef init_events(app: FastAPI):\n \"\"\"Initialize the event system in the FastAPI app\"\"\"\n print(\"[EventEmitter] Events initialized in FastAPI app\")", + "detail": "spectragraph-core.src.spectragraph_core.core.events", + "documentation": {} + }, + { + "label": "Neo4jConnection", + "kind": 6, + "importPath": "spectragraph-core.src.spectragraph_core.core.graph_db", + "description": "spectragraph-core.src.spectragraph_core.core.graph_db", + "peekOfCode": "class Neo4jConnection:\n \"\"\"\n Singleton Neo4j connection manager with proper connection pooling.\n This class implements the Singleton pattern to ensure only one Neo4j driver\n instance exists throughout the application lifecycle, providing efficient\n connection pooling and resource management.\n \"\"\"\n _instance: Optional['Neo4jConnection'] = None\n _lock: Lock = Lock()\n _driver: Optional[Driver] = None", + "detail": "spectragraph-core.src.spectragraph_core.core.graph_db", + "documentation": {} + }, + { + "label": "GraphRepository", + "kind": 6, + "importPath": "spectragraph-core.src.spectragraph_core.core.graph_repository", + "description": "spectragraph-core.src.spectragraph_core.core.graph_repository", + "peekOfCode": "class GraphRepository:\n \"\"\"\n Repository for Neo4j graph database operations.\n This class follows the Repository pattern, providing a clean abstraction\n over Neo4j operations and handling batching for improved performance.\n \"\"\"\n def __init__(self, neo4j_connection: Optional[Neo4jConnection] = None):\n \"\"\"\n Initialize the graph repository.\n Args:", + "detail": "spectragraph-core.src.spectragraph_core.core.graph_repository", + "documentation": {} + }, + { + "label": "GraphSerializer", + "kind": 6, + "importPath": "spectragraph-core.src.spectragraph_core.core.graph_serializer", + "description": "spectragraph-core.src.spectragraph_core.core.graph_serializer", + "peekOfCode": "class GraphSerializer:\n \"\"\"\n Handles serialization of complex objects to Neo4j-compatible types.\n This class is responsible for converting Pydantic models, nested objects,\n and other complex types into primitive types that can be stored in Neo4j.\n \"\"\"\n @staticmethod\n def serialize_properties(properties: Dict[str, Any]) -> Dict[str, Any]:\n \"\"\"\n Convert properties to Neo4j-compatible values.", + "detail": "spectragraph-core.src.spectragraph_core.core.graph_serializer", + "documentation": {} + }, + { + "label": "LoggerProtocol", + "kind": 6, + "importPath": "spectragraph-core.src.spectragraph_core.core.graph_service", + "description": "spectragraph-core.src.spectragraph_core.core.graph_service", + "peekOfCode": "class LoggerProtocol(Protocol):\n \"\"\"Protocol for logger implementations.\"\"\"\n @staticmethod\n def graph_append(sketch_id: str, message: Dict[str, Any]) -> None:\n \"\"\"Log a graph append message.\"\"\"\n ...\nclass GraphService:\n \"\"\"\n High-level service for graph operations.\n This service provides a clean interface for transform operations,", + "detail": "spectragraph-core.src.spectragraph_core.core.graph_service", + "documentation": {} + }, + { + "label": "GraphService", + "kind": 6, + "importPath": "spectragraph-core.src.spectragraph_core.core.graph_service", + "description": "spectragraph-core.src.spectragraph_core.core.graph_service", + "peekOfCode": "class GraphService:\n \"\"\"\n High-level service for graph operations.\n This service provides a clean interface for transform operations,\n handling both graph persistence and logging with proper separation of concerns.\n \"\"\"\n def __init__(\n self,\n sketch_id: str,\n neo4j_connection: Optional[Neo4jConnection] = None,", + "detail": "spectragraph-core.src.spectragraph_core.core.graph_service", + "documentation": {} + }, + { + "label": "create_graph_service", + "kind": 2, + "importPath": "spectragraph-core.src.spectragraph_core.core.graph_service", + "description": "spectragraph-core.src.spectragraph_core.core.graph_service", + "peekOfCode": "def create_graph_service(\n sketch_id: str,\n neo4j_connection: Optional[Neo4jConnection] = None,\n enable_batching: bool = True\n) -> GraphService:\n \"\"\"\n Factory function to create a GraphService instance.\n Args:\n sketch_id: Investigation sketch ID\n neo4j_connection: Optional Neo4j connection", + "detail": "spectragraph-core.src.spectragraph_core.core.graph_service", + "documentation": {} + }, + { + "label": "Logger", + "kind": 6, + "importPath": "spectragraph-core.src.spectragraph_core.core.logger", + "description": "spectragraph-core.src.spectragraph_core.core.logger", + "peekOfCode": "class Logger:\n @staticmethod\n def _create_log(\n sketch_id: Union[str, UUID], level: EventLevel, content: str\n ) -> Log:\n \"\"\"Create a log entry in the database\"\"\"\n db = next(get_db())\n try:\n log = Log(sketch_id=str(sketch_id), type=level.value, content=content)\n db.add(log)", + "detail": "spectragraph-core.src.spectragraph_core.core.logger", + "documentation": {} + }, + { + "label": "logger", + "kind": 5, + "importPath": "spectragraph-core.src.spectragraph_core.core.logger", + "description": "spectragraph-core.src.spectragraph_core.core.logger", + "peekOfCode": "logger = logging.getLogger(__name__)\nclass Logger:\n @staticmethod\n def _create_log(\n sketch_id: Union[str, UUID], level: EventLevel, content: str\n ) -> Log:\n \"\"\"Create a log entry in the database\"\"\"\n db = next(get_db())\n try:\n log = Log(sketch_id=str(sketch_id), type=level.value, content=content)", + "detail": "spectragraph-core.src.spectragraph_core.core.logger", + "documentation": {} + }, + { + "label": "Base", + "kind": 6, + "importPath": "spectragraph-core.src.spectragraph_core.core.models", + "description": "spectragraph-core.src.spectragraph_core.core.models", + "peekOfCode": "class Base(DeclarativeBase):\n pass\nclass Feedback(Base):\n __tablename__ = \"feedbacks\"\n id: Mapped[uuid.UUID] = mapped_column(primary_key=True)\n created_at = mapped_column(DateTime(timezone=True), server_default=func.now())\n content = mapped_column(Text, nullable=True)\n owner_id = mapped_column(\n PGUUID(as_uuid=True), ForeignKey(\"profiles.id\"), nullable=True\n )", + "detail": "spectragraph-core.src.spectragraph_core.core.models", + "documentation": {} + }, + { + "label": "Feedback", + "kind": 6, + "importPath": "spectragraph-core.src.spectragraph_core.core.models", + "description": "spectragraph-core.src.spectragraph_core.core.models", + "peekOfCode": "class Feedback(Base):\n __tablename__ = \"feedbacks\"\n id: Mapped[uuid.UUID] = mapped_column(primary_key=True)\n created_at = mapped_column(DateTime(timezone=True), server_default=func.now())\n content = mapped_column(Text, nullable=True)\n owner_id = mapped_column(\n PGUUID(as_uuid=True), ForeignKey(\"profiles.id\"), nullable=True\n )\nclass Investigation(Base):\n __tablename__ = \"investigations\"", + "detail": "spectragraph-core.src.spectragraph_core.core.models", + "documentation": {} + }, + { + "label": "Investigation", + "kind": 6, + "importPath": "spectragraph-core.src.spectragraph_core.core.models", + "description": "spectragraph-core.src.spectragraph_core.core.models", + "peekOfCode": "class Investigation(Base):\n __tablename__ = \"investigations\"\n id: Mapped[uuid.UUID] = mapped_column(\n PGUUID(as_uuid=True), primary_key=True, default=uuid.uuid4\n )\n created_at = mapped_column(DateTime(timezone=True), server_default=func.now())\n name = mapped_column(Text)\n description = mapped_column(Text)\n owner_id = mapped_column(\n PGUUID(as_uuid=True),", + "detail": "spectragraph-core.src.spectragraph_core.core.models", + "documentation": {} + }, + { + "label": "Log", + "kind": 6, + "importPath": "spectragraph-core.src.spectragraph_core.core.models", + "description": "spectragraph-core.src.spectragraph_core.core.models", + "peekOfCode": "class Log(Base):\n __tablename__ = \"logs\"\n id: Mapped[uuid.UUID] = mapped_column(\n PGUUID(as_uuid=True), primary_key=True, default=uuid.uuid4\n )\n content = mapped_column(JSONB, nullable=True)\n created_at = mapped_column(DateTime(timezone=True), server_default=func.now())\n sketch_id = mapped_column(\n PGUUID(as_uuid=True),\n ForeignKey(\"sketches.id\", onupdate=\"CASCADE\", ondelete=\"CASCADE\"),", + "detail": "spectragraph-core.src.spectragraph_core.core.models", + "documentation": {} + }, + { + "label": "Profile", + "kind": 6, + "importPath": "spectragraph-core.src.spectragraph_core.core.models", + "description": "spectragraph-core.src.spectragraph_core.core.models", + "peekOfCode": "class Profile(Base):\n __tablename__ = \"profiles\"\n id: Mapped[uuid.UUID] = mapped_column(\n PGUUID(as_uuid=True), primary_key=True, default=uuid.uuid4\n )\n first_name = mapped_column(Text, nullable=True)\n last_name = mapped_column(Text, nullable=True)\n avatar_url = mapped_column(Text, nullable=True)\n email: Mapped[str] = mapped_column(String, unique=True, nullable=False)\n hashed_password: Mapped[str] = mapped_column(String, nullable=False)", + "detail": "spectragraph-core.src.spectragraph_core.core.models", + "documentation": {} + }, + { + "label": "Scan", + "kind": 6, + "importPath": "spectragraph-core.src.spectragraph_core.core.models", + "description": "spectragraph-core.src.spectragraph_core.core.models", + "peekOfCode": "class Scan(Base):\n __tablename__ = \"scans\"\n id: Mapped[uuid.UUID] = mapped_column(\n PGUUID(as_uuid=True), primary_key=True, default=uuid.uuid4\n )\n sketch_id: Mapped[uuid.UUID] = mapped_column(\n PGUUID(as_uuid=True),\n ForeignKey(\"sketches.id\", onupdate=\"CASCADE\", ondelete=\"CASCADE\"),\n nullable=True,\n )", + "detail": "spectragraph-core.src.spectragraph_core.core.models", + "documentation": {} + }, + { + "label": "Sketch", + "kind": 6, + "importPath": "spectragraph-core.src.spectragraph_core.core.models", + "description": "spectragraph-core.src.spectragraph_core.core.models", + "peekOfCode": "class Sketch(Base):\n __tablename__ = \"sketches\"\n id: Mapped[uuid.UUID] = mapped_column(\n PGUUID(as_uuid=True), primary_key=True, default=uuid.uuid4\n )\n title = mapped_column(Text)\n description = mapped_column(Text)\n created_at = mapped_column(DateTime(timezone=True), server_default=func.now())\n owner_id = mapped_column(\n PGUUID(as_uuid=True),", + "detail": "spectragraph-core.src.spectragraph_core.core.models", + "documentation": {} + }, + { + "label": "SketchesProfiles", + "kind": 6, + "importPath": "spectragraph-core.src.spectragraph_core.core.models", + "description": "spectragraph-core.src.spectragraph_core.core.models", + "peekOfCode": "class SketchesProfiles(Base):\n __tablename__ = \"sketches_profiles\"\n id: Mapped[uuid.UUID] = mapped_column(primary_key=True)\n created_at = mapped_column(DateTime(timezone=True), server_default=func.now())\n profile_id = mapped_column(\n PGUUID(as_uuid=True),\n ForeignKey(\"profiles.id\", onupdate=\"CASCADE\", ondelete=\"CASCADE\"),\n )\n sketch_id = mapped_column(\n PGUUID(as_uuid=True),", + "detail": "spectragraph-core.src.spectragraph_core.core.models", + "documentation": {} + }, + { + "label": "Flow", + "kind": 6, + "importPath": "spectragraph-core.src.spectragraph_core.core.models", + "description": "spectragraph-core.src.spectragraph_core.core.models", + "peekOfCode": "class Flow(Base):\n __tablename__ = \"flows\"\n id: Mapped[uuid.UUID] = mapped_column(\n PGUUID(as_uuid=True), primary_key=True, default=uuid.uuid4\n )\n name = mapped_column(Text, nullable=False)\n description = mapped_column(Text, nullable=True)\n category = mapped_column(ARRAY(Text), nullable=True)\n flow_schema = mapped_column(JSON, nullable=True)\n created_at = mapped_column(DateTime(timezone=True), server_default=func.now())", + "detail": "spectragraph-core.src.spectragraph_core.core.models", + "documentation": {} + }, + { + "label": "Analysis", + "kind": 6, + "importPath": "spectragraph-core.src.spectragraph_core.core.models", + "description": "spectragraph-core.src.spectragraph_core.core.models", + "peekOfCode": "class Analysis(Base):\n __tablename__ = \"analyses\"\n id: Mapped[uuid.UUID] = mapped_column(\n PGUUID(as_uuid=True), primary_key=True, default=uuid.uuid4\n )\n title = mapped_column(Text, nullable=False)\n description = mapped_column(Text, nullable=True)\n content = mapped_column(JSON, nullable=True)\n created_at = mapped_column(DateTime(timezone=True), server_default=func.now())\n last_updated_at = mapped_column(DateTime(timezone=True), server_default=func.now())", + "detail": "spectragraph-core.src.spectragraph_core.core.models", + "documentation": {} + }, + { + "label": "Chat", + "kind": 6, + "importPath": "spectragraph-core.src.spectragraph_core.core.models", + "description": "spectragraph-core.src.spectragraph_core.core.models", + "peekOfCode": "class Chat(Base):\n __tablename__ = \"chats\"\n id: Mapped[uuid.UUID] = mapped_column(\n PGUUID(as_uuid=True), primary_key=True, default=uuid.uuid4\n )\n title = mapped_column(Text, nullable=False)\n description = mapped_column(Text, nullable=True)\n created_at = mapped_column(DateTime(timezone=True), server_default=func.now())\n last_updated_at = mapped_column(DateTime(timezone=True), server_default=func.now())\n owner_id = mapped_column(", + "detail": "spectragraph-core.src.spectragraph_core.core.models", + "documentation": {} + }, + { + "label": "ChatMessage", + "kind": 6, + "importPath": "spectragraph-core.src.spectragraph_core.core.models", + "description": "spectragraph-core.src.spectragraph_core.core.models", + "peekOfCode": "class ChatMessage(Base):\n __tablename__ = \"messages\"\n id: Mapped[uuid.UUID] = mapped_column(\n PGUUID(as_uuid=True), primary_key=True, default=uuid.uuid4\n )\n content = mapped_column(JSON, nullable=True)\n context = mapped_column(JSON, nullable=True)\n is_bot: Mapped[bool] = mapped_column(default=False)\n created_at = mapped_column(DateTime(timezone=True), server_default=func.now())\n chat_id = mapped_column(", + "detail": "spectragraph-core.src.spectragraph_core.core.models", + "documentation": {} + }, + { + "label": "Key", + "kind": 6, + "importPath": "spectragraph-core.src.spectragraph_core.core.models", + "description": "spectragraph-core.src.spectragraph_core.core.models", + "peekOfCode": "class Key(Base):\n __tablename__ = \"keys\"\n id: Mapped[uuid.UUID] = mapped_column(\n PGUUID(as_uuid=True), primary_key=True, default=uuid.uuid4\n )\n name: Mapped[str] = mapped_column(String, nullable=False) # ex: \"shodan\", \"whocy\"\n owner_id: Mapped[uuid.UUID] = mapped_column(\n PGUUID(as_uuid=True),\n ForeignKey(\"profiles.id\", onupdate=\"CASCADE\", ondelete=\"CASCADE\"),\n nullable=False,", + "detail": "spectragraph-core.src.spectragraph_core.core.models", + "documentation": {} + }, + { + "label": "InvestigationUserRole", + "kind": 6, + "importPath": "spectragraph-core.src.spectragraph_core.core.models", + "description": "spectragraph-core.src.spectragraph_core.core.models", + "peekOfCode": "class InvestigationUserRole(Base):\n __tablename__ = \"investigation_user_roles\"\n id: Mapped[uuid.UUID] = mapped_column(\n PGUUID(as_uuid=True),\n primary_key=True,\n default=uuid.uuid4,\n )\n user_id: Mapped[uuid.UUID] = mapped_column(\n PGUUID(as_uuid=True),\n ForeignKey(\"profiles.id\", onupdate=\"CASCADE\", ondelete=\"CASCADE\"),", + "detail": "spectragraph-core.src.spectragraph_core.core.models", + "documentation": {} + }, + { + "label": "CustomType", + "kind": 6, + "importPath": "spectragraph-core.src.spectragraph_core.core.models", + "description": "spectragraph-core.src.spectragraph_core.core.models", + "peekOfCode": "class CustomType(Base):\n __tablename__ = \"custom_types\"\n id: Mapped[uuid.UUID] = mapped_column(\n PGUUID(as_uuid=True), primary_key=True, default=uuid.uuid4\n )\n name: Mapped[str] = mapped_column(Text, nullable=False)\n owner_id: Mapped[uuid.UUID] = mapped_column(\n PGUUID(as_uuid=True),\n ForeignKey(\"profiles.id\", onupdate=\"CASCADE\", ondelete=\"CASCADE\"),\n nullable=False,", + "detail": "spectragraph-core.src.spectragraph_core.core.models", + "documentation": {} + }, + { + "label": "FlowOrchestrator", + "kind": 6, + "importPath": "spectragraph-core.src.spectragraph_core.core.orchestrator", + "description": "spectragraph-core.src.spectragraph_core.core.orchestrator", + "peekOfCode": "class FlowOrchestrator(Transform):\n \"\"\"\n Orchestrator for running a list of transforms.\n \"\"\"\n def __init__(\n self,\n sketch_id: str,\n scan_id: str,\n transform_branches: List[FlowBranch],\n neo4j_conn=None,", + "detail": "spectragraph-core.src.spectragraph_core.core.orchestrator", + "documentation": {} + }, + { + "label": "DatabaseUnavailableError", + "kind": 6, + "importPath": "spectragraph-core.src.spectragraph_core.core.postgre_db", + "description": "spectragraph-core.src.spectragraph_core.core.postgre_db", + "peekOfCode": "class DatabaseUnavailableError(RuntimeError):\n pass\ndef _mask_password(dsn: str) -> str:\n try:\n # naive mask: replace password between : and @ in the authority\n if \"@\" in dsn and \":\" in dsn.split(\"@\")[0]:\n left, rest = dsn.split(\"@\", 1)\n if \":\" in left:\n user, _ = left.split(\":\", 1)\n return f\"{user}:****@{rest}\"", + "detail": "spectragraph-core.src.spectragraph_core.core.postgre_db", + "documentation": {} + }, + { + "label": "ensure_db_connection", + "kind": 2, + "importPath": "spectragraph-core.src.spectragraph_core.core.postgre_db", + "description": "spectragraph-core.src.spectragraph_core.core.postgre_db", + "peekOfCode": "def ensure_db_connection(max_retries: int = 5, base_delay: float = 1.0) -> None:\n \"\"\"Try connecting to Postgres with exponential backoff. Raises DatabaseUnavailableError.\n Designed for local/dev startup checks to provide actionable feedback when DB is missing.\n \"\"\"\n env = os.getenv(\"ENV\", \"development\")\n masked = _mask_password(DATABASE_URL)\n for attempt in range(1, max_retries + 1):\n try:\n with engine.connect() as conn:\n conn.execute(text(\"SELECT 1\"))", + "detail": "spectragraph-core.src.spectragraph_core.core.postgre_db", + "documentation": {} + }, + { + "label": "get_db", + "kind": 2, + "importPath": "spectragraph-core.src.spectragraph_core.core.postgre_db", + "description": "spectragraph-core.src.spectragraph_core.core.postgre_db", + "peekOfCode": "def get_db() -> Session:\n db = SessionLocal()\n try:\n yield db\n finally:\n db.close()", + "detail": "spectragraph-core.src.spectragraph_core.core.postgre_db", + "documentation": {} + }, + { + "label": "DATABASE_URL", + "kind": 5, + "importPath": "spectragraph-core.src.spectragraph_core.core.postgre_db", + "description": "spectragraph-core.src.spectragraph_core.core.postgre_db", + "peekOfCode": "DATABASE_URL = os.getenv(\"DATABASE_URL\", \"postgresql://localhost:5432/spectragraph\")\nlogger = logging.getLogger(__name__)\nengine = create_engine(DATABASE_URL, pool_pre_ping=True)\nSessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)\nBase = declarative_base()\nclass DatabaseUnavailableError(RuntimeError):\n pass\ndef _mask_password(dsn: str) -> str:\n try:\n # naive mask: replace password between : and @ in the authority", + "detail": "spectragraph-core.src.spectragraph_core.core.postgre_db", + "documentation": {} + }, + { + "label": "logger", + "kind": 5, + "importPath": "spectragraph-core.src.spectragraph_core.core.postgre_db", + "description": "spectragraph-core.src.spectragraph_core.core.postgre_db", + "peekOfCode": "logger = logging.getLogger(__name__)\nengine = create_engine(DATABASE_URL, pool_pre_ping=True)\nSessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)\nBase = declarative_base()\nclass DatabaseUnavailableError(RuntimeError):\n pass\ndef _mask_password(dsn: str) -> str:\n try:\n # naive mask: replace password between : and @ in the authority\n if \"@\" in dsn and \":\" in dsn.split(\"@\")[0]:", + "detail": "spectragraph-core.src.spectragraph_core.core.postgre_db", + "documentation": {} + }, + { + "label": "engine", + "kind": 5, + "importPath": "spectragraph-core.src.spectragraph_core.core.postgre_db", + "description": "spectragraph-core.src.spectragraph_core.core.postgre_db", + "peekOfCode": "engine = create_engine(DATABASE_URL, pool_pre_ping=True)\nSessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)\nBase = declarative_base()\nclass DatabaseUnavailableError(RuntimeError):\n pass\ndef _mask_password(dsn: str) -> str:\n try:\n # naive mask: replace password between : and @ in the authority\n if \"@\" in dsn and \":\" in dsn.split(\"@\")[0]:\n left, rest = dsn.split(\"@\", 1)", + "detail": "spectragraph-core.src.spectragraph_core.core.postgre_db", + "documentation": {} + }, + { + "label": "SessionLocal", + "kind": 5, + "importPath": "spectragraph-core.src.spectragraph_core.core.postgre_db", + "description": "spectragraph-core.src.spectragraph_core.core.postgre_db", + "peekOfCode": "SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)\nBase = declarative_base()\nclass DatabaseUnavailableError(RuntimeError):\n pass\ndef _mask_password(dsn: str) -> str:\n try:\n # naive mask: replace password between : and @ in the authority\n if \"@\" in dsn and \":\" in dsn.split(\"@\")[0]:\n left, rest = dsn.split(\"@\", 1)\n if \":\" in left:", + "detail": "spectragraph-core.src.spectragraph_core.core.postgre_db", + "documentation": {} + }, + { + "label": "Base", + "kind": 5, + "importPath": "spectragraph-core.src.spectragraph_core.core.postgre_db", + "description": "spectragraph-core.src.spectragraph_core.core.postgre_db", + "peekOfCode": "Base = declarative_base()\nclass DatabaseUnavailableError(RuntimeError):\n pass\ndef _mask_password(dsn: str) -> str:\n try:\n # naive mask: replace password between : and @ in the authority\n if \"@\" in dsn and \":\" in dsn.split(\"@\")[0]:\n left, rest = dsn.split(\"@\", 1)\n if \":\" in left:\n user, _ = left.split(\":\", 1)", + "detail": "spectragraph-core.src.spectragraph_core.core.postgre_db", + "documentation": {} + }, + { + "label": "TransformRegistry", + "kind": 6, + "importPath": "spectragraph-core.src.spectragraph_core.core.registry", + "description": "spectragraph-core.src.spectragraph_core.core.registry", + "peekOfCode": "class TransformRegistry:\n _transforms: Dict[str, Type[Transform]] = {}\n @classmethod\n def register(cls, transform_class: Type[Transform]) -> None:\n cls._transforms[transform_class.name()] = transform_class\n @classmethod\n def transform_exists(cls, name: str) -> bool:\n return name in cls._transforms\n @classmethod\n def get_transform(", + "detail": "spectragraph-core.src.spectragraph_core.core.registry", + "documentation": {} + }, + { + "label": "InvalidTransformParams", + "kind": 6, + "importPath": "spectragraph-core.src.spectragraph_core.core.transform_base", + "description": "spectragraph-core.src.spectragraph_core.core.transform_base", + "peekOfCode": "class InvalidTransformParams(Exception):\n pass\ndef build_params_model(params_schema: list) -> BaseModel:\n \"\"\"\n Build a strict Pydantic model from a params_schema.\n Unknown fields will raise a validation error.\n Note: Vault secrets are always optional in the Pydantic model to allow\n for deferred configuration. Required validation happens after vault resolution.\n \"\"\"\n fields: Dict[str, Any] = {}", + "detail": "spectragraph-core.src.spectragraph_core.core.transform_base", + "documentation": {} + }, + { + "label": "Transform", + "kind": 6, + "importPath": "spectragraph-core.src.spectragraph_core.core.transform_base", + "description": "spectragraph-core.src.spectragraph_core.core.transform_base", + "peekOfCode": "class Transform(ABC):\n \"\"\"\n Abstract base class for all transforms.\n ## InputType and OutputType Pattern\n Transforms only need to define InputType and OutputType as class attributes.\n The base class automatically handles schema generation:\n ```python\n from typing import List\n from spectragraph_types import Domain\n from spectragraph_types import Ip", + "detail": "spectragraph-core.src.spectragraph_core.core.transform_base", + "documentation": {} + }, + { + "label": "build_params_model", + "kind": 2, + "importPath": "spectragraph-core.src.spectragraph_core.core.transform_base", + "description": "spectragraph-core.src.spectragraph_core.core.transform_base", + "peekOfCode": "def build_params_model(params_schema: list) -> BaseModel:\n \"\"\"\n Build a strict Pydantic model from a params_schema.\n Unknown fields will raise a validation error.\n Note: Vault secrets are always optional in the Pydantic model to allow\n for deferred configuration. Required validation happens after vault resolution.\n \"\"\"\n fields: Dict[str, Any] = {}\n for param in params_schema:\n name = param[\"name\"]", + "detail": "spectragraph-core.src.spectragraph_core.core.transform_base", + "documentation": {} + }, + { + "label": "Event", + "kind": 6, + "importPath": "spectragraph-core.src.spectragraph_core.core.types", + "description": "spectragraph-core.src.spectragraph_core.core.types", + "peekOfCode": "class Event(BaseModel):\n id: str = Field(..., description=\"Unique identifier for the event\")\n sketch_id: str = Field(..., description=\"ID of the sketch\")\n type: EventLevel = Field(..., description=\"Type of event\")\n payload: Dict[str, Any] = Field(..., description=\"Payload of the event\")\n created_at: datetime = Field(\n default_factory=datetime.now, description=\"Timestamp when the event was created\"\n )\nclass Node(BaseModel):\n \"\"\"Represents a node in a transformation flow with position and data.\"\"\"", + "detail": "spectragraph-core.src.spectragraph_core.core.types", + "documentation": {} + }, + { + "label": "Node", + "kind": 6, + "importPath": "spectragraph-core.src.spectragraph_core.core.types", + "description": "spectragraph-core.src.spectragraph_core.core.types", + "peekOfCode": "class Node(BaseModel):\n \"\"\"Represents a node in a transformation flow with position and data.\"\"\"\n id: str = Field(..., description=\"Unique identifier for the node\", title=\"Node ID\")\n data: Dict[str, Any] = Field(\n ..., description=\"Data payload associated with the node\", title=\"Node Data\"\n )\n position: Optional[Dict[str, float]] = Field(\n None, description=\"X and Y coordinates for node positioning\", title=\"Position\"\n )\n type: Optional[str] = Field(", + "detail": "spectragraph-core.src.spectragraph_core.core.types", + "documentation": {} + }, + { + "label": "Edge", + "kind": 6, + "importPath": "spectragraph-core.src.spectragraph_core.core.types", + "description": "spectragraph-core.src.spectragraph_core.core.types", + "peekOfCode": "class Edge(BaseModel):\n \"\"\"Represents an edge connecting two nodes in a transformation flow.\"\"\"\n id: str = Field(..., description=\"Unique identifier for the edge\", title=\"Edge ID\")\n data: Optional[Dict[str, Any]] = Field(\n None, description=\"Data payload associated with the edge\", title=\"Edge Data\"\n )\n source: str = Field(..., description=\"ID of the source node\", title=\"Source Node\")\n target: str = Field(..., description=\"ID of the target node\", title=\"Target Node\")\n sourceHandle: Optional[str] = Field(\n None, description=\"Handle ID on the source node\", title=\"Source Handle\"", + "detail": "spectragraph-core.src.spectragraph_core.core.types", + "documentation": {} + }, + { + "label": "FlowStep", + "kind": 6, + "importPath": "spectragraph-core.src.spectragraph_core.core.types", + "description": "spectragraph-core.src.spectragraph_core.core.types", + "peekOfCode": "class FlowStep(BaseModel):\n \"\"\"Represents a single step in a transformation flow with execution status.\"\"\"\n nodeId: str = Field(..., description=\"ID of the associated node\", title=\"Node ID\")\n params: Optional[Dict[str, Any]] = Field(\n None, description=\"Parameters for the step\", title=\"Parameters\"\n )\n type: Literal[\"type\", \"transform\"] = Field(\n ...,\n description=\"Type of step - either type transformation or transform\",\n title=\"Step Type\",", + "detail": "spectragraph-core.src.spectragraph_core.core.types", + "documentation": {} + }, + { + "label": "FlowBranch", + "kind": 6, + "importPath": "spectragraph-core.src.spectragraph_core.core.types", + "description": "spectragraph-core.src.spectragraph_core.core.types", + "peekOfCode": "class FlowBranch(BaseModel):\n \"\"\"Represents a branch containing a sequence of transformation steps.\"\"\"\n id: str = Field(\n ..., description=\"Unique identifier for the branch\", title=\"Branch ID\"\n )\n name: str = Field(\n ..., description=\"Human-readable name of the branch\", title=\"Branch Name\"\n )\n steps: List[FlowStep] = Field(\n ..., description=\"List of steps in this branch\", title=\"Steps\"", + "detail": "spectragraph-core.src.spectragraph_core.core.types", + "documentation": {} + }, + { + "label": "Role", + "kind": 6, + "importPath": "spectragraph-core.src.spectragraph_core.core.types", + "description": "spectragraph-core.src.spectragraph_core.core.types", + "peekOfCode": "class Role(str, enum.Enum):\n OWNER = \"owner\"\n EDITOR = \"editor\"\n VIEWER = \"viewer\"", + "detail": "spectragraph-core.src.spectragraph_core.core.types", + "documentation": {} + }, + { + "label": "VaultProtocol", + "kind": 6, + "importPath": "spectragraph-core.src.spectragraph_core.core.vault", + "description": "spectragraph-core.src.spectragraph_core.core.vault", + "peekOfCode": "class VaultProtocol(Protocol):\n def get_secret(self, vault_ref: str) -> Optional[str]: ...\n def set_secret(self, vault_ref: str, plain_key: str) -> Key: ...\nclass Vault(VaultProtocol):\n def __init__(self, db: Session, owner_id: uuid.UUID):\n if not owner_id:\n raise ValueError(\"owner_id is required to use the vault.\")\n self.db = db\n self.owner_id = str(owner_id)\n self.version = \"V1\"", + "detail": "spectragraph-core.src.spectragraph_core.core.vault", + "documentation": {} + }, + { + "label": "Vault", + "kind": 6, + "importPath": "spectragraph-core.src.spectragraph_core.core.vault", + "description": "spectragraph-core.src.spectragraph_core.core.vault", + "peekOfCode": "class Vault(VaultProtocol):\n def __init__(self, db: Session, owner_id: uuid.UUID):\n if not owner_id:\n raise ValueError(\"owner_id is required to use the vault.\")\n self.db = db\n self.owner_id = str(owner_id)\n self.version = \"V1\"\n def _get_master_key(self) -> bytes:\n \"\"\"\n Retrieve the master key", + "detail": "spectragraph-core.src.spectragraph_core.core.vault", + "documentation": {} + }, + { + "label": "detect_entity_type", + "kind": 2, + "importPath": "spectragraph-core.src.spectragraph_core.imports.entity_detection", + "description": "spectragraph-core.src.spectragraph_core.imports.entity_detection", + "peekOfCode": "def detect_entity_type(value: str) -> Optional[str]:\n \"\"\"\n Detect entity type based on value pattern.\n Returns the detected entity type or None if no match.\n Args:\n value: The string value to analyze\n Returns:\n Entity type string (e.g., \"Email\", \"Domain\", \"IP\") or None\n \"\"\"\n if not value or not isinstance(value, str):", + "detail": "spectragraph-core.src.spectragraph_core.imports.entity_detection", + "documentation": {} + }, + { + "label": "is_email", + "kind": 2, + "importPath": "spectragraph-core.src.spectragraph_core.imports.entity_detection", + "description": "spectragraph-core.src.spectragraph_core.imports.entity_detection", + "peekOfCode": "def is_email(value: str) -> bool:\n \"\"\"Check if value matches email pattern.\"\"\"\n email_pattern = r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$'\n return bool(re.match(email_pattern, value))\ndef is_domain(value: str) -> bool:\n \"\"\"Check if value matches domain pattern.\"\"\"\n # Basic domain pattern: contains dots and valid characters\n domain_pattern = r'^(?:[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?\\.)+[a-zA-Z]{2,}$'\n return bool(re.match(domain_pattern, value))\ndef is_ip_address(value: str) -> bool:", + "detail": "spectragraph-core.src.spectragraph_core.imports.entity_detection", + "documentation": {} + }, + { + "label": "is_domain", + "kind": 2, + "importPath": "spectragraph-core.src.spectragraph_core.imports.entity_detection", + "description": "spectragraph-core.src.spectragraph_core.imports.entity_detection", + "peekOfCode": "def is_domain(value: str) -> bool:\n \"\"\"Check if value matches domain pattern.\"\"\"\n # Basic domain pattern: contains dots and valid characters\n domain_pattern = r'^(?:[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?\\.)+[a-zA-Z]{2,}$'\n return bool(re.match(domain_pattern, value))\ndef is_ip_address(value: str) -> bool:\n \"\"\"Check if value is a valid IPv4 or IPv6 address.\"\"\"\n try:\n ipaddress.ip_address(value)\n return True", + "detail": "spectragraph-core.src.spectragraph_core.imports.entity_detection", + "documentation": {} + }, + { + "label": "is_ip_address", + "kind": 2, + "importPath": "spectragraph-core.src.spectragraph_core.imports.entity_detection", + "description": "spectragraph-core.src.spectragraph_core.imports.entity_detection", + "peekOfCode": "def is_ip_address(value: str) -> bool:\n \"\"\"Check if value is a valid IPv4 or IPv6 address.\"\"\"\n try:\n ipaddress.ip_address(value)\n return True\n except ValueError:\n return False\ndef is_website(value: str) -> bool:\n \"\"\"Check if value matches URL/website pattern.\"\"\"\n url_pattern = r'^https?://'", + "detail": "spectragraph-core.src.spectragraph_core.imports.entity_detection", + "documentation": {} + }, + { + "label": "is_website", + "kind": 2, + "importPath": "spectragraph-core.src.spectragraph_core.imports.entity_detection", + "description": "spectragraph-core.src.spectragraph_core.imports.entity_detection", + "peekOfCode": "def is_website(value: str) -> bool:\n \"\"\"Check if value matches URL/website pattern.\"\"\"\n url_pattern = r'^https?://'\n return bool(re.match(url_pattern, value, re.IGNORECASE))\ndef is_phone(value: str) -> bool:\n \"\"\"Check if value matches phone number pattern.\"\"\"\n # Remove common separators for checking\n cleaned = re.sub(r'[\\s\\-\\(\\)\\.]', '', value)\n # Check if it's mostly digits and has reasonable length\n phone_pattern = r'^\\+?[0-9]{7,15}$'", + "detail": "spectragraph-core.src.spectragraph_core.imports.entity_detection", + "documentation": {} + }, + { + "label": "is_phone", + "kind": 2, + "importPath": "spectragraph-core.src.spectragraph_core.imports.entity_detection", + "description": "spectragraph-core.src.spectragraph_core.imports.entity_detection", + "peekOfCode": "def is_phone(value: str) -> bool:\n \"\"\"Check if value matches phone number pattern.\"\"\"\n # Remove common separators for checking\n cleaned = re.sub(r'[\\s\\-\\(\\)\\.]', '', value)\n # Check if it's mostly digits and has reasonable length\n phone_pattern = r'^\\+?[0-9]{7,15}$'\n return bool(re.match(phone_pattern, cleaned))\ndef is_asn(value: str) -> bool:\n \"\"\"Check if value matches ASN pattern.\"\"\"\n asn_pattern = r'^AS\\d+$'", + "detail": "spectragraph-core.src.spectragraph_core.imports.entity_detection", + "documentation": {} + }, + { + "label": "is_asn", + "kind": 2, + "importPath": "spectragraph-core.src.spectragraph_core.imports.entity_detection", + "description": "spectragraph-core.src.spectragraph_core.imports.entity_detection", + "peekOfCode": "def is_asn(value: str) -> bool:\n \"\"\"Check if value matches ASN pattern.\"\"\"\n asn_pattern = r'^AS\\d+$'\n return bool(re.match(asn_pattern, value, re.IGNORECASE))\ndef is_username(value: str) -> bool:\n \"\"\"Check if value matches username pattern (social media style).\"\"\"\n # Matches @username format or simple alphanumeric with underscores\n username_pattern = r'^@?[a-zA-Z0-9_]{3,30}$'\n if re.match(username_pattern, value):\n # Additional check: starts with @ or is not purely numeric", + "detail": "spectragraph-core.src.spectragraph_core.imports.entity_detection", + "documentation": {} + }, + { + "label": "is_username", + "kind": 2, + "importPath": "spectragraph-core.src.spectragraph_core.imports.entity_detection", + "description": "spectragraph-core.src.spectragraph_core.imports.entity_detection", + "peekOfCode": "def is_username(value: str) -> bool:\n \"\"\"Check if value matches username pattern (social media style).\"\"\"\n # Matches @username format or simple alphanumeric with underscores\n username_pattern = r'^@?[a-zA-Z0-9_]{3,30}$'\n if re.match(username_pattern, value):\n # Additional check: starts with @ or is not purely numeric\n return value.startswith('@') or not value.lstrip('@').isdigit()\n return False\ndef get_default_label(entity_type: str, value: str) -> str:\n \"\"\"", + "detail": "spectragraph-core.src.spectragraph_core.imports.entity_detection", + "documentation": {} + }, + { + "label": "get_default_label", + "kind": 2, + "importPath": "spectragraph-core.src.spectragraph_core.imports.entity_detection", + "description": "spectragraph-core.src.spectragraph_core.imports.entity_detection", + "peekOfCode": "def get_default_label(entity_type: str, value: str) -> str:\n \"\"\"\n Get default label for an entity based on its type and value.\n Args:\n entity_type: The detected or selected entity type\n value: The entity value\n Returns:\n Default label string\n \"\"\"\n # For most types, the value itself is a good label", + "detail": "spectragraph-core.src.spectragraph_core.imports.entity_detection", + "documentation": {} + }, + { + "label": "DETECTORS", + "kind": 5, + "importPath": "spectragraph-core.src.spectragraph_core.imports.entity_detection", + "description": "spectragraph-core.src.spectragraph_core.imports.entity_detection", + "peekOfCode": "DETECTORS = [\n (\"Email\", lambda v: is_email(v)),\n (\"IP\", lambda v: is_ip_address(v)),\n (\"Website\", lambda v: is_website(v)),\n (\"Domain\", lambda v: is_domain(v)),\n (\"Phone\", lambda v: is_phone(v)),\n (\"ASN\", lambda v: is_asn(v)),\n (\"Username\", lambda v: is_username(v)),\n]\ndef detect_entity_type(value: str) -> Optional[str]:", + "detail": "spectragraph-core.src.spectragraph_core.imports.entity_detection", + "documentation": {} + }, + { + "label": "EntityPreview", + "kind": 6, + "importPath": "spectragraph-core.src.spectragraph_core.imports.file_parser", + "description": "spectragraph-core.src.spectragraph_core.imports.file_parser", + "peekOfCode": "class EntityPreview:\n \"\"\"Preview of a single entity to be imported.\"\"\"\n row_index: int\n \"\"\"Index of the row (0-based).\"\"\"\n data: Dict[str, Any]\n \"\"\"All column data as key-value pairs.\"\"\"\n detected_type: str\n \"\"\"Detected entity type (e.g., \"Email\", \"Domain\").\"\"\"\n primary_value: str\n \"\"\"Primary identifier value for the entity.\"\"\"", + "detail": "spectragraph-core.src.spectragraph_core.imports.file_parser", + "documentation": {} + }, + { + "label": "FileParseResult", + "kind": 6, + "importPath": "spectragraph-core.src.spectragraph_core.imports.file_parser", + "description": "spectragraph-core.src.spectragraph_core.imports.file_parser", + "peekOfCode": "class FileParseResult:\n \"\"\"Result of parsing an import file.\"\"\"\n entities: List[EntityPreview]\n \"\"\"List of detected entities from the file.\"\"\"\n total_entities: int\n \"\"\"Total number of entities (rows).\"\"\"\n type_distribution: Dict[str, int]\n \"\"\"Distribution of detected types: {type_name: count}.\"\"\"\n columns: List[str]\n \"\"\"Column names found in the file (for reference).\"\"\"", + "detail": "spectragraph-core.src.spectragraph_core.imports.file_parser", + "documentation": {} + }, + { + "label": "parse_file", + "kind": 2, + "importPath": "spectragraph-core.src.spectragraph_core.imports.file_parser", + "description": "spectragraph-core.src.spectragraph_core.imports.file_parser", + "peekOfCode": "def parse_file(\n file_content: Union[bytes, BinaryIO],\n filename: str,\n max_preview_rows: int = 100,\n) -> FileParseResult:\n \"\"\"\n Parse an uploaded file and analyze its contents.\n Each row is treated as a single entity.\n Args:\n file_content: File content as bytes or file-like object", + "detail": "spectragraph-core.src.spectragraph_core.imports.file_parser", + "documentation": {} + }, + { + "label": "detect_entity_type_from_row", + "kind": 2, + "importPath": "spectragraph-core.src.spectragraph_core.imports.type_matcher", + "description": "spectragraph-core.src.spectragraph_core.imports.type_matcher", + "peekOfCode": "def detect_entity_type_from_row(row_data: Dict[str, Any]) -> Optional[str]:\n \"\"\"\n Detect the most likely entity type for a row of data.\n Args:\n row_data: Dictionary of column_name: value pairs\n Returns:\n Entity type name (e.g., \"Email\", \"Domain\", \"Ip\") or None\n \"\"\"\n if not row_data:\n return None", + "detail": "spectragraph-core.src.spectragraph_core.imports.type_matcher", + "documentation": {} + }, + { + "label": "get_primary_identifier", + "kind": 2, + "importPath": "spectragraph-core.src.spectragraph_core.imports.type_matcher", + "description": "spectragraph-core.src.spectragraph_core.imports.type_matcher", + "peekOfCode": "def get_primary_identifier(row_data: Dict[str, Any], entity_type: str) -> Optional[str]:\n \"\"\"\n Get the primary identifier value for an entity based on its type.\n Args:\n row_data: Dictionary of column_name: value pairs\n entity_type: The detected entity type\n Returns:\n The primary identifier value (e.g., email address, domain name, IP)\n \"\"\"\n normalized_data = {k.lower().strip(): v for k, v in row_data.items() if v}", + "detail": "spectragraph-core.src.spectragraph_core.imports.type_matcher", + "documentation": {} + }, + { + "label": "emit_event_task", + "kind": 2, + "importPath": "spectragraph-core.src.spectragraph_core.tasks.event", + "description": "spectragraph-core.src.spectragraph_core.tasks.event", + "peekOfCode": "def emit_event_task(log_id: str, sketch_id: str, log_type: EventLevel, content: Dict):\n \"\"\"Celery task to emit a log event\"\"\"\n try:\n event = Event(\n id=log_id, sketch_id=sketch_id, type=log_type, payload=content\n ).model_dump_json()\n redis_client = redis.from_url(os.environ[\"REDIS_URL\"])\n redis_client.publish(sketch_id, event)\n except Exception as e:\n raise", + "detail": "spectragraph-core.src.spectragraph_core.tasks.event", + "documentation": {} + }, + { + "label": "logger", + "kind": 5, + "importPath": "spectragraph-core.src.spectragraph_core.tasks.event", + "description": "spectragraph-core.src.spectragraph_core.tasks.event", + "peekOfCode": "logger = logging.getLogger(__name__)\n@celery.task(name=\"emit_event\")\ndef emit_event_task(log_id: str, sketch_id: str, log_type: EventLevel, content: Dict):\n \"\"\"Celery task to emit a log event\"\"\"\n try:\n event = Event(\n id=log_id, sketch_id=sketch_id, type=log_type, payload=content\n ).model_dump_json()\n redis_client = redis.from_url(os.environ[\"REDIS_URL\"])\n redis_client.publish(sketch_id, event)", + "detail": "spectragraph-core.src.spectragraph_core.tasks.event", + "documentation": {} + }, + { + "label": "run_flow", + "kind": 2, + "importPath": "spectragraph-core.src.spectragraph_core.tasks.flow", + "description": "spectragraph-core.src.spectragraph_core.tasks.flow", + "peekOfCode": "def run_flow(\n self,\n transform_branches,\n values: List[str],\n sketch_id: str | None,\n owner_id: Optional[str] = None,\n):\n session = SessionLocal()\n try:\n if not transform_branches:", + "detail": "spectragraph-core.src.spectragraph_core.tasks.flow", + "documentation": {} + }, + { + "label": "URI", + "kind": 5, + "importPath": "spectragraph-core.src.spectragraph_core.tasks.flow", + "description": "spectragraph-core.src.spectragraph_core.tasks.flow", + "peekOfCode": "URI = os.getenv(\"NEO4J_URI_BOLT\")\nUSERNAME = os.getenv(\"NEO4J_USERNAME\")\nPASSWORD = os.getenv(\"NEO4J_PASSWORD\")\nneo4j_connection = Neo4jConnection(URI, USERNAME, PASSWORD)\ndb: Session = next(get_db())\nlogger = Logger()\n@celery.task(name=\"run_flow\", bind=True)\ndef run_flow(\n self,\n transform_branches,", + "detail": "spectragraph-core.src.spectragraph_core.tasks.flow", + "documentation": {} + }, + { + "label": "USERNAME", + "kind": 5, + "importPath": "spectragraph-core.src.spectragraph_core.tasks.flow", + "description": "spectragraph-core.src.spectragraph_core.tasks.flow", + "peekOfCode": "USERNAME = os.getenv(\"NEO4J_USERNAME\")\nPASSWORD = os.getenv(\"NEO4J_PASSWORD\")\nneo4j_connection = Neo4jConnection(URI, USERNAME, PASSWORD)\ndb: Session = next(get_db())\nlogger = Logger()\n@celery.task(name=\"run_flow\", bind=True)\ndef run_flow(\n self,\n transform_branches,\n values: List[str],", + "detail": "spectragraph-core.src.spectragraph_core.tasks.flow", + "documentation": {} + }, + { + "label": "PASSWORD", + "kind": 5, + "importPath": "spectragraph-core.src.spectragraph_core.tasks.flow", + "description": "spectragraph-core.src.spectragraph_core.tasks.flow", + "peekOfCode": "PASSWORD = os.getenv(\"NEO4J_PASSWORD\")\nneo4j_connection = Neo4jConnection(URI, USERNAME, PASSWORD)\ndb: Session = next(get_db())\nlogger = Logger()\n@celery.task(name=\"run_flow\", bind=True)\ndef run_flow(\n self,\n transform_branches,\n values: List[str],\n sketch_id: str | None,", + "detail": "spectragraph-core.src.spectragraph_core.tasks.flow", + "documentation": {} + }, + { + "label": "neo4j_connection", + "kind": 5, + "importPath": "spectragraph-core.src.spectragraph_core.tasks.flow", + "description": "spectragraph-core.src.spectragraph_core.tasks.flow", + "peekOfCode": "neo4j_connection = Neo4jConnection(URI, USERNAME, PASSWORD)\ndb: Session = next(get_db())\nlogger = Logger()\n@celery.task(name=\"run_flow\", bind=True)\ndef run_flow(\n self,\n transform_branches,\n values: List[str],\n sketch_id: str | None,\n owner_id: Optional[str] = None,", + "detail": "spectragraph-core.src.spectragraph_core.tasks.flow", + "documentation": {} + }, + { + "label": "logger", + "kind": 5, + "importPath": "spectragraph-core.src.spectragraph_core.tasks.flow", + "description": "spectragraph-core.src.spectragraph_core.tasks.flow", + "peekOfCode": "logger = Logger()\n@celery.task(name=\"run_flow\", bind=True)\ndef run_flow(\n self,\n transform_branches,\n values: List[str],\n sketch_id: str | None,\n owner_id: Optional[str] = None,\n):\n session = SessionLocal()", + "detail": "spectragraph-core.src.spectragraph_core.tasks.flow", + "documentation": {} + }, + { + "label": "run_transform", + "kind": 2, + "importPath": "spectragraph-core.src.spectragraph_core.tasks.transform", + "description": "spectragraph-core.src.spectragraph_core.tasks.transform", + "peekOfCode": "def run_transform(\n self,\n transform_name: str,\n values: List[str],\n sketch_id: str | None,\n owner_id: Optional[str] = None,\n):\n session = SessionLocal()\n try:\n scan_id = uuid.UUID(self.request.id)", + "detail": "spectragraph-core.src.spectragraph_core.tasks.transform", + "documentation": {} + }, + { + "label": "URI", + "kind": 5, + "importPath": "spectragraph-core.src.spectragraph_core.tasks.transform", + "description": "spectragraph-core.src.spectragraph_core.tasks.transform", + "peekOfCode": "URI = os.getenv(\"NEO4J_URI_BOLT\")\nUSERNAME = os.getenv(\"NEO4J_USERNAME\")\nPASSWORD = os.getenv(\"NEO4J_PASSWORD\")\nneo4j_connection = Neo4jConnection(URI, USERNAME, PASSWORD)\ndb: Session = next(get_db())\nlogger = Logger()\n@celery.task(name=\"run_transform\", bind=True)\ndef run_transform(\n self,\n transform_name: str,", + "detail": "spectragraph-core.src.spectragraph_core.tasks.transform", + "documentation": {} + }, + { + "label": "USERNAME", + "kind": 5, + "importPath": "spectragraph-core.src.spectragraph_core.tasks.transform", + "description": "spectragraph-core.src.spectragraph_core.tasks.transform", + "peekOfCode": "USERNAME = os.getenv(\"NEO4J_USERNAME\")\nPASSWORD = os.getenv(\"NEO4J_PASSWORD\")\nneo4j_connection = Neo4jConnection(URI, USERNAME, PASSWORD)\ndb: Session = next(get_db())\nlogger = Logger()\n@celery.task(name=\"run_transform\", bind=True)\ndef run_transform(\n self,\n transform_name: str,\n values: List[str],", + "detail": "spectragraph-core.src.spectragraph_core.tasks.transform", + "documentation": {} + }, + { + "label": "PASSWORD", + "kind": 5, + "importPath": "spectragraph-core.src.spectragraph_core.tasks.transform", + "description": "spectragraph-core.src.spectragraph_core.tasks.transform", + "peekOfCode": "PASSWORD = os.getenv(\"NEO4J_PASSWORD\")\nneo4j_connection = Neo4jConnection(URI, USERNAME, PASSWORD)\ndb: Session = next(get_db())\nlogger = Logger()\n@celery.task(name=\"run_transform\", bind=True)\ndef run_transform(\n self,\n transform_name: str,\n values: List[str],\n sketch_id: str | None,", + "detail": "spectragraph-core.src.spectragraph_core.tasks.transform", + "documentation": {} + }, + { + "label": "neo4j_connection", + "kind": 5, + "importPath": "spectragraph-core.src.spectragraph_core.tasks.transform", + "description": "spectragraph-core.src.spectragraph_core.tasks.transform", + "peekOfCode": "neo4j_connection = Neo4jConnection(URI, USERNAME, PASSWORD)\ndb: Session = next(get_db())\nlogger = Logger()\n@celery.task(name=\"run_transform\", bind=True)\ndef run_transform(\n self,\n transform_name: str,\n values: List[str],\n sketch_id: str | None,\n owner_id: Optional[str] = None,", + "detail": "spectragraph-core.src.spectragraph_core.tasks.transform", + "documentation": {} + }, + { + "label": "logger", + "kind": 5, + "importPath": "spectragraph-core.src.spectragraph_core.tasks.transform", + "description": "spectragraph-core.src.spectragraph_core.tasks.transform", + "peekOfCode": "logger = Logger()\n@celery.task(name=\"run_transform\", bind=True)\ndef run_transform(\n self,\n transform_name: str,\n values: List[str],\n sketch_id: str | None,\n owner_id: Optional[str] = None,\n):\n session = SessionLocal()", + "detail": "spectragraph-core.src.spectragraph_core.tasks.transform", + "documentation": {} + }, + { + "label": "TestPasswordHashing", + "kind": 6, + "importPath": "spectragraph-core.src.spectragraph_core.tests.test_auth", + "description": "spectragraph-core.src.spectragraph_core.tests.test_auth", + "peekOfCode": "class TestPasswordHashing:\n \"\"\"Test password hashing and verification.\"\"\"\n def test_password_hash_and_verify(self):\n \"\"\"Test that password hashing and verification works correctly.\"\"\"\n password = \"test_password_123\"\n hashed = get_password_hash(password)\n # Hashed password should be different from plain password\n assert hashed != password\n # Verification should succeed with correct password\n assert verify_password(password, hashed) is True", + "detail": "spectragraph-core.src.spectragraph_core.tests.test_auth", + "documentation": {} + }, + { + "label": "TestTokenGeneration", + "kind": 6, + "importPath": "spectragraph-core.src.spectragraph_core.tests.test_auth", + "description": "spectragraph-core.src.spectragraph_core.tests.test_auth", + "peekOfCode": "class TestTokenGeneration:\n \"\"\"Test JWT token generation and expiration.\"\"\"\n def test_token_expiration_is_60_minutes(self):\n \"\"\"\n Test that ACCESS_TOKEN_EXPIRE_MINUTES is set to 60 minutes (1 hour).\n This is a security requirement - tokens should not be valid for too long.\n Previously this was incorrectly set to 3600 minutes (60 hours).\n \"\"\"\n assert ACCESS_TOKEN_EXPIRE_MINUTES == 60, (\n f\"Token expiration should be 60 minutes, but is set to \"", + "detail": "spectragraph-core.src.spectragraph_core.tests.test_auth", + "documentation": {} + }, + { + "label": "os.environ['AUTH_SECRET']", + "kind": 5, + "importPath": "spectragraph-core.src.spectragraph_core.tests.test_auth", + "description": "spectragraph-core.src.spectragraph_core.tests.test_auth", + "peekOfCode": "os.environ['AUTH_SECRET'] = 'test_secret_for_testing_only'\nfrom jose import jwt\nfrom spectragraph_core.core.auth import (\n create_access_token,\n verify_password,\n get_password_hash,\n ACCESS_TOKEN_EXPIRE_MINUTES,\n AUTH_SECRET,\n ALGORITHM,\n)", + "detail": "spectragraph-core.src.spectragraph_core.tests.test_auth", + "documentation": {} + }, + { + "label": "is_valid_ip", + "kind": 2, + "importPath": "spectragraph-core.src.spectragraph_core.utils", + "description": "spectragraph-core.src.spectragraph_core.utils", + "peekOfCode": "def is_valid_ip(address: str) -> bool:\n try:\n ipaddress.ip_address(address)\n return True\n except ValueError:\n return False\ndef is_valid_username(username: str) -> bool:\n if not re.match(r\"^[a-zA-Z0-9_-]{3,30}$\", username):\n return False\n return True", + "detail": "spectragraph-core.src.spectragraph_core.utils", + "documentation": {} + }, + { + "label": "is_valid_username", + "kind": 2, + "importPath": "spectragraph-core.src.spectragraph_core.utils", + "description": "spectragraph-core.src.spectragraph_core.utils", + "peekOfCode": "def is_valid_username(username: str) -> bool:\n if not re.match(r\"^[a-zA-Z0-9_-]{3,30}$\", username):\n return False\n return True\ndef is_valid_email(email: str) -> bool:\n if not re.match(r\"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$\", email):\n return False\n return True\ndef is_valid_domain(url_or_domain: str) -> str:\n try:", + "detail": "spectragraph-core.src.spectragraph_core.utils", + "documentation": {} + }, + { + "label": "is_valid_email", + "kind": 2, + "importPath": "spectragraph-core.src.spectragraph_core.utils", + "description": "spectragraph-core.src.spectragraph_core.utils", + "peekOfCode": "def is_valid_email(email: str) -> bool:\n if not re.match(r\"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$\", email):\n return False\n return True\ndef is_valid_domain(url_or_domain: str) -> str:\n try:\n parsed = urlparse(\n url_or_domain if \"://\" in url_or_domain else \"http://\" + url_or_domain\n )\n hostname = parsed.hostname or url_or_domain", + "detail": "spectragraph-core.src.spectragraph_core.utils", + "documentation": {} + }, + { + "label": "is_valid_domain", + "kind": 2, + "importPath": "spectragraph-core.src.spectragraph_core.utils", + "description": "spectragraph-core.src.spectragraph_core.utils", + "peekOfCode": "def is_valid_domain(url_or_domain: str) -> str:\n try:\n parsed = urlparse(\n url_or_domain if \"://\" in url_or_domain else \"http://\" + url_or_domain\n )\n hostname = parsed.hostname or url_or_domain\n if not hostname or \".\" not in hostname:\n return False\n if not re.match(r\"^[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$\", hostname):\n return False", + "detail": "spectragraph-core.src.spectragraph_core.utils", + "documentation": {} + }, + { + "label": "is_root_domain", + "kind": 2, + "importPath": "spectragraph-core.src.spectragraph_core.utils", + "description": "spectragraph-core.src.spectragraph_core.utils", + "peekOfCode": "def is_root_domain(domain: str) -> bool:\n \"\"\"\n Determine if a domain is a root domain or subdomain.\n Args:\n domain: The domain string to check\n Returns:\n True if it's a root domain (e.g., example.com), False if it's a subdomain (e.g., sub.example.com)\n \"\"\"\n try:\n # Remove protocol if present", + "detail": "spectragraph-core.src.spectragraph_core.utils", + "documentation": {} + }, + { + "label": "is_valid_number", + "kind": 2, + "importPath": "spectragraph-core.src.spectragraph_core.utils", + "description": "spectragraph-core.src.spectragraph_core.utils", + "peekOfCode": "def is_valid_number(phone: str, region: str = \"FR\") -> None:\n \"\"\"\n Validates a phone number. Raises InvalidPhoneNumberError if invalid.\n - `region` should be ISO 3166-1 alpha-2 country code (e.g., 'FR' for France)\n \"\"\"\n try:\n parsed = phonenumbers.parse(phone, region)\n if not phonenumbers.is_valid_number(parsed):\n return False\n except NumberParseException:", + "detail": "spectragraph-core.src.spectragraph_core.utils", + "documentation": {} + }, + { + "label": "parse_asn", + "kind": 2, + "importPath": "spectragraph-core.src.spectragraph_core.utils", + "description": "spectragraph-core.src.spectragraph_core.utils", + "peekOfCode": "def parse_asn(asn: str) -> int:\n if not is_valid_asn(asn):\n raise ValueError(f\"Invalid ASN format: {asn}\")\n return int(re.sub(r\"(?i)^AS\", \"\", asn))\ndef is_valid_asn(asn: str) -> bool:\n if not re.fullmatch(r\"(AS)?\\d+\", asn, re.IGNORECASE):\n return False\n asn_num = int(re.sub(r\"(?i)^AS\", \"\", asn))\n return 0 <= asn_num <= 4294967295\ndef resolve_type(details: dict, schema_context: dict = None) -> str:", + "detail": "spectragraph-core.src.spectragraph_core.utils", + "documentation": {} + }, + { + "label": "is_valid_asn", + "kind": 2, + "importPath": "spectragraph-core.src.spectragraph_core.utils", + "description": "spectragraph-core.src.spectragraph_core.utils", + "peekOfCode": "def is_valid_asn(asn: str) -> bool:\n if not re.fullmatch(r\"(AS)?\\d+\", asn, re.IGNORECASE):\n return False\n asn_num = int(re.sub(r\"(?i)^AS\", \"\", asn))\n return 0 <= asn_num <= 4294967295\ndef resolve_type(details: dict, schema_context: dict = None) -> str:\n if \"anyOf\" in details:\n types = []\n for option in details[\"anyOf\"]:\n if \"$ref\" in option:", + "detail": "spectragraph-core.src.spectragraph_core.utils", + "documentation": {} + }, + { + "label": "resolve_type", + "kind": 2, + "importPath": "spectragraph-core.src.spectragraph_core.utils", + "description": "spectragraph-core.src.spectragraph_core.utils", + "peekOfCode": "def resolve_type(details: dict, schema_context: dict = None) -> str:\n if \"anyOf\" in details:\n types = []\n for option in details[\"anyOf\"]:\n if \"$ref\" in option:\n ref = option[\"$ref\"].split(\"/\")[-1]\n types.append(ref)\n elif option.get(\"type\") == \"array\":\n # Handle array types within anyOf\n item_type = resolve_type(option.get(\"items\", {}), schema_context)", + "detail": "spectragraph-core.src.spectragraph_core.utils", + "documentation": {} + }, + { + "label": "extract_input_schema_flow", + "kind": 2, + "importPath": "spectragraph-core.src.spectragraph_core.utils", + "description": "spectragraph-core.src.spectragraph_core.utils", + "peekOfCode": "def extract_input_schema_flow(model: Type[BaseModel]) -> Dict[str, Any]:\n adapter = TypeAdapter(model)\n schema = adapter.json_schema()\n # Use the main schema properties, not the $defs\n type_name = model.__name__\n details = schema\n return {\n \"class_name\": model.__name__,\n \"name\": model.__name__,\n \"module\": model.__module__,", + "detail": "spectragraph-core.src.spectragraph_core.utils", + "documentation": {} + }, + { + "label": "get_domain_from_ssl", + "kind": 2, + "importPath": "spectragraph-core.src.spectragraph_core.utils", + "description": "spectragraph-core.src.spectragraph_core.utils", + "peekOfCode": "def get_domain_from_ssl(ip: str, port: int = 443) -> str | None:\n try:\n context = ssl.create_default_context()\n with socket.create_connection((ip, port), timeout=3) as sock:\n with context.wrap_socket(sock, server_hostname=ip) as ssock:\n cert = ssock.getpeercert()\n subject = cert.get(\"subject\", [])\n for entry in subject:\n if entry[0][0] == \"commonName\":\n return entry[0][1]", + "detail": "spectragraph-core.src.spectragraph_core.utils", + "documentation": {} + }, + { + "label": "extract_transform", + "kind": 2, + "importPath": "spectragraph-core.src.spectragraph_core.utils", + "description": "spectragraph-core.src.spectragraph_core.utils", + "peekOfCode": "def extract_transform(transform: Dict[str, Any]) -> Dict[str, Any]:\n nodes = transform[\"nodes\"]\n edges = transform[\"edges\"]\n input_node = next((node for node in nodes if node[\"data\"][\"type\"] == \"type\"), None)\n if not input_node:\n raise ValueError(\"No input node found.\")\n input_output = input_node[\"data\"][\"outputs\"]\n node_lookup = {node[\"id\"]: node for node in nodes}\n transforms = []\n for edge in edges:", + "detail": "spectragraph-core.src.spectragraph_core.utils", + "documentation": {} + }, + { + "label": "get_label_color", + "kind": 2, + "importPath": "spectragraph-core.src.spectragraph_core.utils", + "description": "spectragraph-core.src.spectragraph_core.utils", + "peekOfCode": "def get_label_color(label: str) -> str:\n color_map = {\"subdomain\": \"#A5ABB6\", \"domain\": \"#68BDF6\", \"default\": \"#A5ABB6\"}\n return color_map.get(label, color_map[\"default\"])\ndef flatten(data_dict, prefix=\"\"):\n \"\"\"\n Flattens a dictionary to contain only Neo4j-compatible property values.\n Neo4j supports primitive types (string, number, boolean) and arrays of those types.\n Args:\n data_dict (dict): Dictionary to flatten\n Returns:", + "detail": "spectragraph-core.src.spectragraph_core.utils", + "documentation": {} + }, + { + "label": "flatten", + "kind": 2, + "importPath": "spectragraph-core.src.spectragraph_core.utils", + "description": "spectragraph-core.src.spectragraph_core.utils", + "peekOfCode": "def flatten(data_dict, prefix=\"\"):\n \"\"\"\n Flattens a dictionary to contain only Neo4j-compatible property values.\n Neo4j supports primitive types (string, number, boolean) and arrays of those types.\n Args:\n data_dict (dict): Dictionary to flatten\n Returns:\n dict: Flattened dictionary with only Neo4j-compatible values\n \"\"\"\n flattened = {}", + "detail": "spectragraph-core.src.spectragraph_core.utils", + "documentation": {} + }, + { + "label": "get_inline_relationships", + "kind": 2, + "importPath": "spectragraph-core.src.spectragraph_core.utils", + "description": "spectragraph-core.src.spectragraph_core.utils", + "peekOfCode": "def get_inline_relationships(nodes: List[Any], edges: List[Any]) -> List[str]:\n \"\"\"\n Get the inline relationships for a list of nodes and edges.\n \"\"\"\n relationships = []\n for edge in edges:\n source = next((node for node in nodes if node[\"id\"] == edge[\"source\"]), None)\n target = next((node for node in nodes if node[\"id\"] == edge[\"target\"]), None)\n if source and target:\n relationships.append({\"source\": source, \"edge\": edge, \"target\": target})", + "detail": "spectragraph-core.src.spectragraph_core.utils", + "documentation": {} + }, + { + "label": "to_json_serializable", + "kind": 2, + "importPath": "spectragraph-core.src.spectragraph_core.utils", + "description": "spectragraph-core.src.spectragraph_core.utils", + "peekOfCode": "def to_json_serializable(obj):\n \"\"\"Convert any object to a JSON-serializable format.\"\"\"\n import json\n from pydantic import BaseModel\n try:\n # Test if already JSON serializable\n json.dumps(obj)\n return obj\n except (TypeError, ValueError):\n # Handle common cases", + "detail": "spectragraph-core.src.spectragraph_core.utils", + "documentation": {} + }, + { + "label": "TestEmailDetection", + "kind": 6, + "importPath": "spectragraph-core.tests.import.test_entity_detection", + "description": "spectragraph-core.tests.import.test_entity_detection", + "peekOfCode": "class TestEmailDetection:\n \"\"\"Tests for email detection.\"\"\"\n def test_valid_emails(self):\n \"\"\"Test detection of valid email addresses.\"\"\"\n valid_emails = [\n \"user@example.com\",\n \"test.user@domain.co.uk\",\n \"admin+tag@company.org\",\n \"user_name@sub.domain.com\",\n \"123@numbers.com\",", + "detail": "spectragraph-core.tests.import.test_entity_detection", + "documentation": {} + }, + { + "label": "TestDomainDetection", + "kind": 6, + "importPath": "spectragraph-core.tests.import.test_entity_detection", + "description": "spectragraph-core.tests.import.test_entity_detection", + "peekOfCode": "class TestDomainDetection:\n \"\"\"Tests for domain detection.\"\"\"\n def test_valid_domains(self):\n \"\"\"Test detection of valid domains.\"\"\"\n valid_domains = [\n \"example.com\",\n \"sub.domain.com\",\n \"my-domain.co.uk\",\n \"test123.org\",\n \"a.b.c.d.example.com\",", + "detail": "spectragraph-core.tests.import.test_entity_detection", + "documentation": {} + }, + { + "label": "TestIPAddressDetection", + "kind": 6, + "importPath": "spectragraph-core.tests.import.test_entity_detection", + "description": "spectragraph-core.tests.import.test_entity_detection", + "peekOfCode": "class TestIPAddressDetection:\n \"\"\"Tests for IP address detection.\"\"\"\n def test_valid_ipv4(self):\n \"\"\"Test detection of valid IPv4 addresses.\"\"\"\n valid_ips = [\n \"192.168.1.1\",\n \"10.0.0.1\",\n \"172.16.0.1\",\n \"8.8.8.8\",\n \"255.255.255.255\",", + "detail": "spectragraph-core.tests.import.test_entity_detection", + "documentation": {} + }, + { + "label": "TestWebsiteDetection", + "kind": 6, + "importPath": "spectragraph-core.tests.import.test_entity_detection", + "description": "spectragraph-core.tests.import.test_entity_detection", + "peekOfCode": "class TestWebsiteDetection:\n \"\"\"Tests for website/URL detection.\"\"\"\n def test_valid_websites(self):\n \"\"\"Test detection of valid URLs.\"\"\"\n valid_urls = [\n \"http://example.com\",\n \"https://www.example.com\",\n \"http://sub.domain.com/path\",\n \"https://example.com:8080/path?query=value\",\n ]", + "detail": "spectragraph-core.tests.import.test_entity_detection", + "documentation": {} + }, + { + "label": "TestPhoneDetection", + "kind": 6, + "importPath": "spectragraph-core.tests.import.test_entity_detection", + "description": "spectragraph-core.tests.import.test_entity_detection", + "peekOfCode": "class TestPhoneDetection:\n \"\"\"Tests for phone number detection.\"\"\"\n def test_valid_phones(self):\n \"\"\"Test detection of valid phone numbers.\"\"\"\n valid_phones = [\n \"+1234567890\",\n \"123-456-7890\",\n \"(123) 456-7890\",\n \"+44 20 7123 4567\",\n \"555.123.4567\",", + "detail": "spectragraph-core.tests.import.test_entity_detection", + "documentation": {} + }, + { + "label": "TestASNDetection", + "kind": 6, + "importPath": "spectragraph-core.tests.import.test_entity_detection", + "description": "spectragraph-core.tests.import.test_entity_detection", + "peekOfCode": "class TestASNDetection:\n \"\"\"Tests for ASN detection.\"\"\"\n def test_valid_asns(self):\n \"\"\"Test detection of valid ASNs.\"\"\"\n valid_asns = [\n \"AS13335\",\n \"as64512\",\n \"AS1\",\n \"AS4294967295\",\n ]", + "detail": "spectragraph-core.tests.import.test_entity_detection", + "documentation": {} + }, + { + "label": "TestUsernameDetection", + "kind": 6, + "importPath": "spectragraph-core.tests.import.test_entity_detection", + "description": "spectragraph-core.tests.import.test_entity_detection", + "peekOfCode": "class TestUsernameDetection:\n \"\"\"Tests for username detection.\"\"\"\n def test_valid_usernames(self):\n \"\"\"Test detection of valid usernames.\"\"\"\n valid_usernames = [\n \"@john_doe\",\n \"@user123\",\n \"username\",\n \"user_name_123\",\n ]", + "detail": "spectragraph-core.tests.import.test_entity_detection", + "documentation": {} + }, + { + "label": "TestDetectionPriority", + "kind": 6, + "importPath": "spectragraph-core.tests.import.test_entity_detection", + "description": "spectragraph-core.tests.import.test_entity_detection", + "peekOfCode": "class TestDetectionPriority:\n \"\"\"Tests for detection priority and edge cases.\"\"\"\n def test_email_vs_username(self):\n \"\"\"Email should take priority over username.\"\"\"\n assert detect_entity_type(\"user@example.com\") == \"Email\"\n def test_url_vs_domain(self):\n \"\"\"URL should take priority over domain.\"\"\"\n assert detect_entity_type(\"http://example.com\") == \"Website\"\n assert detect_entity_type(\"example.com\") == \"Domain\"\n def test_ip_vs_domain(self):", + "detail": "spectragraph-core.tests.import.test_entity_detection", + "documentation": {} + }, + { + "label": "TestGetDefaultLabel", + "kind": 6, + "importPath": "spectragraph-core.tests.import.test_entity_detection", + "description": "spectragraph-core.tests.import.test_entity_detection", + "peekOfCode": "class TestGetDefaultLabel:\n \"\"\"Tests for get_default_label function.\"\"\"\n def test_email_label(self):\n \"\"\"Test label generation for email.\"\"\"\n assert get_default_label(\"Email\", \"user@example.com\") == \"user@example.com\"\n def test_domain_label(self):\n \"\"\"Test label generation for domain.\"\"\"\n assert get_default_label(\"Domain\", \"example.com\") == \"example.com\"\n def test_ip_label(self):\n \"\"\"Test label generation for IP.\"\"\"", + "detail": "spectragraph-core.tests.import.test_entity_detection", + "documentation": {} + }, + { + "label": "TestEntityBasedImportWorkflow", + "kind": 6, + "importPath": "spectragraph-core.tests.import.test_import_integration", + "description": "spectragraph-core.tests.import.test_import_integration", + "peekOfCode": "class TestEntityBasedImportWorkflow:\n \"\"\"Integration tests for entity-based import workflow.\"\"\"\n def test_full_entity_workflow(self):\n \"\"\"Test complete workflow: parse file -> detect entities -> prepare for import.\"\"\"\n # Step 1: User uploads a CSV file (each row = one entity)\n csv_content = b\"\"\"email,name,department\nadmin@example.com,John Admin,IT\nuser@test.org,Jane User,HR\nsecurity@company.com,Bob Security,Security\n\"\"\"", + "detail": "spectragraph-core.tests.import.test_import_integration", + "documentation": {} + }, + { + "label": "TestRealWorldEntityScenarios", + "kind": 6, + "importPath": "spectragraph-core.tests.import.test_import_integration", + "description": "spectragraph-core.tests.import.test_import_integration", + "peekOfCode": "class TestRealWorldEntityScenarios:\n \"\"\"Real-world scenario tests with entity-based approach.\"\"\"\n def test_organization_import(self):\n \"\"\"Test importing organizations with metadata.\"\"\"\n csv_content = b\"\"\"name,industry,country,employees\nGoogle,Technology,USA,150000\nMicrosoft,Software,USA,220000\nApple,Technology,USA,164000\n\"\"\"\n result = parse_file(csv_content, \"orgs.csv\")", + "detail": "spectragraph-core.tests.import.test_import_integration", + "documentation": {} + }, + { + "label": "TestTypeDistribution", + "kind": 6, + "importPath": "spectragraph-core.tests.import.test_import_integration", + "description": "spectragraph-core.tests.import.test_import_integration", + "peekOfCode": "class TestTypeDistribution:\n \"\"\"Tests for type distribution in entity-based approach.\"\"\"\n def test_mixed_entity_types(self):\n \"\"\"Test file with multiple entity types.\"\"\"\n txt_content = b\"\"\"example.com\ntest.org\nuser@example.com\nadmin@test.org\n192.168.1.1\n10.0.0.1", + "detail": "spectragraph-core.tests.import.test_import_integration", + "documentation": {} + }, + { + "label": "TestEdgeCases", + "kind": 6, + "importPath": "spectragraph-core.tests.import.test_import_integration", + "description": "spectragraph-core.tests.import.test_import_integration", + "peekOfCode": "class TestEdgeCases:\n \"\"\"Edge case tests for entity-based import.\"\"\"\n def test_single_column_csv(self):\n \"\"\"Test CSV with single column.\"\"\"\n csv_content = b\"\"\"email\nuser@example.com\nadmin@test.org\n\"\"\"\n result = parse_file(csv_content, \"single_column.csv\")\n assert result.total_entities == 2", + "detail": "spectragraph-core.tests.import.test_import_integration", + "documentation": {} + }, + { + "label": "MockTransform", + "kind": 6, + "importPath": "spectragraph-core.tests.vault.test_transform_vault_integration", + "description": "spectragraph-core.tests.vault.test_transform_vault_integration", + "peekOfCode": "class MockTransform(Transform):\n \"\"\"Mock transform for testing.\"\"\"\n InputType = List[str]\n OutputType = List[str]\n @classmethod\n def name(cls) -> str:\n return \"mock_transform\"\n @classmethod\n def category(cls) -> str:\n return \"Test\"", + "detail": "spectragraph-core.tests.vault.test_transform_vault_integration", + "documentation": {} + }, + { + "label": "TestResolveParams", + "kind": 6, + "importPath": "spectragraph-core.tests.vault.test_transform_vault_integration", + "description": "spectragraph-core.tests.vault.test_transform_vault_integration", + "peekOfCode": "class TestResolveParams:\n \"\"\"Tests for resolve_params() method.\"\"\"\n def test_resolve_vault_secret_by_name(self, transform, mock_vault):\n \"\"\"Test resolving a vault secret by parameter name.\"\"\"\n secret_value = \"my-api-key-12345\"\n mock_vault.get_secret.return_value = secret_value\n resolved = transform.resolve_params()\n # Should try to get by name \"TEST_API_KEY\"\n assert mock_vault.get_secret.called\n assert \"TEST_API_KEY\" in resolved", + "detail": "spectragraph-core.tests.vault.test_transform_vault_integration", + "documentation": {} + }, + { + "label": "TestGetSecret", + "kind": 6, + "importPath": "spectragraph-core.tests.vault.test_transform_vault_integration", + "description": "spectragraph-core.tests.vault.test_transform_vault_integration", + "peekOfCode": "class TestGetSecret:\n \"\"\"Tests for get_secret() method.\"\"\"\n @pytest.mark.asyncio\n async def test_get_secret_found(self, transform, mock_vault):\n \"\"\"Test get_secret when secret is in resolved params.\"\"\"\n secret_value = \"my-api-key-12345\"\n mock_vault.get_secret.return_value = secret_value\n # Run async_init to resolve params\n await transform.async_init()\n # Get the secret", + "detail": "spectragraph-core.tests.vault.test_transform_vault_integration", + "documentation": {} + }, + { + "label": "TestAsyncInit", + "kind": 6, + "importPath": "spectragraph-core.tests.vault.test_transform_vault_integration", + "description": "spectragraph-core.tests.vault.test_transform_vault_integration", + "peekOfCode": "class TestAsyncInit:\n \"\"\"Tests for async_init() method.\"\"\"\n @pytest.mark.asyncio\n async def test_async_init_calls_resolve_params(self, transform, mock_vault):\n \"\"\"Test that async_init calls resolve_params.\"\"\"\n secret_value = \"my-api-key-12345\"\n mock_vault.get_secret.return_value = secret_value\n # Run async_init\n await transform.async_init()\n # Params should be resolved and stored", + "detail": "spectragraph-core.tests.vault.test_transform_vault_integration", + "documentation": {} + }, + { + "label": "TestTransformExecuteWithVault", + "kind": 6, + "importPath": "spectragraph-core.tests.vault.test_transform_vault_integration", + "description": "spectragraph-core.tests.vault.test_transform_vault_integration", + "peekOfCode": "class TestTransformExecuteWithVault:\n \"\"\"Tests for execute() method with vault integration.\"\"\"\n @pytest.mark.asyncio\n async def test_execute_resolves_vault_secrets(self, transform, mock_vault):\n \"\"\"Test that execute resolves vault secrets before scan.\"\"\"\n secret_value = \"my-api-key-12345\"\n mock_vault.get_secret.return_value = secret_value\n # Execute the transform\n result = await transform.execute([\"test\"])\n # Vault secret should be resolved", + "detail": "spectragraph-core.tests.vault.test_transform_vault_integration", + "documentation": {} + }, + { + "label": "mock_vault", + "kind": 2, + "importPath": "spectragraph-core.tests.vault.test_transform_vault_integration", + "description": "spectragraph-core.tests.vault.test_transform_vault_integration", + "peekOfCode": "def mock_vault():\n \"\"\"Create a mock vault instance.\"\"\"\n vault = Mock()\n vault.get_secret = Mock()\n return vault\n@pytest.fixture\ndef sketch_id():\n \"\"\"Create a test sketch ID.\"\"\"\n return str(uuid.uuid4())\n@pytest.fixture", + "detail": "spectragraph-core.tests.vault.test_transform_vault_integration", + "documentation": {} + }, + { + "label": "sketch_id", + "kind": 2, + "importPath": "spectragraph-core.tests.vault.test_transform_vault_integration", + "description": "spectragraph-core.tests.vault.test_transform_vault_integration", + "peekOfCode": "def sketch_id():\n \"\"\"Create a test sketch ID.\"\"\"\n return str(uuid.uuid4())\n@pytest.fixture\ndef transform(mock_vault, sketch_id):\n \"\"\"Create a MockTransform instance with vault.\"\"\"\n return MockTransform(\n sketch_id=sketch_id,\n scan_id=\"scan_123\",\n vault=mock_vault,", + "detail": "spectragraph-core.tests.vault.test_transform_vault_integration", + "documentation": {} + }, + { + "label": "transform", + "kind": 2, + "importPath": "spectragraph-core.tests.vault.test_transform_vault_integration", + "description": "spectragraph-core.tests.vault.test_transform_vault_integration", + "peekOfCode": "def transform(mock_vault, sketch_id):\n \"\"\"Create a MockTransform instance with vault.\"\"\"\n return MockTransform(\n sketch_id=sketch_id,\n scan_id=\"scan_123\",\n vault=mock_vault,\n params={},\n )\nclass TestResolveParams:\n \"\"\"Tests for resolve_params() method.\"\"\"", + "detail": "spectragraph-core.tests.vault.test_transform_vault_integration", + "documentation": {} + }, + { + "label": "TestVaultInitialization", + "kind": 6, + "importPath": "spectragraph-core.tests.vault.test_vault", + "description": "spectragraph-core.tests.vault.test_vault", + "peekOfCode": "class TestVaultInitialization:\n \"\"\"Tests for Vault initialization.\"\"\"\n def test_vault_requires_owner_id(self, mock_db):\n \"\"\"Test that Vault requires an owner_id.\"\"\"\n with pytest.raises(ValueError, match=\"owner_id is required\"):\n Vault(db=mock_db, owner_id=None)\n def test_vault_initialization_success(self, mock_db, owner_id):\n \"\"\"Test successful Vault initialization.\"\"\"\n vault = Vault(db=mock_db, owner_id=owner_id)\n assert vault.db == mock_db", + "detail": "spectragraph-core.tests.vault.test_vault", + "documentation": {} + }, + { + "label": "TestVaultSetSecret", + "kind": 6, + "importPath": "spectragraph-core.tests.vault.test_vault", + "description": "spectragraph-core.tests.vault.test_vault", + "peekOfCode": "class TestVaultSetSecret:\n \"\"\"Tests for Vault.set_secret() method.\"\"\"\n def test_set_secret_creates_key(self, vault, mock_db):\n \"\"\"Test that set_secret creates a new Key in the database.\"\"\"\n vault_ref = \"TEST_API_KEY\"\n plain_key = \"my-secret-api-key-12345\"\n vault.set_secret(vault_ref, plain_key)\n # Verify that db.add, db.commit, and db.refresh were called\n assert mock_db.add.called\n assert mock_db.commit.called", + "detail": "spectragraph-core.tests.vault.test_vault", + "documentation": {} + }, + { + "label": "TestVaultGetSecret", + "kind": 6, + "importPath": "spectragraph-core.tests.vault.test_vault", + "description": "spectragraph-core.tests.vault.test_vault", + "peekOfCode": "class TestVaultGetSecret:\n \"\"\"Tests for Vault.get_secret() method.\"\"\"\n def test_get_secret_by_name_found(self, vault, mock_db, owner_id):\n \"\"\"Test getting a secret by name when it exists.\"\"\"\n vault_ref = \"TEST_API_KEY\"\n plain_key = \"my-secret-api-key-12345\"\n # Set a secret first to get encrypted data\n real_vault = Vault(db=MagicMock(), owner_id=owner_id)\n encrypted_data = real_vault._encrypt_key(plain_key)\n # Create a mock Key object", + "detail": "spectragraph-core.tests.vault.test_vault", + "documentation": {} + }, + { + "label": "TestVaultEncryptionDecryption", + "kind": 6, + "importPath": "spectragraph-core.tests.vault.test_vault", + "description": "spectragraph-core.tests.vault.test_vault", + "peekOfCode": "class TestVaultEncryptionDecryption:\n \"\"\"Tests for encryption and decryption methods.\"\"\"\n def test_encrypt_decrypt_roundtrip(self, vault):\n \"\"\"Test that encryption and decryption work correctly.\"\"\"\n plaintext = \"my-secret-api-key-12345\"\n # Encrypt\n encrypted_data = vault._encrypt_key(plaintext)\n assert \"ciphertext\" in encrypted_data\n assert \"iv\" in encrypted_data\n assert \"salt\" in encrypted_data", + "detail": "spectragraph-core.tests.vault.test_vault", + "documentation": {} + }, + { + "label": "mock_db", + "kind": 2, + "importPath": "spectragraph-core.tests.vault.test_vault", + "description": "spectragraph-core.tests.vault.test_vault", + "peekOfCode": "def mock_db():\n \"\"\"Create a mock database session.\"\"\"\n return Mock()\n@pytest.fixture\ndef owner_id():\n \"\"\"Create a test owner ID.\"\"\"\n return uuid.uuid4()\n@pytest.fixture\ndef vault(mock_db, owner_id):\n \"\"\"Create a Vault instance with mocked database.\"\"\"", + "detail": "spectragraph-core.tests.vault.test_vault", + "documentation": {} + }, + { + "label": "owner_id", + "kind": 2, + "importPath": "spectragraph-core.tests.vault.test_vault", + "description": "spectragraph-core.tests.vault.test_vault", + "peekOfCode": "def owner_id():\n \"\"\"Create a test owner ID.\"\"\"\n return uuid.uuid4()\n@pytest.fixture\ndef vault(mock_db, owner_id):\n \"\"\"Create a Vault instance with mocked database.\"\"\"\n return Vault(db=mock_db, owner_id=owner_id)\n@pytest.fixture(autouse=True)\ndef mock_master_key(monkeypatch):\n \"\"\"Mock the master key environment variable.\"\"\"", + "detail": "spectragraph-core.tests.vault.test_vault", + "documentation": {} + }, + { + "label": "vault", + "kind": 2, + "importPath": "spectragraph-core.tests.vault.test_vault", + "description": "spectragraph-core.tests.vault.test_vault", + "peekOfCode": "def vault(mock_db, owner_id):\n \"\"\"Create a Vault instance with mocked database.\"\"\"\n return Vault(db=mock_db, owner_id=owner_id)\n@pytest.fixture(autouse=True)\ndef mock_master_key(monkeypatch):\n \"\"\"Mock the master key environment variable.\"\"\"\n # Use a base64-encoded 32-byte key\n test_key = \"base64:qnHTmwYb+uoygIw9MsRMY22vS5YPchY+QOi/E79GAvM=\"\n monkeypatch.setenv(\"MASTER_VAULT_KEY_V1\", test_key)\nclass TestVaultInitialization:", + "detail": "spectragraph-core.tests.vault.test_vault", + "documentation": {} + }, + { + "label": "mock_master_key", + "kind": 2, + "importPath": "spectragraph-core.tests.vault.test_vault", + "description": "spectragraph-core.tests.vault.test_vault", + "peekOfCode": "def mock_master_key(monkeypatch):\n \"\"\"Mock the master key environment variable.\"\"\"\n # Use a base64-encoded 32-byte key\n test_key = \"base64:qnHTmwYb+uoygIw9MsRMY22vS5YPchY+QOi/E79GAvM=\"\n monkeypatch.setenv(\"MASTER_VAULT_KEY_V1\", test_key)\nclass TestVaultInitialization:\n \"\"\"Tests for Vault initialization.\"\"\"\n def test_vault_requires_owner_id(self, mock_db):\n \"\"\"Test that Vault requires an owner_id.\"\"\"\n with pytest.raises(ValueError, match=\"owner_id is required\"):", + "detail": "spectragraph-core.tests.vault.test_vault", + "documentation": {} + }, + { + "label": "setup_test_environment", + "kind": 2, + "importPath": "spectragraph-core.tests.conftest", + "description": "spectragraph-core.tests.conftest", + "peekOfCode": "def setup_test_environment(monkeypatch):\n \"\"\"Set up test environment variables.\"\"\"\n # Set a test master key for vault tests\n test_key = \"base64:qnHTmwYb+uoygIw9MsRMY22vS5YPchY+QOi/E79GAvM=\"\n monkeypatch.setenv(\"MASTER_VAULT_KEY_V1\", test_key)\n@pytest.fixture(autouse=True)\ndef mock_logger(monkeypatch):\n \"\"\"Mock the Logger to avoid database calls during tests.\"\"\"\n from unittest.mock import MagicMock\n mock = MagicMock()", + "detail": "spectragraph-core.tests.conftest", + "documentation": {} + }, + { + "label": "mock_logger", + "kind": 2, + "importPath": "spectragraph-core.tests.conftest", + "description": "spectragraph-core.tests.conftest", + "peekOfCode": "def mock_logger(monkeypatch):\n \"\"\"Mock the Logger to avoid database calls during tests.\"\"\"\n from unittest.mock import MagicMock\n mock = MagicMock()\n monkeypatch.setattr(\"spectragraph_core.core.logger.Logger\", mock)\n return mock", + "detail": "spectragraph-core.tests.conftest", + "documentation": {} + }, + { + "label": "mock_engine", + "kind": 2, + "importPath": "spectragraph-core.tests.test_postgre_db", + "description": "spectragraph-core.tests.test_postgre_db", + "peekOfCode": "def mock_engine(monkeypatch):\n mock = MagicMock()\n monkeypatch.setattr(\"spectragraph_core.core.postgre_db.engine\", mock)\n return mock\n@pytest.fixture\ndef mock_logger(monkeypatch):\n mock = MagicMock()\n monkeypatch.setattr(\"spectragraph_core.core.postgre_db.logger\", mock)\n return mock\ndef test_ensure_db_connection_success(mock_engine, mock_logger):", + "detail": "spectragraph-core.tests.test_postgre_db", + "documentation": {} + }, + { + "label": "mock_logger", + "kind": 2, + "importPath": "spectragraph-core.tests.test_postgre_db", + "description": "spectragraph-core.tests.test_postgre_db", + "peekOfCode": "def mock_logger(monkeypatch):\n mock = MagicMock()\n monkeypatch.setattr(\"spectragraph_core.core.postgre_db.logger\", mock)\n return mock\ndef test_ensure_db_connection_success(mock_engine, mock_logger):\n \"\"\"Test successful connection.\"\"\"\n ensure_db_connection(max_retries=1)\n mock_engine.connect.assert_called_once()\n mock_logger.info.assert_called()\ndef test_ensure_db_connection_retry(mock_engine, mock_logger):", + "detail": "spectragraph-core.tests.test_postgre_db", + "documentation": {} + }, + { + "label": "test_ensure_db_connection_success", + "kind": 2, + "importPath": "spectragraph-core.tests.test_postgre_db", + "description": "spectragraph-core.tests.test_postgre_db", + "peekOfCode": "def test_ensure_db_connection_success(mock_engine, mock_logger):\n \"\"\"Test successful connection.\"\"\"\n ensure_db_connection(max_retries=1)\n mock_engine.connect.assert_called_once()\n mock_logger.info.assert_called()\ndef test_ensure_db_connection_retry(mock_engine, mock_logger):\n \"\"\"Test retry logic: fail once, then succeed.\"\"\"\n # Simulate one failure then success\n mock_engine.connect.side_effect = [OperationalError(\"Select 1\", None, Exception(\"Fail\")), MagicMock()]\n # Needs at least 2 retries to succeed on second attempt", + "detail": "spectragraph-core.tests.test_postgre_db", + "documentation": {} + }, + { + "label": "test_ensure_db_connection_retry", + "kind": 2, + "importPath": "spectragraph-core.tests.test_postgre_db", + "description": "spectragraph-core.tests.test_postgre_db", + "peekOfCode": "def test_ensure_db_connection_retry(mock_engine, mock_logger):\n \"\"\"Test retry logic: fail once, then succeed.\"\"\"\n # Simulate one failure then success\n mock_engine.connect.side_effect = [OperationalError(\"Select 1\", None, Exception(\"Fail\")), MagicMock()]\n # Needs at least 2 retries to succeed on second attempt\n ensure_db_connection(max_retries=3, base_delay=0.01)\n assert mock_engine.connect.call_count == 2\n mock_logger.warning.assert_called() # Should indicate retry\n mock_logger.info.assert_called() # Finally succeed\ndef test_ensure_db_connection_fail_retries(mock_engine, mock_logger):", + "detail": "spectragraph-core.tests.test_postgre_db", + "documentation": {} + }, + { + "label": "test_ensure_db_connection_fail_retries", + "kind": 2, + "importPath": "spectragraph-core.tests.test_postgre_db", + "description": "spectragraph-core.tests.test_postgre_db", + "peekOfCode": "def test_ensure_db_connection_fail_retries(mock_engine, mock_logger):\n \"\"\"Test failure after max retries.\"\"\"\n mock_engine.connect.side_effect = OperationalError(\"Select 1\", None, Exception(\"Fail\"))\n with pytest.raises(DatabaseUnavailableError):\n ensure_db_connection(max_retries=2, base_delay=0.01)\n assert mock_engine.connect.call_count == 2\n mock_logger.error.assert_called()\ndef test_diagnostics_generic_failure(mock_engine, mock_logger):\n \"\"\"Test actionable advice is logged on failure.\"\"\"\n error = OperationalError(\"select 1\", None, Exception(\"connection refused\"))", + "detail": "spectragraph-core.tests.test_postgre_db", + "documentation": {} + }, + { + "label": "test_diagnostics_generic_failure", + "kind": 2, + "importPath": "spectragraph-core.tests.test_postgre_db", + "description": "spectragraph-core.tests.test_postgre_db", + "peekOfCode": "def test_diagnostics_generic_failure(mock_engine, mock_logger):\n \"\"\"Test actionable advice is logged on failure.\"\"\"\n error = OperationalError(\"select 1\", None, Exception(\"connection refused\"))\n mock_engine.connect.side_effect = error\n with pytest.raises(DatabaseUnavailableError):\n ensure_db_connection(max_retries=1, base_delay=0.01)\n # Check if we logged the helpful message\n found = False\n for call_args in mock_logger.error.call_args_list:\n args, _ = call_args", + "detail": "spectragraph-core.tests.test_postgre_db", + "documentation": {} + }, + { + "label": "AsnToCidrsTransform", + "kind": 6, + "importPath": "spectragraph-transforms.src.spectragraph_transforms.asn.to_cidrs", + "description": "spectragraph-transforms.src.spectragraph_transforms.asn.to_cidrs", + "peekOfCode": "class AsnToCidrsTransform(Transform):\n \"\"\"[ASNMAP] Takes an ASN and returns its corresponding CIDRs.\"\"\"\n # Define types as class attributes - base class handles schema generation automatically\n InputType = List[ASN]\n OutputType = List[CIDR]\n def __init__(\n self,\n sketch_id: Optional[str] = None,\n scan_id: Optional[str] = None,\n neo4j_conn: Optional[Neo4jConnection] = None,", + "detail": "spectragraph-transforms.src.spectragraph_transforms.asn.to_cidrs", + "documentation": {} + }, + { + "label": "InputType", + "kind": 5, + "importPath": "spectragraph-transforms.src.spectragraph_transforms.asn.to_cidrs", + "description": "spectragraph-transforms.src.spectragraph_transforms.asn.to_cidrs", + "peekOfCode": "InputType = AsnToCidrsTransform.InputType\nOutputType = AsnToCidrsTransform.OutputType", + "detail": "spectragraph-transforms.src.spectragraph_transforms.asn.to_cidrs", + "documentation": {} + }, + { + "label": "OutputType", + "kind": 5, + "importPath": "spectragraph-transforms.src.spectragraph_transforms.asn.to_cidrs", + "description": "spectragraph-transforms.src.spectragraph_transforms.asn.to_cidrs", + "peekOfCode": "OutputType = AsnToCidrsTransform.OutputType", + "detail": "spectragraph-transforms.src.spectragraph_transforms.asn.to_cidrs", + "documentation": {} + }, + { + "label": "CidrToIpsTransform", + "kind": 6, + "importPath": "spectragraph-transforms.src.spectragraph_transforms.cidr.to_ips", + "description": "spectragraph-transforms.src.spectragraph_transforms.cidr.to_ips", + "peekOfCode": "class CidrToIpsTransform(Transform):\n \"\"\"[MAPCIDR] Takes a CIDR and returns its corresponding IP addresses.\"\"\"\n # Define types as class attributes - base class handles schema generation automatically\n InputType = List[CIDR]\n OutputType = List[Ip]\n def __init__(\n self,\n sketch_id: Optional[str] = None,\n scan_id: Optional[str] = None,\n neo4j_conn: Optional[Neo4jConnection] = None,", + "detail": "spectragraph-transforms.src.spectragraph_transforms.cidr.to_ips", + "documentation": {} + }, + { + "label": "InputType", + "kind": 5, + "importPath": "spectragraph-transforms.src.spectragraph_transforms.cidr.to_ips", + "description": "spectragraph-transforms.src.spectragraph_transforms.cidr.to_ips", + "peekOfCode": "InputType = CidrToIpsTransform.InputType\nOutputType = CidrToIpsTransform.OutputType", + "detail": "spectragraph-transforms.src.spectragraph_transforms.cidr.to_ips", + "documentation": {} + }, + { + "label": "OutputType", + "kind": 5, + "importPath": "spectragraph-transforms.src.spectragraph_transforms.cidr.to_ips", + "description": "spectragraph-transforms.src.spectragraph_transforms.cidr.to_ips", + "peekOfCode": "OutputType = CidrToIpsTransform.OutputType", + "detail": "spectragraph-transforms.src.spectragraph_transforms.cidr.to_ips", + "documentation": {} + }, + { + "label": "CryptoWalletAddressToNFTs", + "kind": 6, + "importPath": "spectragraph-transforms.src.spectragraph_transforms.crypto.to_nfts", + "description": "spectragraph-transforms.src.spectragraph_transforms.crypto.to_nfts", + "peekOfCode": "class CryptoWalletAddressToNFTs(Transform):\n \"\"\"[ETHERSCAN] Resolve NFTs for a wallet address (ETH).\"\"\"\n # Define types as class attributes - base class handles schema generation automatically\n InputType = List[CryptoWallet]\n OutputType = List[CryptoNFT]\n def __init__(\n self,\n sketch_id: Optional[str] = None,\n scan_id: Optional[str] = None,\n neo4j_conn: Optional[Neo4jConnection] = None,", + "detail": "spectragraph-transforms.src.spectragraph_transforms.crypto.to_nfts", + "documentation": {} + }, + { + "label": "InputType", + "kind": 5, + "importPath": "spectragraph-transforms.src.spectragraph_transforms.crypto.to_nfts", + "description": "spectragraph-transforms.src.spectragraph_transforms.crypto.to_nfts", + "peekOfCode": "InputType = CryptoWalletAddressToNFTs.InputType\nOutputType = CryptoWalletAddressToNFTs.OutputType", + "detail": "spectragraph-transforms.src.spectragraph_transforms.crypto.to_nfts", + "documentation": {} + }, + { + "label": "OutputType", + "kind": 5, + "importPath": "spectragraph-transforms.src.spectragraph_transforms.crypto.to_nfts", + "description": "spectragraph-transforms.src.spectragraph_transforms.crypto.to_nfts", + "peekOfCode": "OutputType = CryptoWalletAddressToNFTs.OutputType", + "detail": "spectragraph-transforms.src.spectragraph_transforms.crypto.to_nfts", + "documentation": {} + }, + { + "label": "CryptoWalletAddressToTransactions", + "kind": 6, + "importPath": "spectragraph-transforms.src.spectragraph_transforms.crypto.to_transactions", + "description": "spectragraph-transforms.src.spectragraph_transforms.crypto.to_transactions", + "peekOfCode": "class CryptoWalletAddressToTransactions(Transform):\n \"\"\"[ETHERSCAN] Resolve transactions for a wallet address (ETH).\"\"\"\n # Define types as class attributes - base class handles schema generation automatically\n InputType = List[CryptoWallet]\n OutputType = List[CryptoWalletTransaction]\n def __init__(\n self,\n sketch_id: Optional[str] = None,\n scan_id: Optional[str] = None,\n neo4j_conn: Optional[Neo4jConnection] = None,", + "detail": "spectragraph-transforms.src.spectragraph_transforms.crypto.to_transactions", + "documentation": {} + }, + { + "label": "wei_to_eth", + "kind": 2, + "importPath": "spectragraph-transforms.src.spectragraph_transforms.crypto.to_transactions", + "description": "spectragraph-transforms.src.spectragraph_transforms.crypto.to_transactions", + "peekOfCode": "def wei_to_eth(wei_str):\n return int(wei_str) / 10**18\nclass CryptoWalletAddressToTransactions(Transform):\n \"\"\"[ETHERSCAN] Resolve transactions for a wallet address (ETH).\"\"\"\n # Define types as class attributes - base class handles schema generation automatically\n InputType = List[CryptoWallet]\n OutputType = List[CryptoWalletTransaction]\n def __init__(\n self,\n sketch_id: Optional[str] = None,", + "detail": "spectragraph-transforms.src.spectragraph_transforms.crypto.to_transactions", + "documentation": {} + }, + { + "label": "InputType", + "kind": 5, + "importPath": "spectragraph-transforms.src.spectragraph_transforms.crypto.to_transactions", + "description": "spectragraph-transforms.src.spectragraph_transforms.crypto.to_transactions", + "peekOfCode": "InputType = CryptoWalletAddressToTransactions.InputType\nOutputType = CryptoWalletAddressToTransactions.OutputType", + "detail": "spectragraph-transforms.src.spectragraph_transforms.crypto.to_transactions", + "documentation": {} + }, + { + "label": "OutputType", + "kind": 5, + "importPath": "spectragraph-transforms.src.spectragraph_transforms.crypto.to_transactions", + "description": "spectragraph-transforms.src.spectragraph_transforms.crypto.to_transactions", + "peekOfCode": "OutputType = CryptoWalletAddressToTransactions.OutputType", + "detail": "spectragraph-transforms.src.spectragraph_transforms.crypto.to_transactions", + "documentation": {} + }, + { + "label": "DomainToAsnTransform", + "kind": 6, + "importPath": "spectragraph-transforms.src.spectragraph_transforms.domain.to_asn", + "description": "spectragraph-transforms.src.spectragraph_transforms.domain.to_asn", + "peekOfCode": "class DomainToAsnTransform(Transform):\n \"\"\"[ASNMAP] Takes a domain and returns its corresponding ASN.\"\"\"\n # Define types as class attributes - base class handles schema generation automatically\n InputType = List[Domain]\n OutputType = List[ASN]\n def __init__(\n self,\n sketch_id: Optional[str] = None,\n scan_id: Optional[str] = None,\n neo4j_conn: Optional[Neo4jConnection] = None,", + "detail": "spectragraph-transforms.src.spectragraph_transforms.domain.to_asn", + "documentation": {} + }, + { + "label": "InputType", + "kind": 5, + "importPath": "spectragraph-transforms.src.spectragraph_transforms.domain.to_asn", + "description": "spectragraph-transforms.src.spectragraph_transforms.domain.to_asn", + "peekOfCode": "InputType = DomainToAsnTransform.InputType\nOutputType = DomainToAsnTransform.OutputType", + "detail": "spectragraph-transforms.src.spectragraph_transforms.domain.to_asn", + "documentation": {} + }, + { + "label": "OutputType", + "kind": 5, + "importPath": "spectragraph-transforms.src.spectragraph_transforms.domain.to_asn", + "description": "spectragraph-transforms.src.spectragraph_transforms.domain.to_asn", + "peekOfCode": "OutputType = DomainToAsnTransform.OutputType", + "detail": "spectragraph-transforms.src.spectragraph_transforms.domain.to_asn", + "documentation": {} + }, + { + "label": "DomainToHistoryTransform", + "kind": 6, + "importPath": "spectragraph-transforms.src.spectragraph_transforms.domain.to_history", + "description": "spectragraph-transforms.src.spectragraph_transforms.domain.to_history", + "peekOfCode": "class DomainToHistoryTransform(Transform):\n \"\"\"[WHOXY] Takes a domain and returns history infos about it (history, organization, owners, emails, etc.).\"\"\"\n # Define types as class attributes - base class handles schema generation automatically\n InputType = List[Domain]\n OutputType = List[Domain]\n def __init__(\n self,\n sketch_id: Optional[str] = None,\n scan_id: Optional[str] = None,\n neo4j_conn: Optional[Neo4jConnection] = None,", + "detail": "spectragraph-transforms.src.spectragraph_transforms.domain.to_history", + "documentation": {} + }, + { + "label": "InputType", + "kind": 5, + "importPath": "spectragraph-transforms.src.spectragraph_transforms.domain.to_history", + "description": "spectragraph-transforms.src.spectragraph_transforms.domain.to_history", + "peekOfCode": "InputType = DomainToHistoryTransform.InputType\nOutputType = DomainToHistoryTransform.OutputType", + "detail": "spectragraph-transforms.src.spectragraph_transforms.domain.to_history", + "documentation": {} + }, + { + "label": "OutputType", + "kind": 5, + "importPath": "spectragraph-transforms.src.spectragraph_transforms.domain.to_history", + "description": "spectragraph-transforms.src.spectragraph_transforms.domain.to_history", + "peekOfCode": "OutputType = DomainToHistoryTransform.OutputType", + "detail": "spectragraph-transforms.src.spectragraph_transforms.domain.to_history", + "documentation": {} + }, + { + "label": "ResolveTransform", + "kind": 6, + "importPath": "spectragraph-transforms.src.spectragraph_transforms.domain.to_ip", + "description": "spectragraph-transforms.src.spectragraph_transforms.domain.to_ip", + "peekOfCode": "class ResolveTransform(Transform):\n \"\"\"Resolve domain names to IP addresses.\"\"\"\n # Define the input and output types as class attributes\n InputType = List[Domain]\n OutputType = List[Ip]\n @classmethod\n def name(cls) -> str:\n return \"domain_to_ip\"\n @classmethod\n def category(cls) -> str:", + "detail": "spectragraph-transforms.src.spectragraph_transforms.domain.to_ip", + "documentation": {} + }, + { + "label": "InputType", + "kind": 5, + "importPath": "spectragraph-transforms.src.spectragraph_transforms.domain.to_ip", + "description": "spectragraph-transforms.src.spectragraph_transforms.domain.to_ip", + "peekOfCode": "InputType = ResolveTransform.InputType\nOutputType = ResolveTransform.OutputType", + "detail": "spectragraph-transforms.src.spectragraph_transforms.domain.to_ip", + "documentation": {} + }, + { + "label": "OutputType", + "kind": 5, + "importPath": "spectragraph-transforms.src.spectragraph_transforms.domain.to_ip", + "description": "spectragraph-transforms.src.spectragraph_transforms.domain.to_ip", + "peekOfCode": "OutputType = ResolveTransform.OutputType", + "detail": "spectragraph-transforms.src.spectragraph_transforms.domain.to_ip", + "documentation": {} + }, + { + "label": "DomainToRootDomain", + "kind": 6, + "importPath": "spectragraph-transforms.src.spectragraph_transforms.domain.to_root_domain", + "description": "spectragraph-transforms.src.spectragraph_transforms.domain.to_root_domain", + "peekOfCode": "class DomainToRootDomain(Transform):\n \"\"\"Subdomain to root domain.\"\"\"\n InputType = List[Domain]\n OutputType = List[Domain]\n def __init__(self, *args, **kwargs):\n super().__init__(*args, **kwargs)\n # Store mapping between original domains and their root domains\n self.domain_root_mapping: List[tuple[Domain, Domain]] = []\n @classmethod\n def name(cls) -> str:", + "detail": "spectragraph-transforms.src.spectragraph_transforms.domain.to_root_domain", + "documentation": {} + }, + { + "label": "InputType", + "kind": 5, + "importPath": "spectragraph-transforms.src.spectragraph_transforms.domain.to_root_domain", + "description": "spectragraph-transforms.src.spectragraph_transforms.domain.to_root_domain", + "peekOfCode": "InputType = DomainToRootDomain.InputType\nOutputType = DomainToRootDomain.OutputType", + "detail": "spectragraph-transforms.src.spectragraph_transforms.domain.to_root_domain", + "documentation": {} + }, + { + "label": "OutputType", + "kind": 5, + "importPath": "spectragraph-transforms.src.spectragraph_transforms.domain.to_root_domain", + "description": "spectragraph-transforms.src.spectragraph_transforms.domain.to_root_domain", + "peekOfCode": "OutputType = DomainToRootDomain.OutputType", + "detail": "spectragraph-transforms.src.spectragraph_transforms.domain.to_root_domain", + "documentation": {} + }, + { + "label": "SubdomainTransform", + "kind": 6, + "importPath": "spectragraph-transforms.src.spectragraph_transforms.domain.to_subdomains", + "description": "spectragraph-transforms.src.spectragraph_transforms.domain.to_subdomains", + "peekOfCode": "class SubdomainTransform(Transform):\n \"\"\"Transform to find subdomains associated with a domain.\"\"\"\n # Define types as class attributes - base class handles schema generation automatically\n InputType = List[Domain | str]\n OutputType = List[Domain]\n @classmethod\n def name(cls) -> str:\n return \"domain_to_subdomains\"\n @classmethod\n def category(cls) -> str:", + "detail": "spectragraph-transforms.src.spectragraph_transforms.domain.to_subdomains", + "documentation": {} + }, + { + "label": "InputType", + "kind": 5, + "importPath": "spectragraph-transforms.src.spectragraph_transforms.domain.to_subdomains", + "description": "spectragraph-transforms.src.spectragraph_transforms.domain.to_subdomains", + "peekOfCode": "InputType = SubdomainTransform.InputType\nOutputType = SubdomainTransform.OutputType", + "detail": "spectragraph-transforms.src.spectragraph_transforms.domain.to_subdomains", + "documentation": {} + }, + { + "label": "OutputType", + "kind": 5, + "importPath": "spectragraph-transforms.src.spectragraph_transforms.domain.to_subdomains", + "description": "spectragraph-transforms.src.spectragraph_transforms.domain.to_subdomains", + "peekOfCode": "OutputType = SubdomainTransform.OutputType", + "detail": "spectragraph-transforms.src.spectragraph_transforms.domain.to_subdomains", + "documentation": {} + }, + { + "label": "DomainToWebsiteTransform", + "kind": 6, + "importPath": "spectragraph-transforms.src.spectragraph_transforms.domain.to_website", + "description": "spectragraph-transforms.src.spectragraph_transforms.domain.to_website", + "peekOfCode": "class DomainToWebsiteTransform(Transform):\n \"\"\"From domain to website.\"\"\"\n # Define types as class attributes - base class handles schema generation automatically\n InputType = List[Domain]\n OutputType = List[Website]\n @classmethod\n def name(cls) -> str:\n return \"domain_to_website\"\n @classmethod\n def category(cls) -> str:", + "detail": "spectragraph-transforms.src.spectragraph_transforms.domain.to_website", + "documentation": {} + }, + { + "label": "InputType", + "kind": 5, + "importPath": "spectragraph-transforms.src.spectragraph_transforms.domain.to_website", + "description": "spectragraph-transforms.src.spectragraph_transforms.domain.to_website", + "peekOfCode": "InputType = DomainToWebsiteTransform.InputType\nOutputType = DomainToWebsiteTransform.OutputType", + "detail": "spectragraph-transforms.src.spectragraph_transforms.domain.to_website", + "documentation": {} + }, + { + "label": "OutputType", + "kind": 5, + "importPath": "spectragraph-transforms.src.spectragraph_transforms.domain.to_website", + "description": "spectragraph-transforms.src.spectragraph_transforms.domain.to_website", + "peekOfCode": "OutputType = DomainToWebsiteTransform.OutputType", + "detail": "spectragraph-transforms.src.spectragraph_transforms.domain.to_website", + "documentation": {} + }, + { + "label": "WhoisTransform", + "kind": 6, + "importPath": "spectragraph-transforms.src.spectragraph_transforms.domain.to_whois", + "description": "spectragraph-transforms.src.spectragraph_transforms.domain.to_whois", + "peekOfCode": "class WhoisTransform(Transform):\n \"\"\"Scan for WHOIS information of a domain.\"\"\"\n # Define types as class attributes - base class handles schema generation automatically\n InputType = List[Domain]\n OutputType = List[Whois]\n @classmethod\n def name(cls) -> str:\n return \"domain_to_whois\"\n @classmethod\n def category(cls) -> str:", + "detail": "spectragraph-transforms.src.spectragraph_transforms.domain.to_whois", + "documentation": {} + }, + { + "label": "InputType", + "kind": 5, + "importPath": "spectragraph-transforms.src.spectragraph_transforms.domain.to_whois", + "description": "spectragraph-transforms.src.spectragraph_transforms.domain.to_whois", + "peekOfCode": "InputType = WhoisTransform.InputType\nOutputType = WhoisTransform.OutputType", + "detail": "spectragraph-transforms.src.spectragraph_transforms.domain.to_whois", + "documentation": {} + }, + { + "label": "OutputType", + "kind": 5, + "importPath": "spectragraph-transforms.src.spectragraph_transforms.domain.to_whois", + "description": "spectragraph-transforms.src.spectragraph_transforms.domain.to_whois", + "peekOfCode": "OutputType = WhoisTransform.OutputType", + "detail": "spectragraph-transforms.src.spectragraph_transforms.domain.to_whois", + "documentation": {} + }, + { + "label": "EmailToDomainsTransform", + "kind": 6, + "importPath": "spectragraph-transforms.src.spectragraph_transforms.email.to_domains", + "description": "spectragraph-transforms.src.spectragraph_transforms.email.to_domains", + "peekOfCode": "class EmailToDomainsTransform(Transform):\n \"\"\"[WHOXY] Takes an email and returns the domains it registered.\"\"\"\n # Define types as class attributes - base class handles schema generation automatically\n InputType = List[Email]\n OutputType = List[Domain]\n def __init__(\n self,\n sketch_id: Optional[str] = None,\n scan_id: Optional[str] = None,\n neo4j_conn: Optional[Neo4jConnection] = None,", + "detail": "spectragraph-transforms.src.spectragraph_transforms.email.to_domains", + "documentation": {} + }, + { + "label": "WHOXY_API_KEY", + "kind": 5, + "importPath": "spectragraph-transforms.src.spectragraph_transforms.email.to_domains", + "description": "spectragraph-transforms.src.spectragraph_transforms.email.to_domains", + "peekOfCode": "WHOXY_API_KEY = os.getenv(\"WHOXY_API_KEY\")\nclass EmailToDomainsTransform(Transform):\n \"\"\"[WHOXY] Takes an email and returns the domains it registered.\"\"\"\n # Define types as class attributes - base class handles schema generation automatically\n InputType = List[Email]\n OutputType = List[Domain]\n def __init__(\n self,\n sketch_id: Optional[str] = None,\n scan_id: Optional[str] = None,", + "detail": "spectragraph-transforms.src.spectragraph_transforms.email.to_domains", + "documentation": {} + }, + { + "label": "InputType", + "kind": 5, + "importPath": "spectragraph-transforms.src.spectragraph_transforms.email.to_domains", + "description": "spectragraph-transforms.src.spectragraph_transforms.email.to_domains", + "peekOfCode": "InputType = EmailToDomainsTransform.InputType\nOutputType = EmailToDomainsTransform.OutputType", + "detail": "spectragraph-transforms.src.spectragraph_transforms.email.to_domains", + "documentation": {} + }, + { + "label": "OutputType", + "kind": 5, + "importPath": "spectragraph-transforms.src.spectragraph_transforms.email.to_domains", + "description": "spectragraph-transforms.src.spectragraph_transforms.email.to_domains", + "peekOfCode": "OutputType = EmailToDomainsTransform.OutputType", + "detail": "spectragraph-transforms.src.spectragraph_transforms.email.to_domains", + "documentation": {} + }, + { + "label": "EmailToGravatarTransform", + "kind": 6, + "importPath": "spectragraph-transforms.src.spectragraph_transforms.email.to_gravatar", + "description": "spectragraph-transforms.src.spectragraph_transforms.email.to_gravatar", + "peekOfCode": "class EmailToGravatarTransform(Transform):\n \"\"\"From md5 hash of email to gravatar.\"\"\"\n InputType = List[Email]\n OutputType = List[Gravatar]\n @classmethod\n def name(cls) -> str:\n return \"email_to_gravatar\"\n @classmethod\n def category(cls) -> str:\n return \"Email\"", + "detail": "spectragraph-transforms.src.spectragraph_transforms.email.to_gravatar", + "documentation": {} + }, + { + "label": "InputType", + "kind": 5, + "importPath": "spectragraph-transforms.src.spectragraph_transforms.email.to_gravatar", + "description": "spectragraph-transforms.src.spectragraph_transforms.email.to_gravatar", + "peekOfCode": "InputType = EmailToGravatarTransform.InputType\nOutputType = EmailToGravatarTransform.OutputType", + "detail": "spectragraph-transforms.src.spectragraph_transforms.email.to_gravatar", + "documentation": {} + }, + { + "label": "OutputType", + "kind": 5, + "importPath": "spectragraph-transforms.src.spectragraph_transforms.email.to_gravatar", + "description": "spectragraph-transforms.src.spectragraph_transforms.email.to_gravatar", + "peekOfCode": "OutputType = EmailToGravatarTransform.OutputType", + "detail": "spectragraph-transforms.src.spectragraph_transforms.email.to_gravatar", + "documentation": {} + }, + { + "label": "EmailToBreachesTransform", + "kind": 6, + "importPath": "spectragraph-transforms.src.spectragraph_transforms.email.to_leaks", + "description": "spectragraph-transforms.src.spectragraph_transforms.email.to_leaks", + "peekOfCode": "class EmailToBreachesTransform(Transform):\n \"\"\"[HIBPWNED] Get the breaches the email might be invovled in.\"\"\"\n InputType = List[Email]\n OutputType = List[tuple] # List of (email, breach) tuples\n def __init__(\n self,\n sketch_id: Optional[str] = None,\n scan_id: Optional[str] = None,\n neo4j_conn: Optional[Neo4jConnection] = None,\n vault=None,", + "detail": "spectragraph-transforms.src.spectragraph_transforms.email.to_leaks", + "documentation": {} + }, + { + "label": "HIBP_API_KEY", + "kind": 5, + "importPath": "spectragraph-transforms.src.spectragraph_transforms.email.to_leaks", + "description": "spectragraph-transforms.src.spectragraph_transforms.email.to_leaks", + "peekOfCode": "HIBP_API_KEY = os.getenv(\"HIBP_API_KEY\")\nclass EmailToBreachesTransform(Transform):\n \"\"\"[HIBPWNED] Get the breaches the email might be invovled in.\"\"\"\n InputType = List[Email]\n OutputType = List[tuple] # List of (email, breach) tuples\n def __init__(\n self,\n sketch_id: Optional[str] = None,\n scan_id: Optional[str] = None,\n neo4j_conn: Optional[Neo4jConnection] = None,", + "detail": "spectragraph-transforms.src.spectragraph_transforms.email.to_leaks", + "documentation": {} + }, + { + "label": "InputType", + "kind": 5, + "importPath": "spectragraph-transforms.src.spectragraph_transforms.email.to_leaks", + "description": "spectragraph-transforms.src.spectragraph_transforms.email.to_leaks", + "peekOfCode": "InputType = EmailToBreachesTransform.InputType\nOutputType = EmailToBreachesTransform.OutputType", + "detail": "spectragraph-transforms.src.spectragraph_transforms.email.to_leaks", + "documentation": {} + }, + { + "label": "OutputType", + "kind": 5, + "importPath": "spectragraph-transforms.src.spectragraph_transforms.email.to_leaks", + "description": "spectragraph-transforms.src.spectragraph_transforms.email.to_leaks", + "peekOfCode": "OutputType = EmailToBreachesTransform.OutputType", + "detail": "spectragraph-transforms.src.spectragraph_transforms.email.to_leaks", + "documentation": {} + }, + { + "label": "IndividualToDomainsTransform", + "kind": 6, + "importPath": "spectragraph-transforms.src.spectragraph_transforms.individual.to_domains", + "description": "spectragraph-transforms.src.spectragraph_transforms.individual.to_domains", + "peekOfCode": "class IndividualToDomainsTransform(Transform):\n \"\"\"[WHOXY] Takes an individual and returns the domains it registered.\"\"\"\n # Define types as class attributes - base class handles schema generation automatically\n InputType = List[Individual]\n OutputType = List[Domain]\n def __init__(\n self,\n sketch_id: Optional[str] = None,\n scan_id: Optional[str] = None,\n neo4j_conn: Optional[Neo4jConnection] = None,", + "detail": "spectragraph-transforms.src.spectragraph_transforms.individual.to_domains", + "documentation": {} + }, + { + "label": "WHOXY_API_KEY", + "kind": 5, + "importPath": "spectragraph-transforms.src.spectragraph_transforms.individual.to_domains", + "description": "spectragraph-transforms.src.spectragraph_transforms.individual.to_domains", + "peekOfCode": "WHOXY_API_KEY = os.getenv(\"WHOXY_API_KEY\")\nclass IndividualToDomainsTransform(Transform):\n \"\"\"[WHOXY] Takes an individual and returns the domains it registered.\"\"\"\n # Define types as class attributes - base class handles schema generation automatically\n InputType = List[Individual]\n OutputType = List[Domain]\n def __init__(\n self,\n sketch_id: Optional[str] = None,\n scan_id: Optional[str] = None,", + "detail": "spectragraph-transforms.src.spectragraph_transforms.individual.to_domains", + "documentation": {} + }, + { + "label": "InputType", + "kind": 5, + "importPath": "spectragraph-transforms.src.spectragraph_transforms.individual.to_domains", + "description": "spectragraph-transforms.src.spectragraph_transforms.individual.to_domains", + "peekOfCode": "InputType = IndividualToDomainsTransform.InputType\nOutputType = IndividualToDomainsTransform.OutputType", + "detail": "spectragraph-transforms.src.spectragraph_transforms.individual.to_domains", + "documentation": {} + }, + { + "label": "OutputType", + "kind": 5, + "importPath": "spectragraph-transforms.src.spectragraph_transforms.individual.to_domains", + "description": "spectragraph-transforms.src.spectragraph_transforms.individual.to_domains", + "peekOfCode": "OutputType = IndividualToDomainsTransform.OutputType", + "detail": "spectragraph-transforms.src.spectragraph_transforms.individual.to_domains", + "documentation": {} + }, + { + "label": "IndividualToOrgTransform", + "kind": 6, + "importPath": "spectragraph-transforms.src.spectragraph_transforms.individual.to_org", + "description": "spectragraph-transforms.src.spectragraph_transforms.individual.to_org", + "peekOfCode": "class IndividualToOrgTransform(Transform):\n \"\"\"[SIRENE] Find organization from a person with data from SIRENE (France only).\"\"\"\n # Define types as class attributes - base class handles schema generation automatically\n InputType = List[Individual]\n OutputType = List[Organization]\n @classmethod\n def name(cls) -> str:\n return \"individual_to_organization\"\n @classmethod\n def category(cls) -> str:", + "detail": "spectragraph-transforms.src.spectragraph_transforms.individual.to_org", + "documentation": {} + }, + { + "label": "InputType", + "kind": 5, + "importPath": "spectragraph-transforms.src.spectragraph_transforms.individual.to_org", + "description": "spectragraph-transforms.src.spectragraph_transforms.individual.to_org", + "peekOfCode": "InputType = IndividualToOrgTransform.InputType\nOutputType = IndividualToOrgTransform.OutputType", + "detail": "spectragraph-transforms.src.spectragraph_transforms.individual.to_org", + "documentation": {} + }, + { + "label": "OutputType", + "kind": 5, + "importPath": "spectragraph-transforms.src.spectragraph_transforms.individual.to_org", + "description": "spectragraph-transforms.src.spectragraph_transforms.individual.to_org", + "peekOfCode": "OutputType = IndividualToOrgTransform.OutputType", + "detail": "spectragraph-transforms.src.spectragraph_transforms.individual.to_org", + "documentation": {} + }, + { + "label": "IpToAsnTransform", + "kind": 6, + "importPath": "spectragraph-transforms.src.spectragraph_transforms.ip.to_asn", + "description": "spectragraph-transforms.src.spectragraph_transforms.ip.to_asn", + "peekOfCode": "class IpToAsnTransform(Transform):\n \"\"\"[ASNMAP] Takes an IP address and returns its corresponding ASN.\"\"\"\n # Define types as class attributes - base class handles schema generation automatically\n InputType = List[Ip]\n OutputType = List[ASN]\n def __init__(\n self,\n sketch_id: Optional[str] = None,\n scan_id: Optional[str] = None,\n neo4j_conn: Optional[Neo4jConnection] = None,", + "detail": "spectragraph-transforms.src.spectragraph_transforms.ip.to_asn", + "documentation": {} + }, + { + "label": "InputType", + "kind": 5, + "importPath": "spectragraph-transforms.src.spectragraph_transforms.ip.to_asn", + "description": "spectragraph-transforms.src.spectragraph_transforms.ip.to_asn", + "peekOfCode": "InputType = IpToAsnTransform.InputType\nOutputType = IpToAsnTransform.OutputType", + "detail": "spectragraph-transforms.src.spectragraph_transforms.ip.to_asn", + "documentation": {} + }, + { + "label": "OutputType", + "kind": 5, + "importPath": "spectragraph-transforms.src.spectragraph_transforms.ip.to_asn", + "description": "spectragraph-transforms.src.spectragraph_transforms.ip.to_asn", + "peekOfCode": "OutputType = IpToAsnTransform.OutputType", + "detail": "spectragraph-transforms.src.spectragraph_transforms.ip.to_asn", + "documentation": {} + }, + { + "label": "ReverseResolveTransform", + "kind": 6, + "importPath": "spectragraph-transforms.src.spectragraph_transforms.ip.to_domain", + "description": "spectragraph-transforms.src.spectragraph_transforms.ip.to_domain", + "peekOfCode": "class ReverseResolveTransform(Transform):\n \"\"\"Resolve IP addresses to domain names using PTR, Certificate Transparency and optional API calls.\"\"\"\n # Define types as class attributes - base class handles schema generation automatically\n InputType = List[Ip]\n OutputType = List[Domain]\n @classmethod\n def name(cls) -> str:\n return \"ip_to_domain\"\n @classmethod\n def category(cls) -> str:", + "detail": "spectragraph-transforms.src.spectragraph_transforms.ip.to_domain", + "documentation": {} + }, + { + "label": "PTR_BLACKLIST", + "kind": 5, + "importPath": "spectragraph-transforms.src.spectragraph_transforms.ip.to_domain", + "description": "spectragraph-transforms.src.spectragraph_transforms.ip.to_domain", + "peekOfCode": "PTR_BLACKLIST = re.compile(r\"^ip\\d+\\.ip-\\d+-\\d+-\\d+-\\d+\\.\")\nclass ReverseResolveTransform(Transform):\n \"\"\"Resolve IP addresses to domain names using PTR, Certificate Transparency and optional API calls.\"\"\"\n # Define types as class attributes - base class handles schema generation automatically\n InputType = List[Ip]\n OutputType = List[Domain]\n @classmethod\n def name(cls) -> str:\n return \"ip_to_domain\"\n @classmethod", + "detail": "spectragraph-transforms.src.spectragraph_transforms.ip.to_domain", + "documentation": {} + }, + { + "label": "InputType", + "kind": 5, + "importPath": "spectragraph-transforms.src.spectragraph_transforms.ip.to_domain", + "description": "spectragraph-transforms.src.spectragraph_transforms.ip.to_domain", + "peekOfCode": "InputType = ReverseResolveTransform.InputType\nOutputType = ReverseResolveTransform.OutputType", + "detail": "spectragraph-transforms.src.spectragraph_transforms.ip.to_domain", + "documentation": {} + }, + { + "label": "OutputType", + "kind": 5, + "importPath": "spectragraph-transforms.src.spectragraph_transforms.ip.to_domain", + "description": "spectragraph-transforms.src.spectragraph_transforms.ip.to_domain", + "peekOfCode": "OutputType = ReverseResolveTransform.OutputType", + "detail": "spectragraph-transforms.src.spectragraph_transforms.ip.to_domain", + "documentation": {} + }, + { + "label": "IpToInfosTransform", + "kind": 6, + "importPath": "spectragraph-transforms.src.spectragraph_transforms.ip.to_infos", + "description": "spectragraph-transforms.src.spectragraph_transforms.ip.to_infos", + "peekOfCode": "class IpToInfosTransform(Transform):\n \"\"\"[ip-api.com] Get information data for IP addresses.\"\"\"\n # Define types as class attributes - base class handles schema generation automatically\n InputType = List[Ip]\n OutputType = List[Ip]\n @classmethod\n def name(cls) -> str:\n return \"ip_to_infos\"\n @classmethod\n def category(cls) -> str:", + "detail": "spectragraph-transforms.src.spectragraph_transforms.ip.to_infos", + "documentation": {} + }, + { + "label": "InputType", + "kind": 5, + "importPath": "spectragraph-transforms.src.spectragraph_transforms.ip.to_infos", + "description": "spectragraph-transforms.src.spectragraph_transforms.ip.to_infos", + "peekOfCode": "InputType = IpToInfosTransform.InputType\nOutputType = IpToInfosTransform.OutputType", + "detail": "spectragraph-transforms.src.spectragraph_transforms.ip.to_infos", + "documentation": {} + }, + { + "label": "OutputType", + "kind": 5, + "importPath": "spectragraph-transforms.src.spectragraph_transforms.ip.to_infos", + "description": "spectragraph-transforms.src.spectragraph_transforms.ip.to_infos", + "peekOfCode": "OutputType = IpToInfosTransform.OutputType", + "detail": "spectragraph-transforms.src.spectragraph_transforms.ip.to_infos", + "documentation": {} + }, + { + "label": "HibpTransform", + "kind": 6, + "importPath": "spectragraph-transforms.src.spectragraph_transforms.leak.to_leaks", + "description": "spectragraph-transforms.src.spectragraph_transforms.leak.to_leaks", + "peekOfCode": "class HibpTransform(Transform):\n \"\"\"Queries HaveIBeenPwned for potential leaks.\"\"\"\n # Define types as class attributes - base class handles schema generation automatically\n InputType = List[str] # Email addresses as strings\n OutputType = List[Dict[str, Any]] # Breach results as dictionaries\n def __init__(\n self,\n sketch_id: Optional[str] = None,\n scan_id: Optional[str] = None,\n neo4j_conn: Optional[Neo4jConnection] = None,", + "detail": "spectragraph-transforms.src.spectragraph_transforms.leak.to_leaks", + "documentation": {} + }, + { + "label": "HIBP_API_KEY", + "kind": 5, + "importPath": "spectragraph-transforms.src.spectragraph_transforms.leak.to_leaks", + "description": "spectragraph-transforms.src.spectragraph_transforms.leak.to_leaks", + "peekOfCode": "HIBP_API_KEY = os.getenv(\"HIBP_API_KEY\")\nclass HibpTransform(Transform):\n \"\"\"Queries HaveIBeenPwned for potential leaks.\"\"\"\n # Define types as class attributes - base class handles schema generation automatically\n InputType = List[str] # Email addresses as strings\n OutputType = List[Dict[str, Any]] # Breach results as dictionaries\n def __init__(\n self,\n sketch_id: Optional[str] = None,\n scan_id: Optional[str] = None,", + "detail": "spectragraph-transforms.src.spectragraph_transforms.leak.to_leaks", + "documentation": {} + }, + { + "label": "InputType", + "kind": 5, + "importPath": "spectragraph-transforms.src.spectragraph_transforms.leak.to_leaks", + "description": "spectragraph-transforms.src.spectragraph_transforms.leak.to_leaks", + "peekOfCode": "InputType = HibpTransform.InputType\nOutputType = HibpTransform.OutputType", + "detail": "spectragraph-transforms.src.spectragraph_transforms.leak.to_leaks", + "documentation": {} + }, + { + "label": "OutputType", + "kind": 5, + "importPath": "spectragraph-transforms.src.spectragraph_transforms.leak.to_leaks", + "description": "spectragraph-transforms.src.spectragraph_transforms.leak.to_leaks", + "peekOfCode": "OutputType = HibpTransform.OutputType", + "detail": "spectragraph-transforms.src.spectragraph_transforms.leak.to_leaks", + "documentation": {} + }, + { + "label": "N8nConnector", + "kind": 6, + "importPath": "spectragraph-transforms.src.spectragraph_transforms.n8n.connector", + "description": "spectragraph-transforms.src.spectragraph_transforms.n8n.connector", + "peekOfCode": "class N8nConnector(Transform):\n \"\"\"\n Connect to your custom n8n workflows to process data through webhooks.\n \"\"\"\n # Define types as class attributes - base class handles schema generation automatically\n InputType = List[Any]\n OutputType = List[Any]\n def __init__(\n self,\n sketch_id: Optional[str] = None,", + "detail": "spectragraph-transforms.src.spectragraph_transforms.n8n.connector", + "documentation": {} + }, + { + "label": "InputType", + "kind": 5, + "importPath": "spectragraph-transforms.src.spectragraph_transforms.n8n.connector", + "description": "spectragraph-transforms.src.spectragraph_transforms.n8n.connector", + "peekOfCode": "InputType = N8nConnector.InputType\nOutputType = N8nConnector.OutputType", + "detail": "spectragraph-transforms.src.spectragraph_transforms.n8n.connector", + "documentation": {} + }, + { + "label": "OutputType", + "kind": 5, + "importPath": "spectragraph-transforms.src.spectragraph_transforms.n8n.connector", + "description": "spectragraph-transforms.src.spectragraph_transforms.n8n.connector", + "peekOfCode": "OutputType = N8nConnector.OutputType", + "detail": "spectragraph-transforms.src.spectragraph_transforms.n8n.connector", + "documentation": {} + }, + { + "label": "OrgToAsnTransform", + "kind": 6, + "importPath": "spectragraph-transforms.src.spectragraph_transforms.organization.to_asn", + "description": "spectragraph-transforms.src.spectragraph_transforms.organization.to_asn", + "peekOfCode": "class OrgToAsnTransform(Transform):\n \"\"\"Takes an organization and returns its corresponding ASN.\"\"\"\n # Define types as class attributes - base class handles schema generation automatically\n InputType = List[Organization]\n OutputType = List[ASN]\n @classmethod\n def name(cls) -> str:\n return \"org_to_asn\"\n @classmethod\n def category(cls) -> str:", + "detail": "spectragraph-transforms.src.spectragraph_transforms.organization.to_asn", + "documentation": {} + }, + { + "label": "InputType", + "kind": 5, + "importPath": "spectragraph-transforms.src.spectragraph_transforms.organization.to_asn", + "description": "spectragraph-transforms.src.spectragraph_transforms.organization.to_asn", + "peekOfCode": "InputType = OrgToAsnTransform.InputType\nOutputType = OrgToAsnTransform.OutputType", + "detail": "spectragraph-transforms.src.spectragraph_transforms.organization.to_asn", + "documentation": {} + }, + { + "label": "OutputType", + "kind": 5, + "importPath": "spectragraph-transforms.src.spectragraph_transforms.organization.to_asn", + "description": "spectragraph-transforms.src.spectragraph_transforms.organization.to_asn", + "peekOfCode": "OutputType = OrgToAsnTransform.OutputType", + "detail": "spectragraph-transforms.src.spectragraph_transforms.organization.to_asn", + "documentation": {} + }, + { + "label": "OrgToDomainsTransform", + "kind": 6, + "importPath": "spectragraph-transforms.src.spectragraph_transforms.organization.to_domains", + "description": "spectragraph-transforms.src.spectragraph_transforms.organization.to_domains", + "peekOfCode": "class OrgToDomainsTransform(Transform):\n \"\"\"[WHOXY] Takes an organization and returns the domains it registered.\"\"\"\n # Define types as class attributes - base class handles schema generation automatically\n InputType = List[Organization]\n OutputType = List[Domain]\n def __init__(\n self,\n sketch_id: Optional[str] = None,\n scan_id: Optional[str] = None,\n neo4j_conn: Optional[Neo4jConnection] = None,", + "detail": "spectragraph-transforms.src.spectragraph_transforms.organization.to_domains", + "documentation": {} + }, + { + "label": "InputType", + "kind": 5, + "importPath": "spectragraph-transforms.src.spectragraph_transforms.organization.to_domains", + "description": "spectragraph-transforms.src.spectragraph_transforms.organization.to_domains", + "peekOfCode": "InputType = OrgToDomainsTransform.InputType\nOutputType = OrgToDomainsTransform.OutputType", + "detail": "spectragraph-transforms.src.spectragraph_transforms.organization.to_domains", + "documentation": {} + }, + { + "label": "OutputType", + "kind": 5, + "importPath": "spectragraph-transforms.src.spectragraph_transforms.organization.to_domains", + "description": "spectragraph-transforms.src.spectragraph_transforms.organization.to_domains", + "peekOfCode": "OutputType = OrgToDomainsTransform.OutputType", + "detail": "spectragraph-transforms.src.spectragraph_transforms.organization.to_domains", + "documentation": {} + }, + { + "label": "OrgToInfosTransform", + "kind": 6, + "importPath": "spectragraph-transforms.src.spectragraph_transforms.organization.to_infos", + "description": "spectragraph-transforms.src.spectragraph_transforms.organization.to_infos", + "peekOfCode": "class OrgToInfosTransform(Transform):\n \"\"\"Enrich Organization with data from SIRENE (France only).\"\"\"\n # Define types as class attributes - base class handles schema generation automatically\n InputType = List[Organization]\n OutputType = List[Organization]\n @classmethod\n def name(cls) -> str:\n return \"org_to_infos\"\n @classmethod\n def category(cls) -> str:", + "detail": "spectragraph-transforms.src.spectragraph_transforms.organization.to_infos", + "documentation": {} + }, + { + "label": "InputType", + "kind": 5, + "importPath": "spectragraph-transforms.src.spectragraph_transforms.organization.to_infos", + "description": "spectragraph-transforms.src.spectragraph_transforms.organization.to_infos", + "peekOfCode": "InputType = OrgToInfosTransform.InputType\nOutputType = OrgToInfosTransform.OutputType", + "detail": "spectragraph-transforms.src.spectragraph_transforms.organization.to_infos", + "documentation": {} + }, + { + "label": "OutputType", + "kind": 5, + "importPath": "spectragraph-transforms.src.spectragraph_transforms.organization.to_infos", + "description": "spectragraph-transforms.src.spectragraph_transforms.organization.to_infos", + "peekOfCode": "OutputType = OrgToInfosTransform.OutputType", + "detail": "spectragraph-transforms.src.spectragraph_transforms.organization.to_infos", + "documentation": {} + }, + { + "label": "IgnorantTransform", + "kind": 6, + "importPath": "spectragraph-transforms.src.spectragraph_transforms.phone.to_infos", + "description": "spectragraph-transforms.src.spectragraph_transforms.phone.to_infos", + "peekOfCode": "class IgnorantTransform(Transform):\n # Define types as class attributes - base class handles schema generation automatically\n InputType = List[str] # Phone numbers as strings\n OutputType = List[Dict[str, Any]] # Results as dictionaries\n @classmethod\n def name(cls) -> str:\n return \"phone_to_infos\"\n @classmethod\n def category(cls) -> str:\n return \"phones\"", + "detail": "spectragraph-transforms.src.spectragraph_transforms.phone.to_infos", + "documentation": {} + }, + { + "label": "InputType", + "kind": 5, + "importPath": "spectragraph-transforms.src.spectragraph_transforms.phone.to_infos", + "description": "spectragraph-transforms.src.spectragraph_transforms.phone.to_infos", + "peekOfCode": "InputType = IgnorantTransform.InputType\nOutputType = IgnorantTransform.OutputType", + "detail": "spectragraph-transforms.src.spectragraph_transforms.phone.to_infos", + "documentation": {} + }, + { + "label": "OutputType", + "kind": 5, + "importPath": "spectragraph-transforms.src.spectragraph_transforms.phone.to_infos", + "description": "spectragraph-transforms.src.spectragraph_transforms.phone.to_infos", + "peekOfCode": "OutputType = IgnorantTransform.OutputType", + "detail": "spectragraph-transforms.src.spectragraph_transforms.phone.to_infos", + "documentation": {} + }, + { + "label": "PhoneToBreachesTransform", + "kind": 6, + "importPath": "spectragraph-transforms.src.spectragraph_transforms.phone.to_leaks", + "description": "spectragraph-transforms.src.spectragraph_transforms.phone.to_leaks", + "peekOfCode": "class PhoneToBreachesTransform(Transform):\n \"\"\"[HIBPWNED] Get the breaches the phone number might be invovled in.\"\"\"\n InputType = List[Phone]\n OutputType = List[tuple] # List of (phone, breach) tuples\n def __init__(\n self,\n sketch_id: Optional[str] = None,\n scan_id: Optional[str] = None,\n neo4j_conn: Optional[Neo4jConnection] = None,\n vault=None,", + "detail": "spectragraph-transforms.src.spectragraph_transforms.phone.to_leaks", + "documentation": {} + }, + { + "label": "HIBP_API_KEY", + "kind": 5, + "importPath": "spectragraph-transforms.src.spectragraph_transforms.phone.to_leaks", + "description": "spectragraph-transforms.src.spectragraph_transforms.phone.to_leaks", + "peekOfCode": "HIBP_API_KEY = os.getenv(\"HIBP_API_KEY\")\nclass PhoneToBreachesTransform(Transform):\n \"\"\"[HIBPWNED] Get the breaches the phone number might be invovled in.\"\"\"\n InputType = List[Phone]\n OutputType = List[tuple] # List of (phone, breach) tuples\n def __init__(\n self,\n sketch_id: Optional[str] = None,\n scan_id: Optional[str] = None,\n neo4j_conn: Optional[Neo4jConnection] = None,", + "detail": "spectragraph-transforms.src.spectragraph_transforms.phone.to_leaks", + "documentation": {} + }, + { + "label": "InputType", + "kind": 5, + "importPath": "spectragraph-transforms.src.spectragraph_transforms.phone.to_leaks", + "description": "spectragraph-transforms.src.spectragraph_transforms.phone.to_leaks", + "peekOfCode": "InputType = PhoneToBreachesTransform.InputType\nOutputType = PhoneToBreachesTransform.OutputType", + "detail": "spectragraph-transforms.src.spectragraph_transforms.phone.to_leaks", + "documentation": {} + }, + { + "label": "OutputType", + "kind": 5, + "importPath": "spectragraph-transforms.src.spectragraph_transforms.phone.to_leaks", + "description": "spectragraph-transforms.src.spectragraph_transforms.phone.to_leaks", + "peekOfCode": "OutputType = PhoneToBreachesTransform.OutputType", + "detail": "spectragraph-transforms.src.spectragraph_transforms.phone.to_leaks", + "documentation": {} + }, + { + "label": "GitHubRepoParams", + "kind": 6, + "importPath": "spectragraph-transforms.src.spectragraph_transforms.social.github_repo", + "description": "spectragraph-transforms.src.spectragraph_transforms.social.github_repo", + "peekOfCode": "class GitHubRepoParams(BaseModel):\n \"\"\"Parameters for GitHub repository transform.\"\"\"\n domain: str = Field(..., description=\"Target domain to investigate\")\n include_forks: bool = Field(default=False, description=\"Include forked repositories\")\n max_repos: int = Field(default=50, ge=1, le=100, description=\"Maximum repos to return\")\n min_stars: int = Field(default=0, ge=0, description=\"Minimum stars filter\")\n language_filter: Optional[str] = Field(default=None, description=\"Filter by programming language\")\nclass GitHubRepoTransform(Transform):\n \"\"\"\n Transform that enriches domains with GitHub organization information.", + "detail": "spectragraph-transforms.src.spectragraph_transforms.social.github_repo", + "documentation": {} + }, + { + "label": "GitHubRepoTransform", + "kind": 6, + "importPath": "spectragraph-transforms.src.spectragraph_transforms.social.github_repo", + "description": "spectragraph-transforms.src.spectragraph_transforms.social.github_repo", + "peekOfCode": "class GitHubRepoTransform(Transform):\n \"\"\"\n Transform that enriches domains with GitHub organization information.\n Capabilities:\n - Search for GitHub organizations matching domain\n - Retrieve organization details and metrics\n - List public repositories with detailed metadata\n - Identify top contributors per repository\n - Track repository activity and health\n - Detect security indicators (Dependabot, policies, etc.)", + "detail": "spectragraph-transforms.src.spectragraph_transforms.social.github_repo", + "documentation": {} + }, + { + "label": "MaigretTransform", + "kind": 6, + "importPath": "spectragraph-transforms.src.spectragraph_transforms.social.to_maigret", + "description": "spectragraph-transforms.src.spectragraph_transforms.social.to_maigret", + "peekOfCode": "class MaigretTransform(Transform):\n \"\"\"[MAIGRET] Scans usernames for associated social accounts using Maigret.\"\"\"\n # Define types as class attributes - base class handles schema generation automatically\n InputType = List[SocialProfile]\n OutputType = List[SocialProfile]\n @classmethod\n def name(cls) -> str:\n return \"username_to_socials_maigret\"\n @classmethod\n def category(cls) -> str:", + "detail": "spectragraph-transforms.src.spectragraph_transforms.social.to_maigret", + "documentation": {} + }, + { + "label": "false_positives", + "kind": 5, + "importPath": "spectragraph-transforms.src.spectragraph_transforms.social.to_maigret", + "description": "spectragraph-transforms.src.spectragraph_transforms.social.to_maigret", + "peekOfCode": "false_positives = [\"LeagueOfLegends\"]\nclass MaigretTransform(Transform):\n \"\"\"[MAIGRET] Scans usernames for associated social accounts using Maigret.\"\"\"\n # Define types as class attributes - base class handles schema generation automatically\n InputType = List[SocialProfile]\n OutputType = List[SocialProfile]\n @classmethod\n def name(cls) -> str:\n return \"username_to_socials_maigret\"\n @classmethod", + "detail": "spectragraph-transforms.src.spectragraph_transforms.social.to_maigret", + "documentation": {} + }, + { + "label": "InputType", + "kind": 5, + "importPath": "spectragraph-transforms.src.spectragraph_transforms.social.to_maigret", + "description": "spectragraph-transforms.src.spectragraph_transforms.social.to_maigret", + "peekOfCode": "InputType = MaigretTransform.InputType\nOutputType = MaigretTransform.OutputType", + "detail": "spectragraph-transforms.src.spectragraph_transforms.social.to_maigret", + "documentation": {} + }, + { + "label": "OutputType", + "kind": 5, + "importPath": "spectragraph-transforms.src.spectragraph_transforms.social.to_maigret", + "description": "spectragraph-transforms.src.spectragraph_transforms.social.to_maigret", + "peekOfCode": "OutputType = MaigretTransform.OutputType", + "detail": "spectragraph-transforms.src.spectragraph_transforms.social.to_maigret", + "documentation": {} + }, + { + "label": "SherlockTransform", + "kind": 6, + "importPath": "spectragraph-transforms.src.spectragraph_transforms.social.to_sherlock", + "description": "spectragraph-transforms.src.spectragraph_transforms.social.to_sherlock", + "peekOfCode": "class SherlockTransform(Transform):\n \"\"\"[SHERLOCK] Scans the usernames for associated social accounts using Sherlock.\"\"\"\n # Define types as class attributes - base class handles schema generation automatically\n InputType = List[SocialProfile]\n OutputType = List[SocialProfile]\n @classmethod\n def name(cls) -> str:\n return \"username_to_socials_sherlock\"\n @classmethod\n def category(cls) -> str:", + "detail": "spectragraph-transforms.src.spectragraph_transforms.social.to_sherlock", + "documentation": {} + }, + { + "label": "InputType", + "kind": 5, + "importPath": "spectragraph-transforms.src.spectragraph_transforms.social.to_sherlock", + "description": "spectragraph-transforms.src.spectragraph_transforms.social.to_sherlock", + "peekOfCode": "InputType = SherlockTransform.InputType\nOutputType = SherlockTransform.OutputType", + "detail": "spectragraph-transforms.src.spectragraph_transforms.social.to_sherlock", + "documentation": {} + }, + { + "label": "OutputType", + "kind": 5, + "importPath": "spectragraph-transforms.src.spectragraph_transforms.social.to_sherlock", + "description": "spectragraph-transforms.src.spectragraph_transforms.social.to_sherlock", + "peekOfCode": "OutputType = SherlockTransform.OutputType", + "detail": "spectragraph-transforms.src.spectragraph_transforms.social.to_sherlock", + "documentation": {} + }, + { + "label": "ReturnType", + "kind": 6, + "importPath": "spectragraph-transforms.src.spectragraph_transforms.website.to_crawler", + "description": "spectragraph-transforms.src.spectragraph_transforms.website.to_crawler", + "peekOfCode": "class ReturnType(BaseModel):\n website: Website\n emails: Optional[Email]\n phones: Optional[Phone]\nclass WebsiteToCrawler(Transform):\n \"\"\"From website to crawler.\"\"\"\n # Define types as class attributes - base class handles schema generation automatically\n InputType = List[Website]\n OutputType = List[ReturnType] # Simplified output type\n @classmethod", + "detail": "spectragraph-transforms.src.spectragraph_transforms.website.to_crawler", + "documentation": {} + }, + { + "label": "WebsiteToCrawler", + "kind": 6, + "importPath": "spectragraph-transforms.src.spectragraph_transforms.website.to_crawler", + "description": "spectragraph-transforms.src.spectragraph_transforms.website.to_crawler", + "peekOfCode": "class WebsiteToCrawler(Transform):\n \"\"\"From website to crawler.\"\"\"\n # Define types as class attributes - base class handles schema generation automatically\n InputType = List[Website]\n OutputType = List[ReturnType] # Simplified output type\n @classmethod\n def name(cls) -> str:\n return \"website_to_crawler\"\n @classmethod\n def category(cls) -> str:", + "detail": "spectragraph-transforms.src.spectragraph_transforms.website.to_crawler", + "documentation": {} + }, + { + "label": "InputType", + "kind": 5, + "importPath": "spectragraph-transforms.src.spectragraph_transforms.website.to_crawler", + "description": "spectragraph-transforms.src.spectragraph_transforms.website.to_crawler", + "peekOfCode": "InputType = WebsiteToCrawler.InputType\nOutputType = WebsiteToCrawler.OutputType", + "detail": "spectragraph-transforms.src.spectragraph_transforms.website.to_crawler", + "documentation": {} + }, + { + "label": "OutputType", + "kind": 5, + "importPath": "spectragraph-transforms.src.spectragraph_transforms.website.to_crawler", + "description": "spectragraph-transforms.src.spectragraph_transforms.website.to_crawler", + "peekOfCode": "OutputType = WebsiteToCrawler.OutputType", + "detail": "spectragraph-transforms.src.spectragraph_transforms.website.to_crawler", + "documentation": {} + }, + { + "label": "WebsiteToDomainTransform", + "kind": 6, + "importPath": "spectragraph-transforms.src.spectragraph_transforms.website.to_domain", + "description": "spectragraph-transforms.src.spectragraph_transforms.website.to_domain", + "peekOfCode": "class WebsiteToDomainTransform(Transform):\n \"\"\"From website to domain.\"\"\"\n # Define types as class attributes - base class handles schema generation automatically\n InputType = List[Website]\n OutputType = List[Domain]\n @classmethod\n def name(cls) -> str:\n return \"website_to_domain\"\n @classmethod\n def category(cls) -> str:", + "detail": "spectragraph-transforms.src.spectragraph_transforms.website.to_domain", + "documentation": {} + }, + { + "label": "InputType", + "kind": 5, + "importPath": "spectragraph-transforms.src.spectragraph_transforms.website.to_domain", + "description": "spectragraph-transforms.src.spectragraph_transforms.website.to_domain", + "peekOfCode": "InputType = WebsiteToDomainTransform.InputType\nOutputType = WebsiteToDomainTransform.OutputType", + "detail": "spectragraph-transforms.src.spectragraph_transforms.website.to_domain", + "documentation": {} + }, + { + "label": "OutputType", + "kind": 5, + "importPath": "spectragraph-transforms.src.spectragraph_transforms.website.to_domain", + "description": "spectragraph-transforms.src.spectragraph_transforms.website.to_domain", + "peekOfCode": "OutputType = WebsiteToDomainTransform.OutputType", + "detail": "spectragraph-transforms.src.spectragraph_transforms.website.to_domain", + "documentation": {} + }, + { + "label": "WebsiteToLinks", + "kind": 6, + "importPath": "spectragraph-transforms.src.spectragraph_transforms.website.to_links", + "description": "spectragraph-transforms.src.spectragraph_transforms.website.to_links", + "peekOfCode": "class WebsiteToLinks(Transform):\n \"\"\"From website to spread crawler that extracts domains and internal/external links.\"\"\"\n # Define types as class attributes - base class handles schema generation automatically\n InputType = List[Website]\n OutputType = List[Website]\n @classmethod\n def name(cls) -> str:\n return \"website_to_links\"\n @classmethod\n def category(cls) -> str:", + "detail": "spectragraph-transforms.src.spectragraph_transforms.website.to_links", + "documentation": {} + }, + { + "label": "InputType", + "kind": 5, + "importPath": "spectragraph-transforms.src.spectragraph_transforms.website.to_links", + "description": "spectragraph-transforms.src.spectragraph_transforms.website.to_links", + "peekOfCode": "InputType = WebsiteToLinks.InputType\nOutputType = WebsiteToLinks.OutputType", + "detail": "spectragraph-transforms.src.spectragraph_transforms.website.to_links", + "documentation": {} + }, + { + "label": "OutputType", + "kind": 5, + "importPath": "spectragraph-transforms.src.spectragraph_transforms.website.to_links", + "description": "spectragraph-transforms.src.spectragraph_transforms.website.to_links", + "peekOfCode": "OutputType = WebsiteToLinks.OutputType", + "detail": "spectragraph-transforms.src.spectragraph_transforms.website.to_links", + "documentation": {} + }, + { + "label": "WebsiteToText", + "kind": 6, + "importPath": "spectragraph-transforms.src.spectragraph_transforms.website.to_text", + "description": "spectragraph-transforms.src.spectragraph_transforms.website.to_text", + "peekOfCode": "class WebsiteToText(Transform):\n \"\"\"Extracts the texts in a webpage.\"\"\"\n InputType = List[Website]\n OutputType = List[Phrase]\n @classmethod\n def name(cls) -> str:\n return \"website_to_text\"\n @classmethod\n def category(cls) -> str:\n return \"Website\"", + "detail": "spectragraph-transforms.src.spectragraph_transforms.website.to_text", + "documentation": {} + }, + { + "label": "InputType", + "kind": 5, + "importPath": "spectragraph-transforms.src.spectragraph_transforms.website.to_text", + "description": "spectragraph-transforms.src.spectragraph_transforms.website.to_text", + "peekOfCode": "InputType = WebsiteToText.InputType\nOutputType = WebsiteToText.OutputType", + "detail": "spectragraph-transforms.src.spectragraph_transforms.website.to_text", + "documentation": {} + }, + { + "label": "OutputType", + "kind": 5, + "importPath": "spectragraph-transforms.src.spectragraph_transforms.website.to_text", + "description": "spectragraph-transforms.src.spectragraph_transforms.website.to_text", + "peekOfCode": "OutputType = WebsiteToText.OutputType", + "detail": "spectragraph-transforms.src.spectragraph_transforms.website.to_text", + "documentation": {} + }, + { + "label": "WebsiteToWebtrackersTransform", + "kind": 6, + "importPath": "spectragraph-transforms.src.spectragraph_transforms.website.to_webtrackers", + "description": "spectragraph-transforms.src.spectragraph_transforms.website.to_webtrackers", + "peekOfCode": "class WebsiteToWebtrackersTransform(Transform):\n \"\"\"From website to webtrackers.\"\"\"\n # Define types as class attributes - base class handles schema generation automatically\n InputType = List[Website]\n OutputType = List[WebTracker]\n def __init__(\n self,\n sketch_id: str,\n scan_id: str,\n neo4j_conn: Optional[Neo4jConnection] = None,", + "detail": "spectragraph-transforms.src.spectragraph_transforms.website.to_webtrackers", + "documentation": {} + }, + { + "label": "InputType", + "kind": 5, + "importPath": "spectragraph-transforms.src.spectragraph_transforms.website.to_webtrackers", + "description": "spectragraph-transforms.src.spectragraph_transforms.website.to_webtrackers", + "peekOfCode": "InputType = WebsiteToWebtrackersTransform.InputType\nOutputType = WebsiteToWebtrackersTransform.OutputType", + "detail": "spectragraph-transforms.src.spectragraph_transforms.website.to_webtrackers", + "documentation": {} + }, + { + "label": "OutputType", + "kind": 5, + "importPath": "spectragraph-transforms.src.spectragraph_transforms.website.to_webtrackers", + "description": "spectragraph-transforms.src.spectragraph_transforms.website.to_webtrackers", + "peekOfCode": "OutputType = WebsiteToWebtrackersTransform.OutputType", + "detail": "spectragraph-transforms.src.spectragraph_transforms.website.to_webtrackers", + "documentation": {} + }, + { + "label": "is_valid_ip", + "kind": 2, + "importPath": "spectragraph-transforms.src.spectragraph_transforms.utils", + "description": "spectragraph-transforms.src.spectragraph_transforms.utils", + "peekOfCode": "def is_valid_ip(address: str) -> bool:\n try:\n ipaddress.ip_address(address)\n return True\n except ValueError:\n return False\ndef is_valid_username(username: str) -> bool:\n if not re.match(r\"^[a-zA-Z0-9_-]{3,30}$\", username):\n return False\n return True", + "detail": "spectragraph-transforms.src.spectragraph_transforms.utils", + "documentation": {} + }, + { + "label": "is_valid_username", + "kind": 2, + "importPath": "spectragraph-transforms.src.spectragraph_transforms.utils", + "description": "spectragraph-transforms.src.spectragraph_transforms.utils", + "peekOfCode": "def is_valid_username(username: str) -> bool:\n if not re.match(r\"^[a-zA-Z0-9_-]{3,30}$\", username):\n return False\n return True\ndef is_valid_email(email: str) -> bool:\n if not re.match(r\"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$\", email):\n return False\n return True\ndef is_valid_domain(url_or_domain: str) -> str:\n try:", + "detail": "spectragraph-transforms.src.spectragraph_transforms.utils", + "documentation": {} + }, + { + "label": "is_valid_email", + "kind": 2, + "importPath": "spectragraph-transforms.src.spectragraph_transforms.utils", + "description": "spectragraph-transforms.src.spectragraph_transforms.utils", + "peekOfCode": "def is_valid_email(email: str) -> bool:\n if not re.match(r\"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$\", email):\n return False\n return True\ndef is_valid_domain(url_or_domain: str) -> str:\n try:\n parsed = urlparse(\n url_or_domain if \"://\" in url_or_domain else \"http://\" + url_or_domain\n )\n hostname = parsed.hostname or url_or_domain", + "detail": "spectragraph-transforms.src.spectragraph_transforms.utils", + "documentation": {} + }, + { + "label": "is_valid_domain", + "kind": 2, + "importPath": "spectragraph-transforms.src.spectragraph_transforms.utils", + "description": "spectragraph-transforms.src.spectragraph_transforms.utils", + "peekOfCode": "def is_valid_domain(url_or_domain: str) -> str:\n try:\n parsed = urlparse(\n url_or_domain if \"://\" in url_or_domain else \"http://\" + url_or_domain\n )\n hostname = parsed.hostname or url_or_domain\n if not hostname or \".\" not in hostname:\n return False\n if not re.match(r\"^[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$\", hostname):\n return False", + "detail": "spectragraph-transforms.src.spectragraph_transforms.utils", + "documentation": {} + }, + { + "label": "is_root_domain", + "kind": 2, + "importPath": "spectragraph-transforms.src.spectragraph_transforms.utils", + "description": "spectragraph-transforms.src.spectragraph_transforms.utils", + "peekOfCode": "def is_root_domain(domain: str) -> bool:\n \"\"\"\n Determine if a domain is a root domain or subdomain.\n Args:\n domain: The domain string to check\n Returns:\n True if it's a root domain (e.g., example.com), False if it's a subdomain (e.g., sub.example.com)\n \"\"\"\n try:\n # Remove protocol if present", + "detail": "spectragraph-transforms.src.spectragraph_transforms.utils", + "documentation": {} + }, + { + "label": "get_root_domain", + "kind": 2, + "importPath": "spectragraph-transforms.src.spectragraph_transforms.utils", + "description": "spectragraph-transforms.src.spectragraph_transforms.utils", + "peekOfCode": "def get_root_domain(domain: str) -> str:\n \"\"\"\n Extract the root domain from a given domain string.\n Args:\n domain: The domain string (can be a subdomain or root domain)\n Returns:\n The root domain (e.g., \"example.com\" from \"sub.example.com\" or \"www.sub.example.com\")\n \"\"\"\n try:\n # Remove protocol if present", + "detail": "spectragraph-transforms.src.spectragraph_transforms.utils", + "documentation": {} + }, + { + "label": "is_valid_number", + "kind": 2, + "importPath": "spectragraph-transforms.src.spectragraph_transforms.utils", + "description": "spectragraph-transforms.src.spectragraph_transforms.utils", + "peekOfCode": "def is_valid_number(phone: str, region: str = \"FR\") -> None:\n \"\"\"\n Validates a phone number. Raises InvalidPhoneNumberError if invalid.\n - `region` should be ISO 3166-1 alpha-2 country code (e.g., 'FR' for France)\n \"\"\"\n try:\n parsed = phonenumbers.parse(phone, region)\n if not phonenumbers.is_valid_number(parsed):\n return False\n except NumberParseException:", + "detail": "spectragraph-transforms.src.spectragraph_transforms.utils", + "documentation": {} + }, + { + "label": "parse_asn", + "kind": 2, + "importPath": "spectragraph-transforms.src.spectragraph_transforms.utils", + "description": "spectragraph-transforms.src.spectragraph_transforms.utils", + "peekOfCode": "def parse_asn(asn: str) -> int:\n if not is_valid_asn(asn):\n raise ValueError(f\"Invalid ASN format: {asn}\")\n return int(re.sub(r\"(?i)^AS\", \"\", asn))\ndef is_valid_asn(asn: str) -> bool:\n if not re.fullmatch(r\"(AS)?\\d+\", asn, re.IGNORECASE):\n return False\n asn_num = int(re.sub(r\"(?i)^AS\", \"\", asn))\n return 0 <= asn_num <= 4294967295\ndef resolve_type(details: dict, schema_context: dict = None) -> str:", + "detail": "spectragraph-transforms.src.spectragraph_transforms.utils", + "documentation": {} + }, + { + "label": "is_valid_asn", + "kind": 2, + "importPath": "spectragraph-transforms.src.spectragraph_transforms.utils", + "description": "spectragraph-transforms.src.spectragraph_transforms.utils", + "peekOfCode": "def is_valid_asn(asn: str) -> bool:\n if not re.fullmatch(r\"(AS)?\\d+\", asn, re.IGNORECASE):\n return False\n asn_num = int(re.sub(r\"(?i)^AS\", \"\", asn))\n return 0 <= asn_num <= 4294967295\ndef resolve_type(details: dict, schema_context: dict = None) -> str:\n if \"anyOf\" in details:\n types = []\n for option in details[\"anyOf\"]:\n if \"$ref\" in option:", + "detail": "spectragraph-transforms.src.spectragraph_transforms.utils", + "documentation": {} + }, + { + "label": "resolve_type", + "kind": 2, + "importPath": "spectragraph-transforms.src.spectragraph_transforms.utils", + "description": "spectragraph-transforms.src.spectragraph_transforms.utils", + "peekOfCode": "def resolve_type(details: dict, schema_context: dict = None) -> str:\n if \"anyOf\" in details:\n types = []\n for option in details[\"anyOf\"]:\n if \"$ref\" in option:\n ref = option[\"$ref\"].split(\"/\")[-1]\n types.append(ref)\n elif option.get(\"type\") == \"array\":\n # Handle array types within anyOf\n item_type = resolve_type(option.get(\"items\", {}), schema_context)", + "detail": "spectragraph-transforms.src.spectragraph_transforms.utils", + "documentation": {} + }, + { + "label": "extract_input_schema_flow", + "kind": 2, + "importPath": "spectragraph-transforms.src.spectragraph_transforms.utils", + "description": "spectragraph-transforms.src.spectragraph_transforms.utils", + "peekOfCode": "def extract_input_schema_flow(model: Type[BaseModel]) -> Dict[str, Any]:\n adapter = TypeAdapter(model)\n schema = adapter.json_schema()\n # Use the main schema properties, not the $defs\n type_name = model.__name__\n details = schema\n return {\n \"class_name\": model.__name__,\n \"name\": model.__name__,\n \"module\": model.__module__,", + "detail": "spectragraph-transforms.src.spectragraph_transforms.utils", + "documentation": {} + }, + { + "label": "get_domain_from_ssl", + "kind": 2, + "importPath": "spectragraph-transforms.src.spectragraph_transforms.utils", + "description": "spectragraph-transforms.src.spectragraph_transforms.utils", + "peekOfCode": "def get_domain_from_ssl(ip: str, port: int = 443) -> str | None:\n try:\n context = ssl.create_default_context()\n with socket.create_connection((ip, port), timeout=3) as sock:\n with context.wrap_socket(sock, server_hostname=ip) as ssock:\n cert = ssock.getpeercert()\n subject = cert.get(\"subject\", [])\n for entry in subject:\n if entry[0][0] == \"commonName\":\n return entry[0][1]", + "detail": "spectragraph-transforms.src.spectragraph_transforms.utils", + "documentation": {} + }, + { + "label": "extract_transform", + "kind": 2, + "importPath": "spectragraph-transforms.src.spectragraph_transforms.utils", + "description": "spectragraph-transforms.src.spectragraph_transforms.utils", + "peekOfCode": "def extract_transform(transform: Dict[str, Any]) -> Dict[str, Any]:\n nodes = transform[\"nodes\"]\n edges = transform[\"edges\"]\n input_node = next((node for node in nodes if node[\"data\"][\"type\"] == \"type\"), None)\n if not input_node:\n raise ValueError(\"No input node found.\")\n input_output = input_node[\"data\"][\"outputs\"]\n node_lookup = {node[\"id\"]: node for node in nodes}\n transforms = []\n for edge in edges:", + "detail": "spectragraph-transforms.src.spectragraph_transforms.utils", + "documentation": {} + }, + { + "label": "get_label_color", + "kind": 2, + "importPath": "spectragraph-transforms.src.spectragraph_transforms.utils", + "description": "spectragraph-transforms.src.spectragraph_transforms.utils", + "peekOfCode": "def get_label_color(label: str) -> str:\n color_map = {\"subdomain\": \"#A5ABB6\", \"domain\": \"#68BDF6\", \"default\": \"#A5ABB6\"}\n return color_map.get(label, color_map[\"default\"])\ndef flatten(data_dict, prefix=\"\"):\n \"\"\"\n Flattens a dictionary to contain only Neo4j-compatible property values.\n Neo4j supports primitive types (string, number, boolean) and arrays of those types.\n Args:\n data_dict (dict): Dictionary to flatten\n Returns:", + "detail": "spectragraph-transforms.src.spectragraph_transforms.utils", + "documentation": {} + }, + { + "label": "flatten", + "kind": 2, + "importPath": "spectragraph-transforms.src.spectragraph_transforms.utils", + "description": "spectragraph-transforms.src.spectragraph_transforms.utils", + "peekOfCode": "def flatten(data_dict, prefix=\"\"):\n \"\"\"\n Flattens a dictionary to contain only Neo4j-compatible property values.\n Neo4j supports primitive types (string, number, boolean) and arrays of those types.\n Args:\n data_dict (dict): Dictionary to flatten\n Returns:\n dict: Flattened dictionary with only Neo4j-compatible values\n \"\"\"\n flattened = {}", + "detail": "spectragraph-transforms.src.spectragraph_transforms.utils", + "documentation": {} + }, + { + "label": "get_inline_relationships", + "kind": 2, + "importPath": "spectragraph-transforms.src.spectragraph_transforms.utils", + "description": "spectragraph-transforms.src.spectragraph_transforms.utils", + "peekOfCode": "def get_inline_relationships(nodes: List[Any], edges: List[Any]) -> List[str]:\n \"\"\"\n Get the inline relationships for a list of nodes and edges.\n \"\"\"\n relationships = []\n for edge in edges:\n source = next((node for node in nodes if node[\"id\"] == edge[\"source\"]), None)\n target = next((node for node in nodes if node[\"id\"] == edge[\"target\"]), None)\n if source and target:\n relationships.append({\"source\": source, \"edge\": edge, \"target\": target})", + "detail": "spectragraph-transforms.src.spectragraph_transforms.utils", + "documentation": {} + }, + { + "label": "to_json_serializable", + "kind": 2, + "importPath": "spectragraph-transforms.src.spectragraph_transforms.utils", + "description": "spectragraph-transforms.src.spectragraph_transforms.utils", + "peekOfCode": "def to_json_serializable(obj):\n \"\"\"Convert any object to a JSON-serializable format.\"\"\"\n import json\n from pydantic import BaseModel\n try:\n # Test if already JSON serializable\n json.dumps(obj)\n return obj\n except (TypeError, ValueError):\n # Handle common cases", + "detail": "spectragraph-transforms.src.spectragraph_transforms.utils", + "documentation": {} + }, + { + "label": "AsnmapTool", + "kind": 6, + "importPath": "spectragraph-transforms.src.tools.network.asnmap", + "description": "spectragraph-transforms.src.tools.network.asnmap", + "peekOfCode": "class AsnmapTool(DockerTool):\n image = \"projectdiscovery/asnmap\"\n default_tag = \"latest\"\n def __init__(self):\n super().__init__(self.image, self.default_tag)\n @classmethod\n def name(cls) -> str:\n return \"asnmap\"\n @classmethod\n def description(cls) -> str:", + "detail": "spectragraph-transforms.src.tools.network.asnmap", + "documentation": {} + }, + { + "label": "DnsxTool", + "kind": 6, + "importPath": "spectragraph-transforms.src.tools.network.dnsx", + "description": "spectragraph-transforms.src.tools.network.dnsx", + "peekOfCode": "class DnsxTool(DockerTool):\n image = \"projectdiscovery/dnsx\"\n default_tag = \"latest\"\n def __init__(self):\n super().__init__(self.image, self.default_tag)\n @classmethod\n def name(cls) -> str:\n return \"dnsx\"\n @classmethod\n def description(cls) -> str:", + "detail": "spectragraph-transforms.src.tools.network.dnsx", + "documentation": {} + }, + { + "label": "HttpxTool", + "kind": 6, + "importPath": "spectragraph-transforms.src.tools.network.httpx", + "description": "spectragraph-transforms.src.tools.network.httpx", + "peekOfCode": "class HttpxTool(DockerTool):\n image = \"projectdiscovery/httpx\"\n default_tag = \"latest\"\n def __init__(self):\n super().__init__(self.image, self.default_tag)\n @classmethod\n def name(cls) -> str:\n return \"httpx\"\n @classmethod\n def description(cls) -> str:", + "detail": "spectragraph-transforms.src.tools.network.httpx", + "documentation": {} + }, + { + "label": "MapcidrTool", + "kind": 6, + "importPath": "spectragraph-transforms.src.tools.network.mapcidr", + "description": "spectragraph-transforms.src.tools.network.mapcidr", + "peekOfCode": "class MapcidrTool(DockerTool):\n image = \"projectdiscovery/mapcidr\"\n default_tag = \"latest\"\n def __init__(self):\n super().__init__(self.image, self.default_tag)\n @classmethod\n def name(cls) -> str:\n return \"mapcidr\"\n @classmethod\n def description(cls) -> str:", + "detail": "spectragraph-transforms.src.tools.network.mapcidr", + "documentation": {} + }, + { + "label": "ReconCrawlTool", + "kind": 6, + "importPath": "spectragraph-transforms.src.tools.network.reconcrawl", + "description": "spectragraph-transforms.src.tools.network.reconcrawl", + "peekOfCode": "class ReconCrawlTool(Tool):\n def __init__(self):\n super().__init__()\n @classmethod\n def name(cls) -> str:\n return \"reconcrawl\"\n @classmethod\n def description(cls) -> str:\n return \"Emails and phone numbers crawler from websites by analyzing their HTML and embedded scripts.\"\n @classmethod", + "detail": "spectragraph-transforms.src.tools.network.reconcrawl", + "documentation": {} + }, + { + "label": "SubfinderTool", + "kind": 6, + "importPath": "spectragraph-transforms.src.tools.network.subfinder", + "description": "spectragraph-transforms.src.tools.network.subfinder", + "peekOfCode": "class SubfinderTool(DockerTool):\n image = \"projectdiscovery/subfinder\"\n default_tag = \"latest\"\n def __init__(self):\n super().__init__(self.image, self.default_tag)\n @classmethod\n def name(cls) -> str:\n return \"subfinder\"\n @classmethod\n def description(cls) -> str:", + "detail": "spectragraph-transforms.src.tools.network.subfinder", + "documentation": {} + }, + { + "label": "WhoxyTool", + "kind": 6, + "importPath": "spectragraph-transforms.src.tools.network.whoxy", + "description": "spectragraph-transforms.src.tools.network.whoxy", + "peekOfCode": "class WhoxyTool(Tool):\n whoxy_api_endoint = \"https://api.whoxy.com/\"\n @classmethod\n def name(cls) -> str:\n return \"whoxy\"\n @classmethod\n def version(cls) -> str:\n return \"1.0.0\"\n @classmethod\n def description(cls) -> str:", + "detail": "spectragraph-transforms.src.tools.network.whoxy", + "documentation": {} + }, + { + "label": "SireneTool", + "kind": 6, + "importPath": "spectragraph-transforms.src.tools.organizations.sirene", + "description": "spectragraph-transforms.src.tools.organizations.sirene", + "peekOfCode": "class SireneTool(Tool):\n @classmethod\n def name(cls) -> str:\n return \"sirene\"\n @classmethod\n def version(cls) -> str:\n return \"1.0.0\"\n @classmethod\n def description(cls) -> str:\n return \"The Sirene API allows you to query the Sirene directory of businesses and establishments, managed by Insee.\"", + "detail": "spectragraph-transforms.src.tools.organizations.sirene", + "documentation": {} + }, + { + "label": "Tool", + "kind": 6, + "importPath": "spectragraph-transforms.src.tools.base", + "description": "spectragraph-transforms.src.tools.base", + "peekOfCode": "class Tool(ABC):\n @classmethod\n @abstractmethod\n def name(cls) -> str:\n pass\n @classmethod\n @abstractmethod\n def category(cls) -> str:\n pass\n @classmethod", + "detail": "spectragraph-transforms.src.tools.base", + "documentation": {} + }, + { + "label": "DockerTool", + "kind": 6, + "importPath": "spectragraph-transforms.src.tools.dockertool", + "description": "spectragraph-transforms.src.tools.dockertool", + "peekOfCode": "class DockerTool(Tool):\n def __init__(self, image: str, default_tag: str = \"latest\"):\n self.image = f\"{image}:{default_tag}\"\n try:\n self.client = from_env()\n except Exception as e:\n raise RuntimeError(\n f\"Failed to connect to Docker daemon. Is Docker running? Error: {e}\"\n )\n @classmethod", + "detail": "spectragraph-transforms.src.tools.dockertool", + "documentation": {} + }, + { + "label": "test_name", + "kind": 2, + "importPath": "spectragraph-transforms.tests.tools.network.asnmap", + "description": "spectragraph-transforms.tests.tools.network.asnmap", + "peekOfCode": "def test_name():\n assert tool.name() == \"asnmap\"\ndef test_description():\n assert tool.description() == \"ASN mapping and network reconnaissance tool.\"\ndef test_category():\n assert tool.category() == \"ASN discovery\"\ndef test_image():\n assert tool.get_image() == \"projectdiscovery/asnmap\"\ndef test_install():\n tool.install()", + "detail": "spectragraph-transforms.tests.tools.network.asnmap", + "documentation": {} + }, + { + "label": "test_description", + "kind": 2, + "importPath": "spectragraph-transforms.tests.tools.network.asnmap", + "description": "spectragraph-transforms.tests.tools.network.asnmap", + "peekOfCode": "def test_description():\n assert tool.description() == \"ASN mapping and network reconnaissance tool.\"\ndef test_category():\n assert tool.category() == \"ASN discovery\"\ndef test_image():\n assert tool.get_image() == \"projectdiscovery/asnmap\"\ndef test_install():\n tool.install()\n assert tool.is_installed() == True\ndef test_version():", + "detail": "spectragraph-transforms.tests.tools.network.asnmap", + "documentation": {} + }, + { + "label": "test_category", + "kind": 2, + "importPath": "spectragraph-transforms.tests.tools.network.asnmap", + "description": "spectragraph-transforms.tests.tools.network.asnmap", + "peekOfCode": "def test_category():\n assert tool.category() == \"ASN discovery\"\ndef test_image():\n assert tool.get_image() == \"projectdiscovery/asnmap\"\ndef test_install():\n tool.install()\n assert tool.is_installed() == True\ndef test_version():\n tool.install()\n version = tool.version()", + "detail": "spectragraph-transforms.tests.tools.network.asnmap", + "documentation": {} + }, + { + "label": "test_image", + "kind": 2, + "importPath": "spectragraph-transforms.tests.tools.network.asnmap", + "description": "spectragraph-transforms.tests.tools.network.asnmap", + "peekOfCode": "def test_image():\n assert tool.get_image() == \"projectdiscovery/asnmap\"\ndef test_install():\n tool.install()\n assert tool.is_installed() == True\ndef test_version():\n tool.install()\n version = tool.version()\n # Check that version follows the expected format: v followed by digits and dots\n assert re.match(r\"^v[\\d\\.]+$\", version)", + "detail": "spectragraph-transforms.tests.tools.network.asnmap", + "documentation": {} + }, + { + "label": "test_install", + "kind": 2, + "importPath": "spectragraph-transforms.tests.tools.network.asnmap", + "description": "spectragraph-transforms.tests.tools.network.asnmap", + "peekOfCode": "def test_install():\n tool.install()\n assert tool.is_installed() == True\ndef test_version():\n tool.install()\n version = tool.version()\n # Check that version follows the expected format: v followed by digits and dots\n assert re.match(r\"^v[\\d\\.]+$\", version)\ndef test_launch_no_api_key():\n import pytest", + "detail": "spectragraph-transforms.tests.tools.network.asnmap", + "documentation": {} + }, + { + "label": "test_version", + "kind": 2, + "importPath": "spectragraph-transforms.tests.tools.network.asnmap", + "description": "spectragraph-transforms.tests.tools.network.asnmap", + "peekOfCode": "def test_version():\n tool.install()\n version = tool.version()\n # Check that version follows the expected format: v followed by digits and dots\n assert re.match(r\"^v[\\d\\.]+$\", version)\ndef test_launch_no_api_key():\n import pytest\n with pytest.raises(KeyError, match=\"Missing key\"):\n tool.launch(\"alliage.io\", \"domain\")\ndef test_launch_wrong_type():", + "detail": "spectragraph-transforms.tests.tools.network.asnmap", + "documentation": {} + }, + { + "label": "test_launch_no_api_key", + "kind": 2, + "importPath": "spectragraph-transforms.tests.tools.network.asnmap", + "description": "spectragraph-transforms.tests.tools.network.asnmap", + "peekOfCode": "def test_launch_no_api_key():\n import pytest\n with pytest.raises(KeyError, match=\"Missing key\"):\n tool.launch(\"alliage.io\", \"domain\")\ndef test_launch_wrong_type():\n import pytest\n with pytest.raises(ValueError, match=\"Invalid type: 'domains'\"):\n tool.launch(\"alliage.io\", \"domains\")\ndef test_launch():\n results = tool.launch(\"alliage.io\", \"domain\")", + "detail": "spectragraph-transforms.tests.tools.network.asnmap", + "documentation": {} + }, + { + "label": "test_launch_wrong_type", + "kind": 2, + "importPath": "spectragraph-transforms.tests.tools.network.asnmap", + "description": "spectragraph-transforms.tests.tools.network.asnmap", + "peekOfCode": "def test_launch_wrong_type():\n import pytest\n with pytest.raises(ValueError, match=\"Invalid type: 'domains'\"):\n tool.launch(\"alliage.io\", \"domains\")\ndef test_launch():\n results = tool.launch(\"alliage.io\", \"domain\")\n assert isinstance(results, Dict)", + "detail": "spectragraph-transforms.tests.tools.network.asnmap", + "documentation": {} + }, + { + "label": "test_launch", + "kind": 2, + "importPath": "spectragraph-transforms.tests.tools.network.asnmap", + "description": "spectragraph-transforms.tests.tools.network.asnmap", + "peekOfCode": "def test_launch():\n results = tool.launch(\"alliage.io\", \"domain\")\n assert isinstance(results, Dict)", + "detail": "spectragraph-transforms.tests.tools.network.asnmap", + "documentation": {} + }, + { + "label": "tool", + "kind": 5, + "importPath": "spectragraph-transforms.tests.tools.network.asnmap", + "description": "spectragraph-transforms.tests.tools.network.asnmap", + "peekOfCode": "tool = AsnmapTool()\ndef test_name():\n assert tool.name() == \"asnmap\"\ndef test_description():\n assert tool.description() == \"ASN mapping and network reconnaissance tool.\"\ndef test_category():\n assert tool.category() == \"ASN discovery\"\ndef test_image():\n assert tool.get_image() == \"projectdiscovery/asnmap\"\ndef test_install():", + "detail": "spectragraph-transforms.tests.tools.network.asnmap", + "documentation": {} + }, + { + "label": "test_name", + "kind": 2, + "importPath": "spectragraph-transforms.tests.tools.network.httpx", + "description": "spectragraph-transforms.tests.tools.network.httpx", + "peekOfCode": "def test_name():\n assert tool.name() == \"httpx\"\ndef test_description():\n assert (\n tool.description()\n == \"An HTTP toolkit that probes services, web servers, and other valuable metadata.\"\n )\ndef test_category():\n assert tool.category() == \"Web technologies enumeration\"\ndef test_image():", + "detail": "spectragraph-transforms.tests.tools.network.httpx", + "documentation": {} + }, + { + "label": "test_description", + "kind": 2, + "importPath": "spectragraph-transforms.tests.tools.network.httpx", + "description": "spectragraph-transforms.tests.tools.network.httpx", + "peekOfCode": "def test_description():\n assert (\n tool.description()\n == \"An HTTP toolkit that probes services, web servers, and other valuable metadata.\"\n )\ndef test_category():\n assert tool.category() == \"Web technologies enumeration\"\ndef test_image():\n assert tool.get_image() == \"projectdiscovery/httpx\"\ndef test_install():", + "detail": "spectragraph-transforms.tests.tools.network.httpx", + "documentation": {} + }, + { + "label": "test_category", + "kind": 2, + "importPath": "spectragraph-transforms.tests.tools.network.httpx", + "description": "spectragraph-transforms.tests.tools.network.httpx", + "peekOfCode": "def test_category():\n assert tool.category() == \"Web technologies enumeration\"\ndef test_image():\n assert tool.get_image() == \"projectdiscovery/httpx\"\ndef test_install():\n tool.install()\n assert tool.is_installed() == True\ndef test_version():\n tool.install()\n version = tool.version()", + "detail": "spectragraph-transforms.tests.tools.network.httpx", + "documentation": {} + }, + { + "label": "test_image", + "kind": 2, + "importPath": "spectragraph-transforms.tests.tools.network.httpx", + "description": "spectragraph-transforms.tests.tools.network.httpx", + "peekOfCode": "def test_image():\n assert tool.get_image() == \"projectdiscovery/httpx\"\ndef test_install():\n tool.install()\n assert tool.is_installed() == True\ndef test_version():\n tool.install()\n version = tool.version()\n # Check that version follows the expected format: v followed by digits and dots\n assert re.match(r\"^v[\\d\\.]+$\", version)", + "detail": "spectragraph-transforms.tests.tools.network.httpx", + "documentation": {} + }, + { + "label": "test_install", + "kind": 2, + "importPath": "spectragraph-transforms.tests.tools.network.httpx", + "description": "spectragraph-transforms.tests.tools.network.httpx", + "peekOfCode": "def test_install():\n tool.install()\n assert tool.is_installed() == True\ndef test_version():\n tool.install()\n version = tool.version()\n # Check that version follows the expected format: v followed by digits and dots\n assert re.match(r\"^v[\\d\\.]+$\", version)\ndef test_launch():\n assert True", + "detail": "spectragraph-transforms.tests.tools.network.httpx", + "documentation": {} + }, + { + "label": "test_version", + "kind": 2, + "importPath": "spectragraph-transforms.tests.tools.network.httpx", + "description": "spectragraph-transforms.tests.tools.network.httpx", + "peekOfCode": "def test_version():\n tool.install()\n version = tool.version()\n # Check that version follows the expected format: v followed by digits and dots\n assert re.match(r\"^v[\\d\\.]+$\", version)\ndef test_launch():\n assert True\n results = tool.launch(\"https://alliage.io\")\n print(results)\n assert isinstance(results, List)", + "detail": "spectragraph-transforms.tests.tools.network.httpx", + "documentation": {} + }, + { + "label": "test_launch", + "kind": 2, + "importPath": "spectragraph-transforms.tests.tools.network.httpx", + "description": "spectragraph-transforms.tests.tools.network.httpx", + "peekOfCode": "def test_launch():\n assert True\n results = tool.launch(\"https://alliage.io\")\n print(results)\n assert isinstance(results, List)\ndef test_launch_unreached_host():\n assert True\n results = tool.launch(\"https://this-is-not-a-valid-domain.local\")\n assert isinstance(results, List)\n assert len(results) == 0", + "detail": "spectragraph-transforms.tests.tools.network.httpx", + "documentation": {} + }, + { + "label": "test_launch_unreached_host", + "kind": 2, + "importPath": "spectragraph-transforms.tests.tools.network.httpx", + "description": "spectragraph-transforms.tests.tools.network.httpx", + "peekOfCode": "def test_launch_unreached_host():\n assert True\n results = tool.launch(\"https://this-is-not-a-valid-domain.local\")\n assert isinstance(results, List)\n assert len(results) == 0", + "detail": "spectragraph-transforms.tests.tools.network.httpx", + "documentation": {} + }, + { + "label": "tool", + "kind": 5, + "importPath": "spectragraph-transforms.tests.tools.network.httpx", + "description": "spectragraph-transforms.tests.tools.network.httpx", + "peekOfCode": "tool = HttpxTool()\ndef test_name():\n assert tool.name() == \"httpx\"\ndef test_description():\n assert (\n tool.description()\n == \"An HTTP toolkit that probes services, web servers, and other valuable metadata.\"\n )\ndef test_category():\n assert tool.category() == \"Web technologies enumeration\"", + "detail": "spectragraph-transforms.tests.tools.network.httpx", + "documentation": {} + }, + { + "label": "test_name", + "kind": 2, + "importPath": "spectragraph-transforms.tests.tools.network.reconcrawl", + "description": "spectragraph-transforms.tests.tools.network.reconcrawl", + "peekOfCode": "def test_name():\n assert tool.name() == \"reconcrawl\"\ndef test_description():\n assert (\n tool.description()\n == \"Emails and phone numbers crawler from websites by analyzing their HTML and embedded scripts.\"\n )\ndef test_category():\n assert tool.category() == \"Crawler\"\ndef test_install():", + "detail": "spectragraph-transforms.tests.tools.network.reconcrawl", + "documentation": {} + }, + { + "label": "test_description", + "kind": 2, + "importPath": "spectragraph-transforms.tests.tools.network.reconcrawl", + "description": "spectragraph-transforms.tests.tools.network.reconcrawl", + "peekOfCode": "def test_description():\n assert (\n tool.description()\n == \"Emails and phone numbers crawler from websites by analyzing their HTML and embedded scripts.\"\n )\ndef test_category():\n assert tool.category() == \"Crawler\"\ndef test_install():\n tool.install()\n assert tool.is_installed() == True", + "detail": "spectragraph-transforms.tests.tools.network.reconcrawl", + "documentation": {} + }, + { + "label": "test_category", + "kind": 2, + "importPath": "spectragraph-transforms.tests.tools.network.reconcrawl", + "description": "spectragraph-transforms.tests.tools.network.reconcrawl", + "peekOfCode": "def test_category():\n assert tool.category() == \"Crawler\"\ndef test_install():\n tool.install()\n assert tool.is_installed() == True", + "detail": "spectragraph-transforms.tests.tools.network.reconcrawl", + "documentation": {} + }, + { + "label": "test_install", + "kind": 2, + "importPath": "spectragraph-transforms.tests.tools.network.reconcrawl", + "description": "spectragraph-transforms.tests.tools.network.reconcrawl", + "peekOfCode": "def test_install():\n tool.install()\n assert tool.is_installed() == True", + "detail": "spectragraph-transforms.tests.tools.network.reconcrawl", + "documentation": {} + }, + { + "label": "tool", + "kind": 5, + "importPath": "spectragraph-transforms.tests.tools.network.reconcrawl", + "description": "spectragraph-transforms.tests.tools.network.reconcrawl", + "peekOfCode": "tool = ReconCrawlTool()\ndef test_name():\n assert tool.name() == \"reconcrawl\"\ndef test_description():\n assert (\n tool.description()\n == \"Emails and phone numbers crawler from websites by analyzing their HTML and embedded scripts.\"\n )\ndef test_category():\n assert tool.category() == \"Crawler\"", + "detail": "spectragraph-transforms.tests.tools.network.reconcrawl", + "documentation": {} + }, + { + "label": "test_name", + "kind": 2, + "importPath": "spectragraph-transforms.tests.tools.network.subfinder", + "description": "spectragraph-transforms.tests.tools.network.subfinder", + "peekOfCode": "def test_name():\n assert tool.name() == \"subfinder\"\ndef test_description():\n assert tool.description() == \"Fast passive subdomain enumeration tool.\"\ndef test_category():\n assert tool.category() == \"Subdomain enumeration\"\ndef test_image():\n assert tool.get_image() == \"projectdiscovery/subfinder\"\ndef test_install():\n tool.install()", + "detail": "spectragraph-transforms.tests.tools.network.subfinder", + "documentation": {} + }, + { + "label": "test_description", + "kind": 2, + "importPath": "spectragraph-transforms.tests.tools.network.subfinder", + "description": "spectragraph-transforms.tests.tools.network.subfinder", + "peekOfCode": "def test_description():\n assert tool.description() == \"Fast passive subdomain enumeration tool.\"\ndef test_category():\n assert tool.category() == \"Subdomain enumeration\"\ndef test_image():\n assert tool.get_image() == \"projectdiscovery/subfinder\"\ndef test_install():\n tool.install()\n assert tool.is_installed() == True\ndef test_version():", + "detail": "spectragraph-transforms.tests.tools.network.subfinder", + "documentation": {} + }, + { + "label": "test_category", + "kind": 2, + "importPath": "spectragraph-transforms.tests.tools.network.subfinder", + "description": "spectragraph-transforms.tests.tools.network.subfinder", + "peekOfCode": "def test_category():\n assert tool.category() == \"Subdomain enumeration\"\ndef test_image():\n assert tool.get_image() == \"projectdiscovery/subfinder\"\ndef test_install():\n tool.install()\n assert tool.is_installed() == True\ndef test_version():\n tool.install()\n version = tool.version()", + "detail": "spectragraph-transforms.tests.tools.network.subfinder", + "documentation": {} + }, + { + "label": "test_image", + "kind": 2, + "importPath": "spectragraph-transforms.tests.tools.network.subfinder", + "description": "spectragraph-transforms.tests.tools.network.subfinder", + "peekOfCode": "def test_image():\n assert tool.get_image() == \"projectdiscovery/subfinder\"\ndef test_install():\n tool.install()\n assert tool.is_installed() == True\ndef test_version():\n tool.install()\n version = tool.version()\n # Check that version follows the expected format: v followed by digits and dots\n assert re.match(r\"^v[\\d\\.]+$\", version)", + "detail": "spectragraph-transforms.tests.tools.network.subfinder", + "documentation": {} + }, + { + "label": "test_install", + "kind": 2, + "importPath": "spectragraph-transforms.tests.tools.network.subfinder", + "description": "spectragraph-transforms.tests.tools.network.subfinder", + "peekOfCode": "def test_install():\n tool.install()\n assert tool.is_installed() == True\ndef test_version():\n tool.install()\n version = tool.version()\n # Check that version follows the expected format: v followed by digits and dots\n assert re.match(r\"^v[\\d\\.]+$\", version)\ndef test_launch():\n results = tool.launch(\"alliage.io\")", + "detail": "spectragraph-transforms.tests.tools.network.subfinder", + "documentation": {} + }, + { + "label": "test_version", + "kind": 2, + "importPath": "spectragraph-transforms.tests.tools.network.subfinder", + "description": "spectragraph-transforms.tests.tools.network.subfinder", + "peekOfCode": "def test_version():\n tool.install()\n version = tool.version()\n # Check that version follows the expected format: v followed by digits and dots\n assert re.match(r\"^v[\\d\\.]+$\", version)\ndef test_launch():\n results = tool.launch(\"alliage.io\")\n assert isinstance(results, list)\n assert all(isinstance(item, str) for item in results)", + "detail": "spectragraph-transforms.tests.tools.network.subfinder", + "documentation": {} + }, + { + "label": "test_launch", + "kind": 2, + "importPath": "spectragraph-transforms.tests.tools.network.subfinder", + "description": "spectragraph-transforms.tests.tools.network.subfinder", + "peekOfCode": "def test_launch():\n results = tool.launch(\"alliage.io\")\n assert isinstance(results, list)\n assert all(isinstance(item, str) for item in results)", + "detail": "spectragraph-transforms.tests.tools.network.subfinder", + "documentation": {} + }, + { + "label": "tool", + "kind": 5, + "importPath": "spectragraph-transforms.tests.tools.network.subfinder", + "description": "spectragraph-transforms.tests.tools.network.subfinder", + "peekOfCode": "tool = SubfinderTool()\ndef test_name():\n assert tool.name() == \"subfinder\"\ndef test_description():\n assert tool.description() == \"Fast passive subdomain enumeration tool.\"\ndef test_category():\n assert tool.category() == \"Subdomain enumeration\"\ndef test_image():\n assert tool.get_image() == \"projectdiscovery/subfinder\"\ndef test_install():", + "detail": "spectragraph-transforms.tests.tools.network.subfinder", + "documentation": {} + }, + { + "label": "test_name", + "kind": 2, + "importPath": "spectragraph-transforms.tests.tools.network.whoxy", + "description": "spectragraph-transforms.tests.tools.network.whoxy", + "peekOfCode": "def test_name():\n assert tool.name() == \"whoxy\"\ndef test_description():\n assert (\n tool.description()\n == \"The WHOIS API returns consistent and well-structured WHOIS data in XML & JSON format. Returned data contain parsed WHOIS fields that can be easily understood. Along with WHOIS API, Whoxy also offer WHOIS History API and Reverse WHOIS API.\"\n )\ndef test_category():\n assert tool.category() == \"Network intelligence\"", + "detail": "spectragraph-transforms.tests.tools.network.whoxy", + "documentation": {} + }, + { + "label": "test_description", + "kind": 2, + "importPath": "spectragraph-transforms.tests.tools.network.whoxy", + "description": "spectragraph-transforms.tests.tools.network.whoxy", + "peekOfCode": "def test_description():\n assert (\n tool.description()\n == \"The WHOIS API returns consistent and well-structured WHOIS data in XML & JSON format. Returned data contain parsed WHOIS fields that can be easily understood. Along with WHOIS API, Whoxy also offer WHOIS History API and Reverse WHOIS API.\"\n )\ndef test_category():\n assert tool.category() == \"Network intelligence\"", + "detail": "spectragraph-transforms.tests.tools.network.whoxy", + "documentation": {} + }, + { + "label": "test_category", + "kind": 2, + "importPath": "spectragraph-transforms.tests.tools.network.whoxy", + "description": "spectragraph-transforms.tests.tools.network.whoxy", + "peekOfCode": "def test_category():\n assert tool.category() == \"Network intelligence\"", + "detail": "spectragraph-transforms.tests.tools.network.whoxy", + "documentation": {} + }, + { + "label": "tool", + "kind": 5, + "importPath": "spectragraph-transforms.tests.tools.network.whoxy", + "description": "spectragraph-transforms.tests.tools.network.whoxy", + "peekOfCode": "tool = WhoxyTool()\ndef test_name():\n assert tool.name() == \"whoxy\"\ndef test_description():\n assert (\n tool.description()\n == \"The WHOIS API returns consistent and well-structured WHOIS data in XML & JSON format. Returned data contain parsed WHOIS fields that can be easily understood. Along with WHOIS API, Whoxy also offer WHOIS History API and Reverse WHOIS API.\"\n )\ndef test_category():\n assert tool.category() == \"Network intelligence\"", + "detail": "spectragraph-transforms.tests.tools.network.whoxy", + "documentation": {} + }, + { + "label": "test_name", + "kind": 2, + "importPath": "spectragraph-transforms.tests.tools.organizations.sirene", + "description": "spectragraph-transforms.tests.tools.organizations.sirene", + "peekOfCode": "def test_name():\n assert tool.name() == \"sirene\"\ndef test_description():\n assert (\n tool.description()\n == \"The Sirene API allows you to query the Sirene directory of businesses and establishments, managed by Insee.\"\n )\ndef test_category():\n assert tool.category() == \"Business intelligence\"\ndef test_launch_org():", + "detail": "spectragraph-transforms.tests.tools.organizations.sirene", + "documentation": {} + }, + { + "label": "test_description", + "kind": 2, + "importPath": "spectragraph-transforms.tests.tools.organizations.sirene", + "description": "spectragraph-transforms.tests.tools.organizations.sirene", + "peekOfCode": "def test_description():\n assert (\n tool.description()\n == \"The Sirene API allows you to query the Sirene directory of businesses and establishments, managed by Insee.\"\n )\ndef test_category():\n assert tool.category() == \"Business intelligence\"\ndef test_launch_org():\n results = tool.launch(\"blablacar\", 1)\n assert isinstance(results, list)", + "detail": "spectragraph-transforms.tests.tools.organizations.sirene", + "documentation": {} + }, + { + "label": "test_category", + "kind": 2, + "importPath": "spectragraph-transforms.tests.tools.organizations.sirene", + "description": "spectragraph-transforms.tests.tools.organizations.sirene", + "peekOfCode": "def test_category():\n assert tool.category() == \"Business intelligence\"\ndef test_launch_org():\n results = tool.launch(\"blablacar\", 1)\n assert isinstance(results, list)\n assert all(isinstance(item, Dict) for item in results)\ndef test_launch_person():\n results = tool.launch(\"Karim+Terrache\", 1)\n assert isinstance(results, list)\n assert all(isinstance(item, Dict) for item in results)", + "detail": "spectragraph-transforms.tests.tools.organizations.sirene", + "documentation": {} + }, + { + "label": "test_launch_org", + "kind": 2, + "importPath": "spectragraph-transforms.tests.tools.organizations.sirene", + "description": "spectragraph-transforms.tests.tools.organizations.sirene", + "peekOfCode": "def test_launch_org():\n results = tool.launch(\"blablacar\", 1)\n assert isinstance(results, list)\n assert all(isinstance(item, Dict) for item in results)\ndef test_launch_person():\n results = tool.launch(\"Karim+Terrache\", 1)\n assert isinstance(results, list)\n assert all(isinstance(item, Dict) for item in results)\ndef test_launch_person_space_format():\n results = tool.launch(\"Karim Terrache\", 1)", + "detail": "spectragraph-transforms.tests.tools.organizations.sirene", + "documentation": {} + }, + { + "label": "test_launch_person", + "kind": 2, + "importPath": "spectragraph-transforms.tests.tools.organizations.sirene", + "description": "spectragraph-transforms.tests.tools.organizations.sirene", + "peekOfCode": "def test_launch_person():\n results = tool.launch(\"Karim+Terrache\", 1)\n assert isinstance(results, list)\n assert all(isinstance(item, Dict) for item in results)\ndef test_launch_person_space_format():\n results = tool.launch(\"Karim Terrache\", 1)\n assert isinstance(results, list)\n assert all(isinstance(item, Dict) for item in results)", + "detail": "spectragraph-transforms.tests.tools.organizations.sirene", + "documentation": {} + }, + { + "label": "test_launch_person_space_format", + "kind": 2, + "importPath": "spectragraph-transforms.tests.tools.organizations.sirene", + "description": "spectragraph-transforms.tests.tools.organizations.sirene", + "peekOfCode": "def test_launch_person_space_format():\n results = tool.launch(\"Karim Terrache\", 1)\n assert isinstance(results, list)\n assert all(isinstance(item, Dict) for item in results)", + "detail": "spectragraph-transforms.tests.tools.organizations.sirene", + "documentation": {} + }, + { + "label": "tool", + "kind": 5, + "importPath": "spectragraph-transforms.tests.tools.organizations.sirene", + "description": "spectragraph-transforms.tests.tools.organizations.sirene", + "peekOfCode": "tool = SireneTool()\ndef test_name():\n assert tool.name() == \"sirene\"\ndef test_description():\n assert (\n tool.description()\n == \"The Sirene API allows you to query the Sirene directory of businesses and establishments, managed by Insee.\"\n )\ndef test_category():\n assert tool.category() == \"Business intelligence\"", + "detail": "spectragraph-transforms.tests.tools.organizations.sirene", + "documentation": {} + }, + { + "label": "test_wallet_address_to_transactions_name", + "kind": 2, + "importPath": "spectragraph-transforms.tests.transforms.crypto.wallet_to_nfts", + "description": "spectragraph-transforms.tests.transforms.crypto.wallet_to_nfts", + "peekOfCode": "def test_wallet_address_to_transactions_name():\n assert transform.name() == \"wallet_to_nfts\"\ndef test_wallet_address_to_transactions_category():\n assert transform.category() == \"crypto\"\ndef test_wallet_address_to_transactions_key():\n assert transform.key() == \"address\"\ndef test_preprocess_with_string():\n input_data = [\"0x742d35Cc6634C0532925a3b844Bc454e4438f44e\"]\n result = transform.preprocess(input_data)\n assert len(result) == 1", + "detail": "spectragraph-transforms.tests.transforms.crypto.wallet_to_nfts", + "documentation": {} + }, + { + "label": "test_wallet_address_to_transactions_category", + "kind": 2, + "importPath": "spectragraph-transforms.tests.transforms.crypto.wallet_to_nfts", + "description": "spectragraph-transforms.tests.transforms.crypto.wallet_to_nfts", + "peekOfCode": "def test_wallet_address_to_transactions_category():\n assert transform.category() == \"crypto\"\ndef test_wallet_address_to_transactions_key():\n assert transform.key() == \"address\"\ndef test_preprocess_with_string():\n input_data = [\"0x742d35Cc6634C0532925a3b844Bc454e4438f44e\"]\n result = transform.preprocess(input_data)\n assert len(result) == 1\n assert isinstance(result[0], CryptoWallet)\n assert result[0].address == \"0x742d35Cc6634C0532925a3b844Bc454e4438f44e\"", + "detail": "spectragraph-transforms.tests.transforms.crypto.wallet_to_nfts", + "documentation": {} + }, + { + "label": "test_wallet_address_to_transactions_key", + "kind": 2, + "importPath": "spectragraph-transforms.tests.transforms.crypto.wallet_to_nfts", + "description": "spectragraph-transforms.tests.transforms.crypto.wallet_to_nfts", + "peekOfCode": "def test_wallet_address_to_transactions_key():\n assert transform.key() == \"address\"\ndef test_preprocess_with_string():\n input_data = [\"0x742d35Cc6634C0532925a3b844Bc454e4438f44e\"]\n result = transform.preprocess(input_data)\n assert len(result) == 1\n assert isinstance(result[0], CryptoWallet)\n assert result[0].address == \"0x742d35Cc6634C0532925a3b844Bc454e4438f44e\"\ndef test_preprocess_with_dict():\n input_data = [{\"address\": \"0x742d35Cc6634C0532925a3b844Bc454e4438f44e\"}]", + "detail": "spectragraph-transforms.tests.transforms.crypto.wallet_to_nfts", + "documentation": {} + }, + { + "label": "test_preprocess_with_string", + "kind": 2, + "importPath": "spectragraph-transforms.tests.transforms.crypto.wallet_to_nfts", + "description": "spectragraph-transforms.tests.transforms.crypto.wallet_to_nfts", + "peekOfCode": "def test_preprocess_with_string():\n input_data = [\"0x742d35Cc6634C0532925a3b844Bc454e4438f44e\"]\n result = transform.preprocess(input_data)\n assert len(result) == 1\n assert isinstance(result[0], CryptoWallet)\n assert result[0].address == \"0x742d35Cc6634C0532925a3b844Bc454e4438f44e\"\ndef test_preprocess_with_dict():\n input_data = [{\"address\": \"0x742d35Cc6634C0532925a3b844Bc454e4438f44e\"}]\n result = transform.preprocess(input_data)\n assert len(result) == 1", + "detail": "spectragraph-transforms.tests.transforms.crypto.wallet_to_nfts", + "documentation": {} + }, + { + "label": "test_preprocess_with_dict", + "kind": 2, + "importPath": "spectragraph-transforms.tests.transforms.crypto.wallet_to_nfts", + "description": "spectragraph-transforms.tests.transforms.crypto.wallet_to_nfts", + "peekOfCode": "def test_preprocess_with_dict():\n input_data = [{\"address\": \"0x742d35Cc6634C0532925a3b844Bc454e4438f44e\"}]\n result = transform.preprocess(input_data)\n assert len(result) == 1\n assert isinstance(result[0], CryptoWallet)\n assert result[0].address == \"0x742d35Cc6634C0532925a3b844Bc454e4438f44e\"\ndef test_preprocess_with_wallet_object():\n wallet = CryptoWallet(address=\"0x742d35Cc6634C0532925a3b844Bc454e4438f44e\")\n input_data = [wallet]\n result = transform.preprocess(input_data)", + "detail": "spectragraph-transforms.tests.transforms.crypto.wallet_to_nfts", + "documentation": {} + }, + { + "label": "test_preprocess_with_wallet_object", + "kind": 2, + "importPath": "spectragraph-transforms.tests.transforms.crypto.wallet_to_nfts", + "description": "spectragraph-transforms.tests.transforms.crypto.wallet_to_nfts", + "peekOfCode": "def test_preprocess_with_wallet_object():\n wallet = CryptoWallet(address=\"0x742d35Cc6634C0532925a3b844Bc454e4438f44e\")\n input_data = [wallet]\n result = transform.preprocess(input_data)\n assert len(result) == 1\n assert isinstance(result[0], CryptoWallet)\n assert result[0].address == \"0x742d35Cc6634C0532925a3b844Bc454e4438f44e\"\ndef test_scan_mocked_transactions(monkeypatch):\n # Mock the _get_transactions method\n def mock_get_nfts(address):", + "detail": "spectragraph-transforms.tests.transforms.crypto.wallet_to_nfts", + "documentation": {} + }, + { + "label": "test_scan_mocked_transactions", + "kind": 2, + "importPath": "spectragraph-transforms.tests.transforms.crypto.wallet_to_nfts", + "description": "spectragraph-transforms.tests.transforms.crypto.wallet_to_nfts", + "peekOfCode": "def test_scan_mocked_transactions(monkeypatch):\n # Mock the _get_transactions method\n def mock_get_nfts(address):\n return [\n CryptoNFT(\n wallet=CryptoWallet(\n address=\"0x742d35Cc6634C0532925a3b844Bc454e4438f44e\"\n ),\n contract_address=\"0x123\",\n token_id=\"1\",", + "detail": "spectragraph-transforms.tests.transforms.crypto.wallet_to_nfts", + "documentation": {} + }, + { + "label": "transform", + "kind": 5, + "importPath": "spectragraph-transforms.tests.transforms.crypto.wallet_to_nfts", + "description": "spectragraph-transforms.tests.transforms.crypto.wallet_to_nfts", + "peekOfCode": "transform = CryptoWalletAddressToNFTs(\"sketch_123\", \"scan_123\")\ndef test_wallet_address_to_transactions_name():\n assert transform.name() == \"wallet_to_nfts\"\ndef test_wallet_address_to_transactions_category():\n assert transform.category() == \"crypto\"\ndef test_wallet_address_to_transactions_key():\n assert transform.key() == \"address\"\ndef test_preprocess_with_string():\n input_data = [\"0x742d35Cc6634C0532925a3b844Bc454e4438f44e\"]\n result = transform.preprocess(input_data)", + "detail": "spectragraph-transforms.tests.transforms.crypto.wallet_to_nfts", + "documentation": {} + }, + { + "label": "test_wallet_address_to_transactions_name", + "kind": 2, + "importPath": "spectragraph-transforms.tests.transforms.crypto.wallet_to_transactions", + "description": "spectragraph-transforms.tests.transforms.crypto.wallet_to_transactions", + "peekOfCode": "def test_wallet_address_to_transactions_name():\n assert transform.name() == \"wallet_to_transactions\"\ndef test_wallet_address_to_transactions_category():\n assert transform.category() == \"CryptoCryptoWallet\"\ndef test_wallet_address_to_transactions_key():\n assert transform.key() == \"address\"\ndef test_preprocess_with_string():\n input_data = [\"0x742d35Cc6634C0532925a3b844Bc454e4438f44e\"]\n result = transform.preprocess(input_data)\n assert len(result) == 1", + "detail": "spectragraph-transforms.tests.transforms.crypto.wallet_to_transactions", + "documentation": {} + }, + { + "label": "test_wallet_address_to_transactions_category", + "kind": 2, + "importPath": "spectragraph-transforms.tests.transforms.crypto.wallet_to_transactions", + "description": "spectragraph-transforms.tests.transforms.crypto.wallet_to_transactions", + "peekOfCode": "def test_wallet_address_to_transactions_category():\n assert transform.category() == \"CryptoCryptoWallet\"\ndef test_wallet_address_to_transactions_key():\n assert transform.key() == \"address\"\ndef test_preprocess_with_string():\n input_data = [\"0x742d35Cc6634C0532925a3b844Bc454e4438f44e\"]\n result = transform.preprocess(input_data)\n assert len(result) == 1\n assert isinstance(result[0], CryptoWallet)\n assert result[0].address == \"0x742d35Cc6634C0532925a3b844Bc454e4438f44e\"", + "detail": "spectragraph-transforms.tests.transforms.crypto.wallet_to_transactions", + "documentation": {} + }, + { + "label": "test_wallet_address_to_transactions_key", + "kind": 2, + "importPath": "spectragraph-transforms.tests.transforms.crypto.wallet_to_transactions", + "description": "spectragraph-transforms.tests.transforms.crypto.wallet_to_transactions", + "peekOfCode": "def test_wallet_address_to_transactions_key():\n assert transform.key() == \"address\"\ndef test_preprocess_with_string():\n input_data = [\"0x742d35Cc6634C0532925a3b844Bc454e4438f44e\"]\n result = transform.preprocess(input_data)\n assert len(result) == 1\n assert isinstance(result[0], CryptoWallet)\n assert result[0].address == \"0x742d35Cc6634C0532925a3b844Bc454e4438f44e\"\ndef test_preprocess_with_dict():\n input_data = [{\"address\": \"0x742d35Cc6634C0532925a3b844Bc454e4438f44e\"}]", + "detail": "spectragraph-transforms.tests.transforms.crypto.wallet_to_transactions", + "documentation": {} + }, + { + "label": "test_preprocess_with_string", + "kind": 2, + "importPath": "spectragraph-transforms.tests.transforms.crypto.wallet_to_transactions", + "description": "spectragraph-transforms.tests.transforms.crypto.wallet_to_transactions", + "peekOfCode": "def test_preprocess_with_string():\n input_data = [\"0x742d35Cc6634C0532925a3b844Bc454e4438f44e\"]\n result = transform.preprocess(input_data)\n assert len(result) == 1\n assert isinstance(result[0], CryptoWallet)\n assert result[0].address == \"0x742d35Cc6634C0532925a3b844Bc454e4438f44e\"\ndef test_preprocess_with_dict():\n input_data = [{\"address\": \"0x742d35Cc6634C0532925a3b844Bc454e4438f44e\"}]\n result = transform.preprocess(input_data)\n assert len(result) == 1", + "detail": "spectragraph-transforms.tests.transforms.crypto.wallet_to_transactions", + "documentation": {} + }, + { + "label": "test_preprocess_with_dict", + "kind": 2, + "importPath": "spectragraph-transforms.tests.transforms.crypto.wallet_to_transactions", + "description": "spectragraph-transforms.tests.transforms.crypto.wallet_to_transactions", + "peekOfCode": "def test_preprocess_with_dict():\n input_data = [{\"address\": \"0x742d35Cc6634C0532925a3b844Bc454e4438f44e\"}]\n result = transform.preprocess(input_data)\n assert len(result) == 1\n assert isinstance(result[0], CryptoWallet)\n assert result[0].address == \"0x742d35Cc6634C0532925a3b844Bc454e4438f44e\"\ndef test_preprocess_with_wallet_object():\n wallet = CryptoWallet(address=\"0x742d35Cc6634C0532925a3b844Bc454e4438f44e\")\n input_data = [wallet]\n result = transform.preprocess(input_data)", + "detail": "spectragraph-transforms.tests.transforms.crypto.wallet_to_transactions", + "documentation": {} + }, + { + "label": "test_preprocess_with_wallet_object", + "kind": 2, + "importPath": "spectragraph-transforms.tests.transforms.crypto.wallet_to_transactions", + "description": "spectragraph-transforms.tests.transforms.crypto.wallet_to_transactions", + "peekOfCode": "def test_preprocess_with_wallet_object():\n wallet = CryptoWallet(address=\"0x742d35Cc6634C0532925a3b844Bc454e4438f44e\")\n input_data = [wallet]\n result = transform.preprocess(input_data)\n assert len(result) == 1\n assert isinstance(result[0], CryptoWallet)\n assert result[0].address == \"0x742d35Cc6634C0532925a3b844Bc454e4438f44e\"\n@pytest.mark.asyncio\nasync def test_scan_mocked_transactions(monkeypatch):\n # Mock the _get_transactions method - note it takes address and api_key parameters", + "detail": "spectragraph-transforms.tests.transforms.crypto.wallet_to_transactions", + "documentation": {} + }, + { + "label": "test_transform_requires_api_key", + "kind": 2, + "importPath": "spectragraph-transforms.tests.transforms.crypto.wallet_to_transactions", + "description": "spectragraph-transforms.tests.transforms.crypto.wallet_to_transactions", + "peekOfCode": "def test_transform_requires_api_key():\n \"\"\"Test that the transform validates required ETHERSCAN_API_KEY parameter at construction\"\"\"\n with pytest.raises(\n ValueError, match=\"Transform wallet_to_transactions received invalid params\"\n ):\n CryptoWalletAddressToTransactions(\"sketch_123\", \"scan_123\", params={})\ndef test_transform_with_invalid_api_key_type():\n \"\"\"Test that the transform validates parameter types\"\"\"\n with pytest.raises(\n ValueError, match=\"Transform wallet_to_transactions received invalid params\"", + "detail": "spectragraph-transforms.tests.transforms.crypto.wallet_to_transactions", + "documentation": {} + }, + { + "label": "test_transform_with_invalid_api_key_type", + "kind": 2, + "importPath": "spectragraph-transforms.tests.transforms.crypto.wallet_to_transactions", + "description": "spectragraph-transforms.tests.transforms.crypto.wallet_to_transactions", + "peekOfCode": "def test_transform_with_invalid_api_key_type():\n \"\"\"Test that the transform validates parameter types\"\"\"\n with pytest.raises(\n ValueError, match=\"Transform wallet_to_transactions received invalid params\"\n ):\n CryptoWalletAddressToTransactions(\n \"sketch_123\", \"scan_123\", params={\"ETHERSCAN_API_KEY\": 123}\n )", + "detail": "spectragraph-transforms.tests.transforms.crypto.wallet_to_transactions", + "documentation": {} + }, + { + "label": "transform", + "kind": 5, + "importPath": "spectragraph-transforms.tests.transforms.crypto.wallet_to_transactions", + "description": "spectragraph-transforms.tests.transforms.crypto.wallet_to_transactions", + "peekOfCode": "transform = CryptoWalletAddressToTransactions(\n \"sketch_123\",\n \"scan_123\",\n params={\"ETHERSCAN_API_KEY\": \"ta-clef-api\"},\n)\ndef test_wallet_address_to_transactions_name():\n assert transform.name() == \"wallet_to_transactions\"\ndef test_wallet_address_to_transactions_category():\n assert transform.category() == \"CryptoCryptoWallet\"\ndef test_wallet_address_to_transactions_key():", + "detail": "spectragraph-transforms.tests.transforms.crypto.wallet_to_transactions", + "documentation": {} + }, + { + "label": "TestResolveInputOutputTypes", + "kind": 6, + "importPath": "spectragraph-transforms.tests.transforms.domain.resolve", + "description": "spectragraph-transforms.tests.transforms.domain.resolve", + "peekOfCode": "class TestResolveInputOutputTypes:\n \"\"\"Test the InputType/OutputType functionality for ResolveTransform\"\"\"\n def test_input_output_types_are_defined(self):\n \"\"\"Test that InputType and OutputType are properly defined\"\"\"\n assert hasattr(ResolveTransform, \"InputType\")\n assert hasattr(ResolveTransform, \"OutputType\")\n assert ResolveTransform.InputType == List[Domain]\n assert ResolveTransform.OutputType == List[Ip]\n def test_schemas_use_generate_methods(self):\n \"\"\"Test that schema methods use the new generate methods\"\"\"", + "detail": "spectragraph-transforms.tests.transforms.domain.resolve", + "documentation": {} + }, + { + "label": "test_preprocess_valid_domains", + "kind": 2, + "importPath": "spectragraph-transforms.tests.transforms.domain.resolve", + "description": "spectragraph-transforms.tests.transforms.domain.resolve", + "peekOfCode": "def test_preprocess_valid_domains():\n domains = [\n Domain(domain=\"example.com\"),\n Domain(domain=\"example2.com\"),\n ]\n result = transform.preprocess(domains)\n result_domains = [d.domain for d in result]\n expected_domains = [d.domain for d in domains]\n assert result_domains == expected_domains\ndef test_unprocessed_valid_domains():", + "detail": "spectragraph-transforms.tests.transforms.domain.resolve", + "documentation": {} + }, + { + "label": "test_unprocessed_valid_domains", + "kind": 2, + "importPath": "spectragraph-transforms.tests.transforms.domain.resolve", + "description": "spectragraph-transforms.tests.transforms.domain.resolve", + "peekOfCode": "def test_unprocessed_valid_domains():\n domains = [\n \"example.com\",\n \"example2.com\",\n ]\n result = transform.preprocess(domains)\n result_domains = [d for d in result]\n expected_domains = [Domain(domain=d) for d in domains]\n assert result_domains == expected_domains\ndef test_preprocess_invalid_domains():", + "detail": "spectragraph-transforms.tests.transforms.domain.resolve", + "documentation": {} + }, + { + "label": "test_preprocess_invalid_domains", + "kind": 2, + "importPath": "spectragraph-transforms.tests.transforms.domain.resolve", + "description": "spectragraph-transforms.tests.transforms.domain.resolve", + "peekOfCode": "def test_preprocess_invalid_domains():\n domains = [\n Domain(domain=\"example.com\"),\n Domain(domain=\"invalid_domain\"),\n Domain(domain=\"example.org\"),\n ]\n result = transform.preprocess(domains)\n result_domains = [d.domain for d in result]\n assert \"example.com\" in result_domains\n assert \"example.org\" in result_domains", + "detail": "spectragraph-transforms.tests.transforms.domain.resolve", + "documentation": {} + }, + { + "label": "test_preprocess_multiple_formats", + "kind": 2, + "importPath": "spectragraph-transforms.tests.transforms.domain.resolve", + "description": "spectragraph-transforms.tests.transforms.domain.resolve", + "peekOfCode": "def test_preprocess_multiple_formats():\n domains = [\n {\"domain\": \"example.com\"},\n {\"invalid_key\": \"example.io\"},\n Domain(domain=\"example.org\"),\n \"example.org\",\n ]\n result = transform.preprocess(domains)\n result_domains = [d.domain for d in result]\n assert \"example.com\" in result_domains", + "detail": "spectragraph-transforms.tests.transforms.domain.resolve", + "documentation": {} + }, + { + "label": "test_schemas", + "kind": 2, + "importPath": "spectragraph-transforms.tests.transforms.domain.resolve", + "description": "spectragraph-transforms.tests.transforms.domain.resolve", + "peekOfCode": "def test_schemas():\n input_schema = transform.input_schema()\n output_schema = transform.output_schema()\n # Test the structure and key properties rather than exact match\n assert input_schema[\"type\"] == \"Domain\"\n assert isinstance(input_schema[\"properties\"], list)\n input_property_names = [prop[\"name\"] for prop in input_schema[\"properties\"]]\n assert \"domain\" in input_property_names\n assert output_schema[\"type\"] == \"Ip\"\n assert isinstance(output_schema[\"properties\"], list)", + "detail": "spectragraph-transforms.tests.transforms.domain.resolve", + "documentation": {} + }, + { + "label": "transform", + "kind": 5, + "importPath": "spectragraph-transforms.tests.transforms.domain.resolve", + "description": "spectragraph-transforms.tests.transforms.domain.resolve", + "peekOfCode": "transform = ResolveTransform(\"sketch_123\", \"scan_123\")\ndef test_preprocess_valid_domains():\n domains = [\n Domain(domain=\"example.com\"),\n Domain(domain=\"example2.com\"),\n ]\n result = transform.preprocess(domains)\n result_domains = [d.domain for d in result]\n expected_domains = [d.domain for d in domains]\n assert result_domains == expected_domains", + "detail": "spectragraph-transforms.tests.transforms.domain.resolve", + "documentation": {} + }, + { + "label": "test_preprocess_valid_domains", + "kind": 2, + "importPath": "spectragraph-transforms.tests.transforms.domain.subdomains", + "description": "spectragraph-transforms.tests.transforms.domain.subdomains", + "peekOfCode": "def test_preprocess_valid_domains():\n domains = [\n Domain(domain=\"example.com\"),\n Domain(domain=\"example2.com\"),\n ]\n result = transform.preprocess(domains)\n result_domains = [d.domain for d in result]\n expected_domains = [d.domain for d in domains]\n assert result_domains == expected_domains\ndef test_unprocessed_valid_domains():", + "detail": "spectragraph-transforms.tests.transforms.domain.subdomains", + "documentation": {} + }, + { + "label": "test_unprocessed_valid_domains", + "kind": 2, + "importPath": "spectragraph-transforms.tests.transforms.domain.subdomains", + "description": "spectragraph-transforms.tests.transforms.domain.subdomains", + "peekOfCode": "def test_unprocessed_valid_domains():\n domains = [\n \"example.com\",\n \"example2.com\",\n ]\n result = transform.preprocess(domains)\n result_domains = [d for d in result]\n expected_domains = [Domain(domain=d) for d in domains]\n assert result_domains == expected_domains\ndef test_preprocess_invalid_domains():", + "detail": "spectragraph-transforms.tests.transforms.domain.subdomains", + "documentation": {} + }, + { + "label": "test_preprocess_invalid_domains", + "kind": 2, + "importPath": "spectragraph-transforms.tests.transforms.domain.subdomains", + "description": "spectragraph-transforms.tests.transforms.domain.subdomains", + "peekOfCode": "def test_preprocess_invalid_domains():\n domains = [\n Domain(domain=\"example.com\"),\n Domain(domain=\"invalid_domain\"),\n Domain(domain=\"example.org\"),\n ]\n result = transform.preprocess(domains)\n result_domains = [d.domain for d in result]\n assert \"example.com\" in result_domains\n assert \"example.org\" in result_domains", + "detail": "spectragraph-transforms.tests.transforms.domain.subdomains", + "documentation": {} + }, + { + "label": "test_preprocess_multiple_formats", + "kind": 2, + "importPath": "spectragraph-transforms.tests.transforms.domain.subdomains", + "description": "spectragraph-transforms.tests.transforms.domain.subdomains", + "peekOfCode": "def test_preprocess_multiple_formats():\n domains = [\n {\"domain\": \"example.com\"},\n {\"invalid_key\": \"example.io\"},\n Domain(domain=\"example.org\"),\n \"example.org\",\n ]\n result = transform.preprocess(domains)\n result_domains = [d.domain for d in result]\n assert \"example.com\" in result_domains", + "detail": "spectragraph-transforms.tests.transforms.domain.subdomains", + "documentation": {} + }, + { + "label": "test_scan_extracts_subdomains", + "kind": 2, + "importPath": "spectragraph-transforms.tests.transforms.domain.subdomains", + "description": "spectragraph-transforms.tests.transforms.domain.subdomains", + "peekOfCode": "def test_scan_extracts_subdomains(monkeypatch):\n mock_response = [\n {\"name_value\": \"mail.example.com\\nwww.example.com\"},\n {\"name_value\": \"api.example.com\"},\n {\"name_value\": \"invalid_domain\"}, # devrait être ignoré\n ]\n class MockRequestsResponse:\n def __init__(self, json_data):\n self._json_data = json_data\n self.status_code = 200", + "detail": "spectragraph-transforms.tests.transforms.domain.subdomains", + "documentation": {} + }, + { + "label": "transform", + "kind": 5, + "importPath": "spectragraph-transforms.tests.transforms.domain.subdomains", + "description": "spectragraph-transforms.tests.transforms.domain.subdomains", + "peekOfCode": "transform = SubdomainTransform(\"sketch_123\", \"scan_123\")\ndef test_preprocess_valid_domains():\n domains = [\n Domain(domain=\"example.com\"),\n Domain(domain=\"example2.com\"),\n ]\n result = transform.preprocess(domains)\n result_domains = [d.domain for d in result]\n expected_domains = [d.domain for d in domains]\n assert result_domains == expected_domains", + "detail": "spectragraph-transforms.tests.transforms.domain.subdomains", + "documentation": {} + }, + { + "label": "MockNeo4jConn", + "kind": 6, + "importPath": "spectragraph-transforms.tests.transforms.domain.to_history", + "description": "spectragraph-transforms.tests.transforms.domain.to_history", + "peekOfCode": "class MockNeo4jConn:\n def __init__(self):\n self.nodes_created = []\n self.relationships_created = []\n def create_node(self, label, key, value, **kwargs):\n node_info = {\"label\": label, \"key\": key, \"value\": value, **kwargs}\n self.nodes_created.append(node_info)\n def create_relationship(\n self,\n from_label,", + "detail": "spectragraph-transforms.tests.transforms.domain.to_history", + "documentation": {} + }, + { + "label": "MockTransform", + "kind": 6, + "importPath": "spectragraph-transforms.tests.transforms.domain.to_history", + "description": "spectragraph-transforms.tests.transforms.domain.to_history", + "peekOfCode": "class MockTransform(DomainToHistoryTransform):\n def __init__(self):\n self.sketch_id = \"test_sketch_123\"\n self.neo4j_conn = MockNeo4jConn()\n self._extracted_data = []\n self._extracted_individuals = []\n def log_graph_message(self, message):\n \"\"\"Mock log_graph_message method.\"\"\"\n pass\n@pytest.fixture", + "detail": "spectragraph-transforms.tests.transforms.domain.to_history", + "documentation": {} + }, + { + "label": "transform", + "kind": 2, + "importPath": "spectragraph-transforms.tests.transforms.domain.to_history", + "description": "spectragraph-transforms.tests.transforms.domain.to_history", + "peekOfCode": "def transform():\n \"\"\"Create a transform instance for testing.\"\"\"\n transform = MockTransform()\n return transform\n@pytest.fixture\ndef test_data():\n \"\"\"Load test data from data.json.\"\"\"\n current_dir = os.path.dirname(os.path.abspath(__file__))\n data_file = os.path.join(current_dir, \"..\", \"..\", \"test_data\", \"data.json\")\n with open(data_file, \"r\") as f:", + "detail": "spectragraph-transforms.tests.transforms.domain.to_history", + "documentation": {} + }, + { + "label": "test_data", + "kind": 2, + "importPath": "spectragraph-transforms.tests.transforms.domain.to_history", + "description": "spectragraph-transforms.tests.transforms.domain.to_history", + "peekOfCode": "def test_data():\n \"\"\"Load test data from data.json.\"\"\"\n current_dir = os.path.dirname(os.path.abspath(__file__))\n data_file = os.path.join(current_dir, \"..\", \"..\", \"test_data\", \"data.json\")\n with open(data_file, \"r\") as f:\n return json.load(f)\ndef test_preprocess_valid_domains(transform):\n \"\"\"Test preprocessing with valid domains.\"\"\"\n domains = [\n Domain(domain=\"example.com\"),", + "detail": "spectragraph-transforms.tests.transforms.domain.to_history", + "documentation": {} + }, + { + "label": "test_preprocess_valid_domains", + "kind": 2, + "importPath": "spectragraph-transforms.tests.transforms.domain.to_history", + "description": "spectragraph-transforms.tests.transforms.domain.to_history", + "peekOfCode": "def test_preprocess_valid_domains(transform):\n \"\"\"Test preprocessing with valid domains.\"\"\"\n domains = [\n Domain(domain=\"example.com\"),\n Domain(domain=\"example2.com\"),\n ]\n result = transform.preprocess(domains)\n result_domains = [d.domain for d in result]\n expected_domains = [d.domain for d in domains]\n assert result_domains == expected_domains", + "detail": "spectragraph-transforms.tests.transforms.domain.to_history", + "documentation": {} + }, + { + "label": "test_preprocess_string_domains", + "kind": 2, + "importPath": "spectragraph-transforms.tests.transforms.domain.to_history", + "description": "spectragraph-transforms.tests.transforms.domain.to_history", + "peekOfCode": "def test_preprocess_string_domains(transform):\n \"\"\"Test preprocessing with string domains.\"\"\"\n domains = [\"example.com\", \"example2.com\"]\n result = transform.preprocess(domains)\n assert len(result) == 2\n assert all(isinstance(d, Domain) for d in result)\n assert result[0].domain == \"example.com\"\n assert result[1].domain == \"example2.com\"\ndef test_preprocess_dict_domains(transform):\n \"\"\"Test preprocessing with dict domains.\"\"\"", + "detail": "spectragraph-transforms.tests.transforms.domain.to_history", + "documentation": {} + }, + { + "label": "test_preprocess_dict_domains", + "kind": 2, + "importPath": "spectragraph-transforms.tests.transforms.domain.to_history", + "description": "spectragraph-transforms.tests.transforms.domain.to_history", + "peekOfCode": "def test_preprocess_dict_domains(transform):\n \"\"\"Test preprocessing with dict domains.\"\"\"\n domains = [{\"domain\": \"example.com\"}, {\"domain\": \"example2.com\"}]\n result = transform.preprocess(domains)\n assert len(result) == 2\n assert all(isinstance(d, Domain) for d in result)\n assert result[0].domain == \"example.com\"\n assert result[1].domain == \"example2.com\"\ndef test_preprocess_invalid_domains(transform):\n \"\"\"Test preprocessing with invalid domains.\"\"\"", + "detail": "spectragraph-transforms.tests.transforms.domain.to_history", + "documentation": {} + }, + { + "label": "test_preprocess_invalid_domains", + "kind": 2, + "importPath": "spectragraph-transforms.tests.transforms.domain.to_history", + "description": "spectragraph-transforms.tests.transforms.domain.to_history", + "peekOfCode": "def test_preprocess_invalid_domains(transform):\n \"\"\"Test preprocessing with invalid domains.\"\"\"\n domains = [\n Domain(domain=\"example.com\"),\n Domain(domain=\"invalid_domain\"),\n Domain(domain=\"example.org\"),\n ]\n result = transform.preprocess(domains)\n result_domains = [d.domain for d in result]\n assert \"example.com\" in result_domains", + "detail": "spectragraph-transforms.tests.transforms.domain.to_history", + "documentation": {} + }, + { + "label": "test_is_redacted", + "kind": 2, + "importPath": "spectragraph-transforms.tests.transforms.domain.to_history", + "description": "spectragraph-transforms.tests.transforms.domain.to_history", + "peekOfCode": "def test_is_redacted(transform):\n \"\"\"Test the __is_redacted method.\"\"\"\n # Should be redacted\n assert transform._DomainToHistoryTransform__is_redacted(\"REDACTED FOR PRIVACY\")\n assert transform._DomainToHistoryTransform__is_redacted(\"redacted for privacy\")\n assert transform._DomainToHistoryTransform__is_redacted(\"Some text with PRIVACY in it\")\n # Should NOT be redacted\n assert not transform._DomainToHistoryTransform__is_redacted(\"JOHN DOE\")\n assert not transform._DomainToHistoryTransform__is_redacted(\"john@doe.com\")\n assert not transform._DomainToHistoryTransform__is_redacted(\"123 JOHN STREET\")", + "detail": "spectragraph-transforms.tests.transforms.domain.to_history", + "documentation": {} + }, + { + "label": "test_has_non_redacted_info", + "kind": 2, + "importPath": "spectragraph-transforms.tests.transforms.domain.to_history", + "description": "spectragraph-transforms.tests.transforms.domain.to_history", + "peekOfCode": "def test_has_non_redacted_info(transform):\n \"\"\"Test the __has_non_redacted_info method.\"\"\"\n # Contact with valid information\n valid_contact = {\n \"full_name\": \"JOHN DOE\",\n \"email_address\": \"john@doe.com, martinemah@yahoo.com\",\n \"phone_number\": \"+123456789\",\n \"mailing_address\": \"123 JOHN STREET\",\n \"city_name\": \"DOE CITY\",\n \"zip_code\": \"12345\",", + "detail": "spectragraph-transforms.tests.transforms.domain.to_history", + "documentation": {} + }, + { + "label": "test_extract_individual_from_contact", + "kind": 2, + "importPath": "spectragraph-transforms.tests.transforms.domain.to_history", + "description": "spectragraph-transforms.tests.transforms.domain.to_history", + "peekOfCode": "def test_extract_individual_from_contact(transform):\n \"\"\"Test the __extract_individual_from_contact method.\"\"\"\n # Valid contact\n valid_contact = {\n \"full_name\": \"JOHN DOE\",\n \"email_address\": \"john@doe.com, martinemah@yahoo.com\",\n \"phone_number\": \"+123456789\",\n \"mailing_address\": \"123 JOHN STREET\",\n \"city_name\": \"DOE CITY\",\n \"zip_code\": \"12345\",", + "detail": "spectragraph-transforms.tests.transforms.domain.to_history", + "documentation": {} + }, + { + "label": "test_extract_individual_redacted_name", + "kind": 2, + "importPath": "spectragraph-transforms.tests.transforms.domain.to_history", + "description": "spectragraph-transforms.tests.transforms.domain.to_history", + "peekOfCode": "def test_extract_individual_redacted_name(transform):\n \"\"\"Test that individuals with redacted names are skipped.\"\"\"\n redacted_contact = {\n \"full_name\": \"REDACTED FOR PRIVACY\",\n \"email_address\": \"test@example.com\",\n \"phone_number\": \"+1234567890\",\n }\n individual = transform._DomainToHistoryTransform__extract_individual_from_contact(\n redacted_contact, \"REGISTRANT\"\n )", + "detail": "spectragraph-transforms.tests.transforms.domain.to_history", + "documentation": {} + }, + { + "label": "test_is_valid_email", + "kind": 2, + "importPath": "spectragraph-transforms.tests.transforms.domain.to_history", + "description": "spectragraph-transforms.tests.transforms.domain.to_history", + "peekOfCode": "def test_is_valid_email(transform):\n \"\"\"Test the __is_valid_email method.\"\"\"\n # Valid emails\n assert transform._DomainToHistoryTransform__is_valid_email(\"test@example.com\")\n assert transform._DomainToHistoryTransform__is_valid_email(\"user.name@domain.org\")\n assert transform._DomainToHistoryTransform__is_valid_email(\"user+tag@example.co.uk\")\n # Invalid emails\n assert not transform._DomainToHistoryTransform__is_valid_email(\"invalid-email\")\n assert not transform._DomainToHistoryTransform__is_valid_email(\"@example.com\")\n assert not transform._DomainToHistoryTransform__is_valid_email(\"test@\")", + "detail": "spectragraph-transforms.tests.transforms.domain.to_history", + "documentation": {} + }, + { + "label": "test_extract_physical_address", + "kind": 2, + "importPath": "spectragraph-transforms.tests.transforms.domain.to_history", + "description": "spectragraph-transforms.tests.transforms.domain.to_history", + "peekOfCode": "def test_extract_physical_address(transform):\n \"\"\"Test the __extract_physical_address method.\"\"\"\n # Valid address\n valid_contact = {\n \"mailing_address\": \"123 JOHN STREET\",\n \"city_name\": \"DOE CITY\",\n \"zip_code\": \"12345\",\n \"country_name\": \"United States\",\n }\n address = transform._DomainToHistoryTransform__extract_physical_address(valid_contact)", + "detail": "spectragraph-transforms.tests.transforms.domain.to_history", + "documentation": {} + }, + { + "label": "test_postprocess_creates_nodes_and_relationships", + "kind": 2, + "importPath": "spectragraph-transforms.tests.transforms.domain.to_history", + "description": "spectragraph-transforms.tests.transforms.domain.to_history", + "peekOfCode": "def test_postprocess_creates_nodes_and_relationships(transform, test_data, monkeypatch):\n \"\"\"Test that postprocess creates the expected nodes and relationships.\"\"\"\n # Mock the __get_infos_from_whoxy method\n def mock_get_infos(domain):\n if domain == \"epios.com\":\n return test_data\n return {}\n monkeypatch.setattr(\n transform, \"_DomainToHistoryTransform__get_infos_from_whoxy\", mock_get_infos\n )", + "detail": "spectragraph-transforms.tests.transforms.domain.to_history", + "documentation": {} + }, + { + "label": "test_schemas", + "kind": 2, + "importPath": "spectragraph-transforms.tests.transforms.domain.to_history", + "description": "spectragraph-transforms.tests.transforms.domain.to_history", + "peekOfCode": "def test_schemas(transform):\n \"\"\"Test that the transform has the expected schemas.\"\"\"\n input_schema = transform.input_schema()\n output_schema = transform.output_schema()\n assert input_schema is not None\n assert output_schema is not None", + "detail": "spectragraph-transforms.tests.transforms.domain.to_history", + "documentation": {} + }, + { + "label": "test_preprocess_valid_domains", + "kind": 2, + "importPath": "spectragraph-transforms.tests.transforms.domain.whois", + "description": "spectragraph-transforms.tests.transforms.domain.whois", + "peekOfCode": "def test_preprocess_valid_domains():\n domains = [\n Domain(domain=\"example.com\"),\n Domain(domain=\"example2.com\"),\n ]\n result = transform.preprocess(domains)\n result_domains = [d.domain for d in result]\n expected_domains = [d.domain for d in domains]\n assert result_domains == expected_domains\ndef test_unprocessed_valid_domains():", + "detail": "spectragraph-transforms.tests.transforms.domain.whois", + "documentation": {} + }, + { + "label": "test_unprocessed_valid_domains", + "kind": 2, + "importPath": "spectragraph-transforms.tests.transforms.domain.whois", + "description": "spectragraph-transforms.tests.transforms.domain.whois", + "peekOfCode": "def test_unprocessed_valid_domains():\n domains = [\n \"example.com\",\n \"example2.com\",\n ]\n result = transform.preprocess(domains)\n result_domains = [d for d in result]\n expected_domains = [Domain(domain=d) for d in domains]\n assert result_domains == expected_domains\ndef test_preprocess_invalid_domains():", + "detail": "spectragraph-transforms.tests.transforms.domain.whois", + "documentation": {} + }, + { + "label": "test_preprocess_invalid_domains", + "kind": 2, + "importPath": "spectragraph-transforms.tests.transforms.domain.whois", + "description": "spectragraph-transforms.tests.transforms.domain.whois", + "peekOfCode": "def test_preprocess_invalid_domains():\n domains = [\n Domain(domain=\"example.com\"),\n Domain(domain=\"invalid_domain\"),\n Domain(domain=\"example.org\"),\n ]\n result = transform.preprocess(domains)\n result_domains = [d.domain for d in result]\n assert \"example.com\" in result_domains\n assert \"example.org\" in result_domains", + "detail": "spectragraph-transforms.tests.transforms.domain.whois", + "documentation": {} + }, + { + "label": "test_preprocess_multiple_formats", + "kind": 2, + "importPath": "spectragraph-transforms.tests.transforms.domain.whois", + "description": "spectragraph-transforms.tests.transforms.domain.whois", + "peekOfCode": "def test_preprocess_multiple_formats():\n domains = [\n {\"domain\": \"example.com\"},\n {\"invalid_key\": \"example.io\"},\n Domain(domain=\"example.org\"),\n \"example.org\",\n ]\n result = transform.preprocess(domains)\n result_domains = [d.domain for d in result]\n assert \"example.com\" in result_domains", + "detail": "spectragraph-transforms.tests.transforms.domain.whois", + "documentation": {} + }, + { + "label": "test_scan_returns_whois_objects", + "kind": 2, + "importPath": "spectragraph-transforms.tests.transforms.domain.whois", + "description": "spectragraph-transforms.tests.transforms.domain.whois", + "peekOfCode": "def test_scan_returns_whois_objects(monkeypatch):\n # Patch `whois.whois` to avoid real network call\n mock_whois = lambda domain: {\n \"registrar\": \"MockRegistrar\",\n \"org\": \"MockOrg\",\n \"city\": \"MockCity\",\n \"country\": \"MockCountry\",\n \"emails\": [\"admin@example.com\"],\n \"creation_date\": \"2020-01-01\",\n \"expiration_date\": \"2030-01-01\",", + "detail": "spectragraph-transforms.tests.transforms.domain.whois", + "documentation": {} + }, + { + "label": "test_schemas", + "kind": 2, + "importPath": "spectragraph-transforms.tests.transforms.domain.whois", + "description": "spectragraph-transforms.tests.transforms.domain.whois", + "peekOfCode": "def test_schemas():\n input_schema = transform.input_schema()\n output_schema = transform.output_schema()\n assert input_schema == {\n \"type\": \"Domain\",\n \"properties\": [\n {\"name\": \"domain\", \"type\": \"string\"},\n {\"name\": \"subdomains\", \"type\": \"array | null\"},\n {\"name\": \"ips\", \"type\": \"array | null\"},\n {\"name\": \"whois\", \"type\": \"Whois | null\"},", + "detail": "spectragraph-transforms.tests.transforms.domain.whois", + "documentation": {} + }, + { + "label": "transform", + "kind": 5, + "importPath": "spectragraph-transforms.tests.transforms.domain.whois", + "description": "spectragraph-transforms.tests.transforms.domain.whois", + "peekOfCode": "transform = WhoisTransform(\"sketch_123\", \"scan_123\")\ndef test_preprocess_valid_domains():\n domains = [\n Domain(domain=\"example.com\"),\n Domain(domain=\"example2.com\"),\n ]\n result = transform.preprocess(domains)\n result_domains = [d.domain for d in result]\n expected_domains = [d.domain for d in domains]\n assert result_domains == expected_domains", + "detail": "spectragraph-transforms.tests.transforms.domain.whois", + "documentation": {} + }, + { + "label": "TestEmailToGravatarTransform", + "kind": 6, + "importPath": "spectragraph-transforms.tests.transforms.email.to_gravatar", + "description": "spectragraph-transforms.tests.transforms.email.to_gravatar", + "peekOfCode": "class TestEmailToGravatarTransform:\n \"\"\"Test suite for EmailToGravatarTransform\"\"\"\n def test_name(self):\n \"\"\"Test the transform name\"\"\"\n assert EmailToGravatarTransform.name() == \"to_gravatar\"\n def test_category(self):\n \"\"\"Test the transform category\"\"\"\n assert EmailToGravatarTransform.category() == \"Email\"\n def test_key(self):\n \"\"\"Test the transform key\"\"\"", + "detail": "spectragraph-transforms.tests.transforms.email.to_gravatar", + "documentation": {} + }, + { + "label": "transform", + "kind": 5, + "importPath": "spectragraph-transforms.tests.transforms.email.to_gravatar", + "description": "spectragraph-transforms.tests.transforms.email.to_gravatar", + "peekOfCode": "transform = EmailToGravatarTransform(\"sketch_123\", \"scan_123\")\nclass TestEmailToGravatarTransform:\n \"\"\"Test suite for EmailToGravatarTransform\"\"\"\n def test_name(self):\n \"\"\"Test the transform name\"\"\"\n assert EmailToGravatarTransform.name() == \"to_gravatar\"\n def test_category(self):\n \"\"\"Test the transform category\"\"\"\n assert EmailToGravatarTransform.category() == \"Email\"\n def test_key(self):", + "detail": "spectragraph-transforms.tests.transforms.email.to_gravatar", + "documentation": {} + }, + { + "label": "test_transform_name", + "kind": 2, + "importPath": "spectragraph-transforms.tests.transforms.email.to_leaks", + "description": "spectragraph-transforms.tests.transforms.email.to_leaks", + "peekOfCode": "def test_transform_name():\n assert EmailToBreachesTransform.name() == \"to_leaks\"\ndef test_transform_category():\n assert EmailToBreachesTransform.category() == \"Email\"\ndef test_transform_key():\n assert EmailToBreachesTransform.key() == \"email\"\ndef test_preprocess_string_emails():\n emails = [\n \"test@example.com\",\n \"user@domain.org\",", + "detail": "spectragraph-transforms.tests.transforms.email.to_leaks", + "documentation": {} + }, + { + "label": "test_transform_category", + "kind": 2, + "importPath": "spectragraph-transforms.tests.transforms.email.to_leaks", + "description": "spectragraph-transforms.tests.transforms.email.to_leaks", + "peekOfCode": "def test_transform_category():\n assert EmailToBreachesTransform.category() == \"Email\"\ndef test_transform_key():\n assert EmailToBreachesTransform.key() == \"email\"\ndef test_preprocess_string_emails():\n emails = [\n \"test@example.com\",\n \"user@domain.org\",\n ]\n result = transform.preprocess(emails)", + "detail": "spectragraph-transforms.tests.transforms.email.to_leaks", + "documentation": {} + }, + { + "label": "test_transform_key", + "kind": 2, + "importPath": "spectragraph-transforms.tests.transforms.email.to_leaks", + "description": "spectragraph-transforms.tests.transforms.email.to_leaks", + "peekOfCode": "def test_transform_key():\n assert EmailToBreachesTransform.key() == \"email\"\ndef test_preprocess_string_emails():\n emails = [\n \"test@example.com\",\n \"user@domain.org\",\n ]\n result = transform.preprocess(emails)\n expected_emails = [Email(email=email) for email in emails]\n assert result == expected_emails", + "detail": "spectragraph-transforms.tests.transforms.email.to_leaks", + "documentation": {} + }, + { + "label": "test_preprocess_string_emails", + "kind": 2, + "importPath": "spectragraph-transforms.tests.transforms.email.to_leaks", + "description": "spectragraph-transforms.tests.transforms.email.to_leaks", + "peekOfCode": "def test_preprocess_string_emails():\n emails = [\n \"test@example.com\",\n \"user@domain.org\",\n ]\n result = transform.preprocess(emails)\n expected_emails = [Email(email=email) for email in emails]\n assert result == expected_emails\ndef test_preprocess_dict_emails():\n emails = [", + "detail": "spectragraph-transforms.tests.transforms.email.to_leaks", + "documentation": {} + }, + { + "label": "test_preprocess_dict_emails", + "kind": 2, + "importPath": "spectragraph-transforms.tests.transforms.email.to_leaks", + "description": "spectragraph-transforms.tests.transforms.email.to_leaks", + "peekOfCode": "def test_preprocess_dict_emails():\n emails = [\n {\"email\": \"test@example.com\"},\n {\"email\": \"user@domain.org\"},\n ]\n result = transform.preprocess(emails)\n expected_emails = [Email(email=email[\"email\"]) for email in emails]\n assert result == expected_emails\ndef test_preprocess_email_objects():\n emails = [", + "detail": "spectragraph-transforms.tests.transforms.email.to_leaks", + "documentation": {} + }, + { + "label": "test_preprocess_email_objects", + "kind": 2, + "importPath": "spectragraph-transforms.tests.transforms.email.to_leaks", + "description": "spectragraph-transforms.tests.transforms.email.to_leaks", + "peekOfCode": "def test_preprocess_email_objects():\n emails = [\n Email(email=\"test@example.com\"),\n Email(email=\"user@domain.org\"),\n ]\n result = transform.preprocess(emails)\n assert result == emails\ndef test_preprocess_mixed_formats():\n emails = [\n \"test@example.com\",", + "detail": "spectragraph-transforms.tests.transforms.email.to_leaks", + "documentation": {} + }, + { + "label": "test_preprocess_mixed_formats", + "kind": 2, + "importPath": "spectragraph-transforms.tests.transforms.email.to_leaks", + "description": "spectragraph-transforms.tests.transforms.email.to_leaks", + "peekOfCode": "def test_preprocess_mixed_formats():\n emails = [\n \"test@example.com\",\n {\"email\": \"user@domain.org\"},\n Email(email=\"admin@company.com\"),\n {\"invalid_key\": \"should_be_ignored@test.com\"},\n ]\n result = transform.preprocess(emails)\n result_emails = [email.email for email in result]\n assert \"test@example.com\" in result_emails", + "detail": "spectragraph-transforms.tests.transforms.email.to_leaks", + "documentation": {} + }, + { + "label": "test_scan_successful_response", + "kind": 2, + "importPath": "spectragraph-transforms.tests.transforms.email.to_leaks", + "description": "spectragraph-transforms.tests.transforms.email.to_leaks", + "peekOfCode": "def test_scan_successful_response(mock_get):\n # Mock successful API response\n mock_response = MagicMock()\n mock_response.status_code = 200\n mock_response.json.return_value = [\n {\"Name\": \"TestBreach\", \"Title\": \"Test Breach\", \"Domain\": \"test.com\"},\n {\"Name\": \"AnotherBreach\", \"Title\": \"Another Breach\", \"Domain\": \"another.com\"},\n ]\n mock_get.return_value = mock_response\n emails = [Email(email=\"test@example.com\")]", + "detail": "spectragraph-transforms.tests.transforms.email.to_leaks", + "documentation": {} + }, + { + "label": "test_scan_no_breaches_found", + "kind": 2, + "importPath": "spectragraph-transforms.tests.transforms.email.to_leaks", + "description": "spectragraph-transforms.tests.transforms.email.to_leaks", + "peekOfCode": "def test_scan_no_breaches_found(mock_get):\n # Mock 404 response (no breaches found)\n mock_response = MagicMock()\n mock_response.status_code = 404\n mock_get.return_value = mock_response\n emails = [Email(email=\"test@example.com\")]\n result = transform.scan(emails)\n assert len(result) == 0\n@patch(\"src.transforms.emails.to_leaks.requests.get\")\ndef test_scan_api_error(mock_get):", + "detail": "spectragraph-transforms.tests.transforms.email.to_leaks", + "documentation": {} + }, + { + "label": "test_scan_api_error", + "kind": 2, + "importPath": "spectragraph-transforms.tests.transforms.email.to_leaks", + "description": "spectragraph-transforms.tests.transforms.email.to_leaks", + "peekOfCode": "def test_scan_api_error(mock_get):\n # Mock API error\n mock_get.side_effect = Exception(\"API Error\")\n emails = [Email(email=\"test@example.com\")]\n result = transform.scan(emails)\n assert len(result) == 0\n@patch(\"src.transforms.emails.to_leaks.requests.get\")\ndef test_scan_missing_name_field(mock_get):\n # Mock API response with missing \"Name\" field\n mock_response = MagicMock()", + "detail": "spectragraph-transforms.tests.transforms.email.to_leaks", + "documentation": {} + }, + { + "label": "test_scan_missing_name_field", + "kind": 2, + "importPath": "spectragraph-transforms.tests.transforms.email.to_leaks", + "description": "spectragraph-transforms.tests.transforms.email.to_leaks", + "peekOfCode": "def test_scan_missing_name_field(mock_get):\n # Mock API response with missing \"Name\" field\n mock_response = MagicMock()\n mock_response.status_code = 200\n mock_response.json.return_value = [\n {\"Title\": \"Test Breach\", \"Domain\": \"test.com\"}, # Missing \"Name\" field\n {\"Name\": \"ValidBreach\", \"Title\": \"Valid Breach\", \"Domain\": \"valid.com\"},\n ]\n mock_get.return_value = mock_response\n emails = [Email(email=\"test@example.com\")]", + "detail": "spectragraph-transforms.tests.transforms.email.to_leaks", + "documentation": {} + }, + { + "label": "test_scan_no_api_key", + "kind": 2, + "importPath": "spectragraph-transforms.tests.transforms.email.to_leaks", + "description": "spectragraph-transforms.tests.transforms.email.to_leaks", + "peekOfCode": "def test_scan_no_api_key():\n \"\"\"Test that transform raises ValueError when HIBP_API_KEY is not set.\"\"\"\n emails = [Email(email=\"test@example.com\")]\n with pytest.raises(ValueError, match=\"HIBP_API_KEY not set\"):\n transform.scan(emails)\ndef test_postprocess():\n # Test postprocess method with mocked neo4j connection\n transform.neo4j_conn = MagicMock()\n # Create breach objects with the new structure\n breach1 = Breach(", + "detail": "spectragraph-transforms.tests.transforms.email.to_leaks", + "documentation": {} + }, + { + "label": "test_postprocess", + "kind": 2, + "importPath": "spectragraph-transforms.tests.transforms.email.to_leaks", + "description": "spectragraph-transforms.tests.transforms.email.to_leaks", + "peekOfCode": "def test_postprocess():\n # Test postprocess method with mocked neo4j connection\n transform.neo4j_conn = MagicMock()\n # Create breach objects with the new structure\n breach1 = Breach(\n name=\"testbreach\",\n title=\"Test Breach\",\n domain=\"test.com\",\n pwncount=1000,\n breach={\"name\": \"testbreach\", \"title\": \"Test Breach\"},", + "detail": "spectragraph-transforms.tests.transforms.email.to_leaks", + "documentation": {} + }, + { + "label": "transform", + "kind": 5, + "importPath": "spectragraph-transforms.tests.transforms.email.to_leaks", + "description": "spectragraph-transforms.tests.transforms.email.to_leaks", + "peekOfCode": "transform = EmailToBreachesTransform(\"sketch_123\", \"scan_123\")\ndef test_transform_name():\n assert EmailToBreachesTransform.name() == \"to_leaks\"\ndef test_transform_category():\n assert EmailToBreachesTransform.category() == \"Email\"\ndef test_transform_key():\n assert EmailToBreachesTransform.key() == \"email\"\ndef test_preprocess_string_emails():\n emails = [\n \"test@example.com\",", + "detail": "spectragraph-transforms.tests.transforms.email.to_leaks", + "documentation": {} + }, + { + "label": "test_preprocess_valid_asns", + "kind": 2, + "importPath": "spectragraph-transforms.tests.transforms.ip.asn_to_cidrs", + "description": "spectragraph-transforms.tests.transforms.ip.asn_to_cidrs", + "peekOfCode": "def test_preprocess_valid_asns():\n asns = [\n ASN(number=15169),\n ASN(number=13335),\n ]\n result = transform.preprocess(asns)\n result_numbers = [asn.number for asn in result]\n expected_numbers = [asn.number for asn in asns]\n assert result_numbers == expected_numbers\ndef test_unprocessed_valid_asns():", + "detail": "spectragraph-transforms.tests.transforms.ip.asn_to_cidrs", + "documentation": {} + }, + { + "label": "test_unprocessed_valid_asns", + "kind": 2, + "importPath": "spectragraph-transforms.tests.transforms.ip.asn_to_cidrs", + "description": "spectragraph-transforms.tests.transforms.ip.asn_to_cidrs", + "peekOfCode": "def test_unprocessed_valid_asns():\n asns = [\n \"15169\",\n \"13335\",\n ]\n result = transform.preprocess(asns)\n result_asns = [asn for asn in result]\n expected_asns = [ASN(number=int(asn)) for asn in asns]\n assert result_asns == expected_asns\ndef test_preprocess_invalid_asns():", + "detail": "spectragraph-transforms.tests.transforms.ip.asn_to_cidrs", + "documentation": {} + }, + { + "label": "test_preprocess_invalid_asns", + "kind": 2, + "importPath": "spectragraph-transforms.tests.transforms.ip.asn_to_cidrs", + "description": "spectragraph-transforms.tests.transforms.ip.asn_to_cidrs", + "peekOfCode": "def test_preprocess_invalid_asns():\n asns = [\n ASN(number=15169),\n ASN(number=999999999999), # Invalid ASN number\n ASN(number=13335),\n ]\n result = transform.preprocess(asns)\n result_numbers = [asn.number for asn in result]\n assert 15169 in result_numbers\n assert 13335 in result_numbers", + "detail": "spectragraph-transforms.tests.transforms.ip.asn_to_cidrs", + "documentation": {} + }, + { + "label": "test_preprocess_multiple_formats", + "kind": 2, + "importPath": "spectragraph-transforms.tests.transforms.ip.asn_to_cidrs", + "description": "spectragraph-transforms.tests.transforms.ip.asn_to_cidrs", + "peekOfCode": "def test_preprocess_multiple_formats():\n asns = [\n {\"number\": 15169},\n {\"invalid_key\": 13335},\n ASN(number=13335),\n \"15169\",\n ]\n result = transform.preprocess(asns)\n result_numbers = [asn.number for asn in result]\n assert 15169 in result_numbers", + "detail": "spectragraph-transforms.tests.transforms.ip.asn_to_cidrs", + "documentation": {} + }, + { + "label": "test_schemas", + "kind": 2, + "importPath": "spectragraph-transforms.tests.transforms.ip.asn_to_cidrs", + "description": "spectragraph-transforms.tests.transforms.ip.asn_to_cidrs", + "peekOfCode": "def test_schemas():\n input_schema = transform.input_schema()\n output_schema = transform.output_schema()\n # Input schema should have number field\n assert \"properties\" in input_schema\n number_prop = next(\n (prop for prop in input_schema[\"properties\"] if prop[\"name\"] == \"number\"), None\n )\n assert number_prop is not None\n assert number_prop[\"type\"] == \"integer\"", + "detail": "spectragraph-transforms.tests.transforms.ip.asn_to_cidrs", + "documentation": {} + }, + { + "label": "transform", + "kind": 5, + "importPath": "spectragraph-transforms.tests.transforms.ip.asn_to_cidrs", + "description": "spectragraph-transforms.tests.transforms.ip.asn_to_cidrs", + "peekOfCode": "transform = AsnToCidrsTransform(\"sketch_123\", \"scan_123\")\ndef test_preprocess_valid_asns():\n asns = [\n ASN(number=15169),\n ASN(number=13335),\n ]\n result = transform.preprocess(asns)\n result_numbers = [asn.number for asn in result]\n expected_numbers = [asn.number for asn in asns]\n assert result_numbers == expected_numbers", + "detail": "spectragraph-transforms.tests.transforms.ip.asn_to_cidrs", + "documentation": {} + }, + { + "label": "test_preprocess_valid_cidrs", + "kind": 2, + "importPath": "spectragraph-transforms.tests.transforms.ip.cidr_to_ips", + "description": "spectragraph-transforms.tests.transforms.ip.cidr_to_ips", + "peekOfCode": "def test_preprocess_valid_cidrs():\n cidrs = [\n CIDR(network=\"8.8.8.0/24\"),\n CIDR(network=\"1.1.1.0/24\"),\n ]\n result = transform.preprocess(cidrs)\n result_networks = [cidr.network for cidr in result]\n expected_networks = [cidr.network for cidr in cidrs]\n assert result_networks == expected_networks\ndef test_preprocess_unprocessed_valid_cidrs():", + "detail": "spectragraph-transforms.tests.transforms.ip.cidr_to_ips", + "documentation": {} + }, + { + "label": "test_preprocess_unprocessed_valid_cidrs", + "kind": 2, + "importPath": "spectragraph-transforms.tests.transforms.ip.cidr_to_ips", + "description": "spectragraph-transforms.tests.transforms.ip.cidr_to_ips", + "peekOfCode": "def test_preprocess_unprocessed_valid_cidrs():\n cidrs = [\n \"8.8.8.0/24\",\n \"1.1.1.0/24\",\n ]\n result = transform.preprocess(cidrs)\n result_cidrs = [c for c in result]\n expected_cidrs = [CIDR(network=c) for c in cidrs]\n assert result_cidrs == expected_cidrs\ndef test_preprocess_invalid_cidrs():", + "detail": "spectragraph-transforms.tests.transforms.ip.cidr_to_ips", + "documentation": {} + }, + { + "label": "test_preprocess_invalid_cidrs", + "kind": 2, + "importPath": "spectragraph-transforms.tests.transforms.ip.cidr_to_ips", + "description": "spectragraph-transforms.tests.transforms.ip.cidr_to_ips", + "peekOfCode": "def test_preprocess_invalid_cidrs():\n cidrs = [\n CIDR(network=\"8.8.8.0/24\"),\n \"invalid-cidr\",\n \"not-a-cidr\",\n ]\n result = transform.preprocess(cidrs)\n result_networks = [str(cidr.network) for cidr in result]\n assert \"8.8.8.0/24\" in result_networks\n assert \"invalid-cidr\" not in result_networks", + "detail": "spectragraph-transforms.tests.transforms.ip.cidr_to_ips", + "documentation": {} + }, + { + "label": "test_preprocess_multiple_formats", + "kind": 2, + "importPath": "spectragraph-transforms.tests.transforms.ip.cidr_to_ips", + "description": "spectragraph-transforms.tests.transforms.ip.cidr_to_ips", + "peekOfCode": "def test_preprocess_multiple_formats():\n cidrs = [\n {\"network\": \"8.8.8.0/24\"},\n {\"invalid_key\": \"1.1.1.0/24\"},\n CIDR(network=\"9.9.9.0/24\"),\n \"InvalidCIDR\",\n ]\n result = transform.preprocess(cidrs)\n result_networks = [str(cidr.network) for cidr in result]\n assert \"8.8.8.0/24\" in result_networks", + "detail": "spectragraph-transforms.tests.transforms.ip.cidr_to_ips", + "documentation": {} + }, + { + "label": "test_scan_extracts_ips", + "kind": 2, + "importPath": "spectragraph-transforms.tests.transforms.ip.cidr_to_ips", + "description": "spectragraph-transforms.tests.transforms.ip.cidr_to_ips", + "peekOfCode": "def test_scan_extracts_ips(monkeypatch):\n mock_dnsx_output = \"\"\"8.35.200.12\n8.35.200.112\n8.35.200.16\n8.35.200.170\"\"\"\n class MockSubprocessResult:\n def __init__(self, stdout):\n self.stdout = stdout\n self.returncode = 0\n def mock_subprocess_run(cmd, shell, capture_output, text, timeout):", + "detail": "spectragraph-transforms.tests.transforms.ip.cidr_to_ips", + "documentation": {} + }, + { + "label": "test_scan_handles_empty_output", + "kind": 2, + "importPath": "spectragraph-transforms.tests.transforms.ip.cidr_to_ips", + "description": "spectragraph-transforms.tests.transforms.ip.cidr_to_ips", + "peekOfCode": "def test_scan_handles_empty_output(monkeypatch):\n class MockSubprocessResult:\n def __init__(self):\n self.stdout = \"\"\n self.returncode = 0\n def mock_subprocess_run(cmd, shell, capture_output, text, timeout):\n return MockSubprocessResult()\n monkeypatch.setattr(\"subprocess.run\", mock_subprocess_run)\n input_data = [CIDR(network=\"8.8.8.0/24\")]\n ips = transform.scan(input_data)", + "detail": "spectragraph-transforms.tests.transforms.ip.cidr_to_ips", + "documentation": {} + }, + { + "label": "test_scan_handles_subprocess_exception", + "kind": 2, + "importPath": "spectragraph-transforms.tests.transforms.ip.cidr_to_ips", + "description": "spectragraph-transforms.tests.transforms.ip.cidr_to_ips", + "peekOfCode": "def test_scan_handles_subprocess_exception(monkeypatch):\n def mock_subprocess_run(cmd, shell, capture_output, text, timeout):\n raise Exception(\"Subprocess failed\")\n monkeypatch.setattr(\"subprocess.run\", mock_subprocess_run)\n input_data = [CIDR(network=\"8.8.8.0/24\")]\n ips = transform.scan(input_data)\n assert isinstance(ips, list)\n assert len(ips) == 0", + "detail": "spectragraph-transforms.tests.transforms.ip.cidr_to_ips", + "documentation": {} + }, + { + "label": "logger", + "kind": 5, + "importPath": "spectragraph-transforms.tests.transforms.ip.cidr_to_ips", + "description": "spectragraph-transforms.tests.transforms.ip.cidr_to_ips", + "peekOfCode": "logger = TestLogger()\ntransform = CidrToIpsTransform(\"sketch_123\", \"scan_123\", logger)\ndef test_preprocess_valid_cidrs():\n cidrs = [\n CIDR(network=\"8.8.8.0/24\"),\n CIDR(network=\"1.1.1.0/24\"),\n ]\n result = transform.preprocess(cidrs)\n result_networks = [cidr.network for cidr in result]\n expected_networks = [cidr.network for cidr in cidrs]", + "detail": "spectragraph-transforms.tests.transforms.ip.cidr_to_ips", + "documentation": {} + }, + { + "label": "transform", + "kind": 5, + "importPath": "spectragraph-transforms.tests.transforms.ip.cidr_to_ips", + "description": "spectragraph-transforms.tests.transforms.ip.cidr_to_ips", + "peekOfCode": "transform = CidrToIpsTransform(\"sketch_123\", \"scan_123\", logger)\ndef test_preprocess_valid_cidrs():\n cidrs = [\n CIDR(network=\"8.8.8.0/24\"),\n CIDR(network=\"1.1.1.0/24\"),\n ]\n result = transform.preprocess(cidrs)\n result_networks = [cidr.network for cidr in result]\n expected_networks = [cidr.network for cidr in cidrs]\n assert result_networks == expected_networks", + "detail": "spectragraph-transforms.tests.transforms.ip.cidr_to_ips", + "documentation": {} + }, + { + "label": "test_preprocess_valid_ips", + "kind": 2, + "importPath": "spectragraph-transforms.tests.transforms.ip.ip_to_asn", + "description": "spectragraph-transforms.tests.transforms.ip.ip_to_asn", + "peekOfCode": "def test_preprocess_valid_ips():\n ips = [\n Ip(address=\"8.8.8.8\"),\n Ip(address=\"1.1.1.1\"),\n ]\n result = transform.preprocess(ips)\n result_addresses = [ip.address for ip in result]\n expected_addresses = [ip.address for ip in ips]\n assert result_addresses == expected_addresses\ndef test_unprocessed_valid_ips():", + "detail": "spectragraph-transforms.tests.transforms.ip.ip_to_asn", + "documentation": {} + }, + { + "label": "test_unprocessed_valid_ips", + "kind": 2, + "importPath": "spectragraph-transforms.tests.transforms.ip.ip_to_asn", + "description": "spectragraph-transforms.tests.transforms.ip.ip_to_asn", + "peekOfCode": "def test_unprocessed_valid_ips():\n ips = [\n \"8.8.8.8\",\n \"1.1.1.1\",\n ]\n result = transform.preprocess(ips)\n result_ips = [ip for ip in result]\n expected_ips = [Ip(address=ip) for ip in ips]\n assert result_ips == expected_ips\ndef test_preprocess_invalid_ips():", + "detail": "spectragraph-transforms.tests.transforms.ip.ip_to_asn", + "documentation": {} + }, + { + "label": "test_preprocess_invalid_ips", + "kind": 2, + "importPath": "spectragraph-transforms.tests.transforms.ip.ip_to_asn", + "description": "spectragraph-transforms.tests.transforms.ip.ip_to_asn", + "peekOfCode": "def test_preprocess_invalid_ips():\n ips = [\n Ip(address=\"8.8.8.8\"),\n Ip(address=\"invalid_ip\"),\n Ip(address=\"192.168.1.1\"),\n ]\n result = transform.preprocess(ips)\n result_addresses = [ip.address for ip in result]\n assert \"8.8.8.8\" in result_addresses\n assert \"192.168.1.1\" in result_addresses", + "detail": "spectragraph-transforms.tests.transforms.ip.ip_to_asn", + "documentation": {} + }, + { + "label": "test_preprocess_multiple_formats", + "kind": 2, + "importPath": "spectragraph-transforms.tests.transforms.ip.ip_to_asn", + "description": "spectragraph-transforms.tests.transforms.ip.ip_to_asn", + "peekOfCode": "def test_preprocess_multiple_formats():\n ips = [\n {\"address\": \"8.8.8.8\"},\n {\"invalid_key\": \"1.1.1.1\"},\n Ip(address=\"192.168.1.1\"),\n \"10.0.0.1\",\n ]\n result = transform.preprocess(ips)\n result_addresses = [ip.address for ip in result]\n assert \"8.8.8.8\" in result_addresses", + "detail": "spectragraph-transforms.tests.transforms.ip.ip_to_asn", + "documentation": {} + }, + { + "label": "test_scan_extracts_asn_info", + "kind": 2, + "importPath": "spectragraph-transforms.tests.transforms.ip.ip_to_asn", + "description": "spectragraph-transforms.tests.transforms.ip.ip_to_asn", + "peekOfCode": "def test_scan_extracts_asn_info(monkeypatch):\n mock_asnmap_output = {\n \"input\": \"8.8.8.8\",\n \"as_number\": \"AS15169\",\n \"as_name\": \"GOOGLE\",\n \"as_country\": \"US\",\n \"as_range\": [\"8.8.8.0/24\", \"8.8.4.0/24\"],\n }\n class MockSubprocessResult:\n def __init__(self, stdout):", + "detail": "spectragraph-transforms.tests.transforms.ip.ip_to_asn", + "documentation": {} + }, + { + "label": "test_scan_handles_no_asn_found", + "kind": 2, + "importPath": "spectragraph-transforms.tests.transforms.ip.ip_to_asn", + "description": "spectragraph-transforms.tests.transforms.ip.ip_to_asn", + "peekOfCode": "def test_scan_handles_no_asn_found(monkeypatch):\n class MockSubprocessResult:\n def __init__(self, stdout):\n self.stdout = stdout\n self.returncode = 0\n def mock_subprocess_run(cmd, input, capture_output, text, timeout):\n # Return empty output to simulate no ASN found\n return MockSubprocessResult(\"\")\n monkeypatch.setattr(\"subprocess.run\", mock_subprocess_run)\n input_data = [Ip(address=\"192.168.1.1\")]", + "detail": "spectragraph-transforms.tests.transforms.ip.ip_to_asn", + "documentation": {} + }, + { + "label": "test_scan_handles_subprocess_exception", + "kind": 2, + "importPath": "spectragraph-transforms.tests.transforms.ip.ip_to_asn", + "description": "spectragraph-transforms.tests.transforms.ip.ip_to_asn", + "peekOfCode": "def test_scan_handles_subprocess_exception(monkeypatch):\n def mock_subprocess_run(cmd, input, capture_output, text, timeout):\n raise Exception(\"Subprocess failed\")\n monkeypatch.setattr(\"subprocess.run\", mock_subprocess_run)\n input_data = [Ip(address=\"8.8.8.8\")]\n asns = transform.scan(input_data)\n assert isinstance(asns, list)\n assert len(asns) == 1\n asn = asns[0]\n assert isinstance(asn, ASN)", + "detail": "spectragraph-transforms.tests.transforms.ip.ip_to_asn", + "documentation": {} + }, + { + "label": "test_scan_multiple_ips", + "kind": 2, + "importPath": "spectragraph-transforms.tests.transforms.ip.ip_to_asn", + "description": "spectragraph-transforms.tests.transforms.ip.ip_to_asn", + "peekOfCode": "def test_scan_multiple_ips(monkeypatch):\n mock_responses = {\n \"8.8.8.8\": {\n \"input\": \"8.8.8.8\",\n \"as_number\": \"AS15169\",\n \"as_name\": \"GOOGLE\",\n \"as_country\": \"US\",\n \"as_range\": [\"8.8.8.0/24\"],\n },\n \"1.1.1.1\": {", + "detail": "spectragraph-transforms.tests.transforms.ip.ip_to_asn", + "documentation": {} + }, + { + "label": "test_schemas", + "kind": 2, + "importPath": "spectragraph-transforms.tests.transforms.ip.ip_to_asn", + "description": "spectragraph-transforms.tests.transforms.ip.ip_to_asn", + "peekOfCode": "def test_schemas():\n input_schema = transform.input_schema()\n output_schema = transform.output_schema()\n # Input schema should have address field\n assert \"properties\" in input_schema\n address_prop = next(\n (prop for prop in input_schema[\"properties\"] if prop[\"name\"] == \"address\"), None\n )\n assert address_prop is not None\n assert address_prop[\"type\"] == \"string\"", + "detail": "spectragraph-transforms.tests.transforms.ip.ip_to_asn", + "documentation": {} + }, + { + "label": "test_postprocess_creates_neo4j_relationships", + "kind": 2, + "importPath": "spectragraph-transforms.tests.transforms.ip.ip_to_asn", + "description": "spectragraph-transforms.tests.transforms.ip.ip_to_asn", + "peekOfCode": "def test_postprocess_creates_neo4j_relationships(monkeypatch):\n # Mock Neo4j connection\n mock_neo4j = Mock()\n transform.neo4j_conn = mock_neo4j\n input_data = [Ip(address=\"8.8.8.8\")]\n asn_results = [\n ASN(\n number=15169,\n name=\"GOOGLE\",\n country=\"US\",", + "detail": "spectragraph-transforms.tests.transforms.ip.ip_to_asn", + "documentation": {} + }, + { + "label": "test_postprocess_skips_unknown_asns", + "kind": 2, + "importPath": "spectragraph-transforms.tests.transforms.ip.ip_to_asn", + "description": "spectragraph-transforms.tests.transforms.ip.ip_to_asn", + "peekOfCode": "def test_postprocess_skips_unknown_asns(monkeypatch):\n # Mock Neo4j connection\n mock_neo4j = Mock()\n transform.neo4j_conn = mock_neo4j\n input_data = [Ip(address=\"192.168.1.1\")]\n asn_results = [\n ASN(number=0, name=\"Unknown\", country=\"Unknown\", cidrs=[]) # Unknown ASN\n ]\n result = transform.postprocess(asn_results, input_data)\n # Verify Neo4j query was NOT called for unknown ASN", + "detail": "spectragraph-transforms.tests.transforms.ip.ip_to_asn", + "documentation": {} + }, + { + "label": "logger", + "kind": 5, + "importPath": "spectragraph-transforms.tests.transforms.ip.ip_to_asn", + "description": "spectragraph-transforms.tests.transforms.ip.ip_to_asn", + "peekOfCode": "logger = TestLogger()\n# The transform will get a mock logger from conftest.py automatically\ntransform = IpToAsnTransform(\"sketch_123\", \"scan_123\", logger)\ndef test_preprocess_valid_ips():\n ips = [\n Ip(address=\"8.8.8.8\"),\n Ip(address=\"1.1.1.1\"),\n ]\n result = transform.preprocess(ips)\n result_addresses = [ip.address for ip in result]", + "detail": "spectragraph-transforms.tests.transforms.ip.ip_to_asn", + "documentation": {} + }, + { + "label": "transform", + "kind": 5, + "importPath": "spectragraph-transforms.tests.transforms.ip.ip_to_asn", + "description": "spectragraph-transforms.tests.transforms.ip.ip_to_asn", + "peekOfCode": "transform = IpToAsnTransform(\"sketch_123\", \"scan_123\", logger)\ndef test_preprocess_valid_ips():\n ips = [\n Ip(address=\"8.8.8.8\"),\n Ip(address=\"1.1.1.1\"),\n ]\n result = transform.preprocess(ips)\n result_addresses = [ip.address for ip in result]\n expected_addresses = [ip.address for ip in ips]\n assert result_addresses == expected_addresses", + "detail": "spectragraph-transforms.tests.transforms.ip.ip_to_asn", + "documentation": {} + }, + { + "label": "test_preprocess_valid_ips", + "kind": 2, + "importPath": "spectragraph-transforms.tests.transforms.ip.ip_to_infos", + "description": "spectragraph-transforms.tests.transforms.ip.ip_to_infos", + "peekOfCode": "def test_preprocess_valid_ips():\n ips = [\n Ip(address=\"8.8.8.8\"),\n Ip(address=\"1.1.1.1\"),\n ]\n result = transform.preprocess(ips)\n result_ips = [d.address for d in result]\n expected_ips = [d.address for d in ips]\n assert result_ips == expected_ips\ndef test_preprocess_string_ips():", + "detail": "spectragraph-transforms.tests.transforms.ip.ip_to_infos", + "documentation": {} + }, + { + "label": "test_preprocess_string_ips", + "kind": 2, + "importPath": "spectragraph-transforms.tests.transforms.ip.ip_to_infos", + "description": "spectragraph-transforms.tests.transforms.ip.ip_to_infos", + "peekOfCode": "def test_preprocess_string_ips():\n ips = [\n \"8.8.8.8\",\n \"1.1.1.1\",\n ]\n result = transform.preprocess(ips)\n result_ips = [d.address for d in result]\n expected_ips = [d for d in ips]\n assert [ip.address for ip in result] == expected_ips\ndef test_preprocess_invalid_ips():", + "detail": "spectragraph-transforms.tests.transforms.ip.ip_to_infos", + "documentation": {} + }, + { + "label": "test_preprocess_invalid_ips", + "kind": 2, + "importPath": "spectragraph-transforms.tests.transforms.ip.ip_to_infos", + "description": "spectragraph-transforms.tests.transforms.ip.ip_to_infos", + "peekOfCode": "def test_preprocess_invalid_ips():\n ips = [\n Ip(address=\"8.8.8.8\"),\n Ip(address=\"invalid_ip\"),\n Ip(address=\"1.1.1.1\"),\n ]\n result = transform.preprocess(ips)\n result_ips = [d.address for d in result]\n assert \"8.8.8.8\" in result_ips\n assert \"1.1.1.1\" in result_ips", + "detail": "spectragraph-transforms.tests.transforms.ip.ip_to_infos", + "documentation": {} + }, + { + "label": "test_preprocess_multiple_formats", + "kind": 2, + "importPath": "spectragraph-transforms.tests.transforms.ip.ip_to_infos", + "description": "spectragraph-transforms.tests.transforms.ip.ip_to_infos", + "peekOfCode": "def test_preprocess_multiple_formats():\n ips = [\n {\"address\": \"8.8.8.8\"},\n {\"invalid_key\": \"1.2.3.4\"},\n Ip(address=\"1.1.1.1\"),\n \"1.1.1.1\",\n ]\n result = transform.preprocess(ips)\n result_ips = [d.address for d in result]\n assert \"8.8.8.8\" in result_ips", + "detail": "spectragraph-transforms.tests.transforms.ip.ip_to_infos", + "documentation": {} + }, + { + "label": "test_scan_returns_ip", + "kind": 2, + "importPath": "spectragraph-transforms.tests.transforms.ip.ip_to_infos", + "description": "spectragraph-transforms.tests.transforms.ip.ip_to_infos", + "peekOfCode": "def test_scan_returns_ip(monkeypatch):\n # Mock of get_location_data\n def mock_get_location_data(address):\n return {\n \"latitude\": 37.386,\n \"longitude\": -122.0838,\n \"country\": \"US\",\n \"city\": \"Mountain View\",\n \"isp\": \"Google LLC\",\n }", + "detail": "spectragraph-transforms.tests.transforms.ip.ip_to_infos", + "documentation": {} + }, + { + "label": "test_schemas", + "kind": 2, + "importPath": "spectragraph-transforms.tests.transforms.ip.ip_to_infos", + "description": "spectragraph-transforms.tests.transforms.ip.ip_to_infos", + "peekOfCode": "def test_schemas():\n input_schema = transform.input_schema()\n output_schema = transform.output_schema()\n assert input_schema == {\n \"type\": \"Ip\",\n \"properties\": [\n {\"name\": \"address\", \"type\": \"string\"},\n {\"name\": \"latitude\", \"type\": \"number | null\"},\n {\"name\": \"longitude\", \"type\": \"number | null\"},\n {\"name\": \"country\", \"type\": \"string | null\"},", + "detail": "spectragraph-transforms.tests.transforms.ip.ip_to_infos", + "documentation": {} + }, + { + "label": "transform", + "kind": 5, + "importPath": "spectragraph-transforms.tests.transforms.ip.ip_to_infos", + "description": "spectragraph-transforms.tests.transforms.ip.ip_to_infos", + "peekOfCode": "transform = IpToInfosTransform(\"sketch_123\", \"scan_123\")\ndef test_preprocess_valid_ips():\n ips = [\n Ip(address=\"8.8.8.8\"),\n Ip(address=\"1.1.1.1\"),\n ]\n result = transform.preprocess(ips)\n result_ips = [d.address for d in result]\n expected_ips = [d.address for d in ips]\n assert result_ips == expected_ips", + "detail": "spectragraph-transforms.tests.transforms.ip.ip_to_infos", + "documentation": {} + }, + { + "label": "test_preprocess_valid_names", + "kind": 2, + "importPath": "spectragraph-transforms.tests.transforms.organization.to_infos", + "description": "spectragraph-transforms.tests.transforms.organization.to_infos", + "peekOfCode": "def test_preprocess_valid_names():\n data = [Organization(name=\"OpenAI\"), {\"name\": \"Inria\"}, \"OVH\"]\n result = transform.preprocess(data)\n result_names = [org.name for org in result]\n assert result_names == [\"OpenAI\", \"Inria\", \"OVH\"]\n# def test_preprocess_invalid_entries():\n# data = [\n# {\"wrong_key\": \"value\"},\n# 123,\n# None,", + "detail": "spectragraph-transforms.tests.transforms.organization.to_infos", + "documentation": {} + }, + { + "label": "test_execute", + "kind": 2, + "importPath": "spectragraph-transforms.tests.transforms.organization.to_infos", + "description": "spectragraph-transforms.tests.transforms.organization.to_infos", + "peekOfCode": "def test_execute():\n transform.execute([\"Karim Terrache\"])\n assert True", + "detail": "spectragraph-transforms.tests.transforms.organization.to_infos", + "documentation": {} + }, + { + "label": "transform", + "kind": 5, + "importPath": "spectragraph-transforms.tests.transforms.organization.to_infos", + "description": "spectragraph-transforms.tests.transforms.organization.to_infos", + "peekOfCode": "transform = OrgToInfosTransform(\"sketch_123\", \"scan_123\")\ndef test_preprocess_valid_names():\n data = [Organization(name=\"OpenAI\"), {\"name\": \"Inria\"}, \"OVH\"]\n result = transform.preprocess(data)\n result_names = [org.name for org in result]\n assert result_names == [\"OpenAI\", \"Inria\", \"OVH\"]\n# def test_preprocess_invalid_entries():\n# data = [\n# {\"wrong_key\": \"value\"},\n# 123,", + "detail": "spectragraph-transforms.tests.transforms.organization.to_infos", + "documentation": {} + }, + { + "label": "test_unprocessed_valid_usernames", + "kind": 2, + "importPath": "spectragraph-transforms.tests.transforms.social.maigret", + "description": "spectragraph-transforms.tests.transforms.social.maigret", + "peekOfCode": "def test_unprocessed_valid_usernames():\n usernames = [\n \"toto123\",\n \"DorianXd78\",\n ]\n result = transform.preprocess(usernames)\n result_usernames = [d for d in result]\n expected_usernames = [SocialProfile(username=d) for d in usernames]\n assert result_usernames == expected_usernames\ndef test_preprocess_invalid_usernames():", + "detail": "spectragraph-transforms.tests.transforms.social.maigret", + "documentation": {} + }, + { + "label": "test_preprocess_invalid_usernames", + "kind": 2, + "importPath": "spectragraph-transforms.tests.transforms.social.maigret", + "description": "spectragraph-transforms.tests.transforms.social.maigret", + "peekOfCode": "def test_preprocess_invalid_usernames():\n usernames = [\n SocialProfile(username=\"toto123\"),\n SocialProfile(username=\"DorianXd78_Official\"),\n SocialProfile(username=\"This is not a username\"),\n ]\n result = transform.preprocess(usernames)\n result_usernames = [d.username for d in result]\n assert \"toto123\" in result_usernames\n assert \"DorianXd78_Official\" in result_usernames", + "detail": "spectragraph-transforms.tests.transforms.social.maigret", + "documentation": {} + }, + { + "label": "test_preprocess_multiple_formats", + "kind": 2, + "importPath": "spectragraph-transforms.tests.transforms.social.maigret", + "description": "spectragraph-transforms.tests.transforms.social.maigret", + "peekOfCode": "def test_preprocess_multiple_formats():\n usernames = [\n {\"username\": \"toto123\"},\n {\"invalid_key\": \"ValId_UseRnAme\"},\n SocialProfile(username=\"DorianXd78_Official\"),\n \"MySimpleUsername\",\n ]\n result = transform.preprocess(usernames)\n result_usernames = [d.username for d in result]\n assert \"toto123\" in result_usernames", + "detail": "spectragraph-transforms.tests.transforms.social.maigret", + "documentation": {} + }, + { + "label": "test_parsing_invalid_output_file", + "kind": 2, + "importPath": "spectragraph-transforms.tests.transforms.social.maigret", + "description": "spectragraph-transforms.tests.transforms.social.maigret", + "peekOfCode": "def test_parsing_invalid_output_file():\n results = transform.parse_maigret_output(\"toto123\", Path(\"/this/path/does/not/exist\"))\n assert results == []\ndef test_parsing():\n results = transform.parse_maigret_output(\"toto123\", Path(\"/tmp/maigret_test.json\"))\n print(results)\n assert len(results) == 2", + "detail": "spectragraph-transforms.tests.transforms.social.maigret", + "documentation": {} + }, + { + "label": "test_parsing", + "kind": 2, + "importPath": "spectragraph-transforms.tests.transforms.social.maigret", + "description": "spectragraph-transforms.tests.transforms.social.maigret", + "peekOfCode": "def test_parsing():\n results = transform.parse_maigret_output(\"toto123\", Path(\"/tmp/maigret_test.json\"))\n print(results)\n assert len(results) == 2", + "detail": "spectragraph-transforms.tests.transforms.social.maigret", + "documentation": {} + }, + { + "label": "transform", + "kind": 5, + "importPath": "spectragraph-transforms.tests.transforms.social.maigret", + "description": "spectragraph-transforms.tests.transforms.social.maigret", + "peekOfCode": "transform = MaigretTransform(\"sketch_123\", \"scan_123\")\ndef test_unprocessed_valid_usernames():\n usernames = [\n \"toto123\",\n \"DorianXd78\",\n ]\n result = transform.preprocess(usernames)\n result_usernames = [d for d in result]\n expected_usernames = [SocialProfile(username=d) for d in usernames]\n assert result_usernames == expected_usernames", + "detail": "spectragraph-transforms.tests.transforms.social.maigret", + "documentation": {} + }, + { + "label": "MockCrawlResults", + "kind": 6, + "importPath": "spectragraph-transforms.tests.transforms.website.to_links", + "description": "spectragraph-transforms.tests.transforms.website.to_links", + "peekOfCode": "class MockCrawlResults:\n def __init__(self, internal=None, external=None):\n self.internal = internal or []\n self.external = external or []\nclass MockCrawler:\n def __init__(self, url, recursive=True, verbose=False, _on_result_callback=None):\n self.url = url\n self.callback = _on_result_callback\n def fetch(self):\n pass", + "detail": "spectragraph-transforms.tests.transforms.website.to_links", + "documentation": {} + }, + { + "label": "MockCrawler", + "kind": 6, + "importPath": "spectragraph-transforms.tests.transforms.website.to_links", + "description": "spectragraph-transforms.tests.transforms.website.to_links", + "peekOfCode": "class MockCrawler:\n def __init__(self, url, recursive=True, verbose=False, _on_result_callback=None):\n self.url = url\n self.callback = _on_result_callback\n def fetch(self):\n pass\n def extract_urls(self):\n # Simulate callback calls\n if self.callback:\n self.callback(\"https://example.com/page1\", is_external=False)", + "detail": "spectragraph-transforms.tests.transforms.website.to_links", + "documentation": {} + }, + { + "label": "test_postprocess_simplified", + "kind": 2, + "importPath": "spectragraph-transforms.tests.transforms.website.to_links", + "description": "spectragraph-transforms.tests.transforms.website.to_links", + "peekOfCode": "def test_postprocess_simplified():\n \"\"\"Test that postprocess now just returns results as-is.\"\"\"\n transform = WebsiteToLinks(sketch_id=\"test\", scan_id=\"test\")\n original_input = [Website(url=\"https://example.com\")]\n results = [\n {\n \"website\": \"https://example.com\",\n \"main_domain\": \"example.com\",\n \"internal_urls\": [\"https://example.com/page1\"],\n \"external_urls\": [\"https://external.com/page\"],", + "detail": "spectragraph-transforms.tests.transforms.website.to_links", + "documentation": {} + }, + { + "label": "mock_logger", + "kind": 2, + "importPath": "spectragraph-transforms.tests.conftest", + "description": "spectragraph-transforms.tests.conftest", + "peekOfCode": "def mock_logger(monkeypatch):\n \"\"\"Automatically replace the production Logger with TestLogger for all tests.\"\"\"\n monkeypatch.setattr(\"spectragraph_core.core.logger.Logger\", TestLogger)\n # Mock the emit_event_task to do nothing\n monkeypatch.setattr(\n \"spectragraph_core.core.logger.emit_event_task.delay\", lambda *args, **kwargs: None\n )", + "detail": "spectragraph-transforms.tests.conftest", + "documentation": {} + }, + { + "label": "TestLogger", + "kind": 6, + "importPath": "spectragraph-transforms.tests.logger", + "description": "spectragraph-transforms.tests.logger", + "peekOfCode": "class TestLogger:\n @staticmethod\n def _format_message(type: str, message: str) -> str:\n \"\"\"Format the log message with type prefix\"\"\"\n return f\"[{type.upper()}] {message}\"\n @staticmethod\n def _create_log(sketch_id: Union[str, UUID], log_type: str, content: str) -> Any:\n \"\"\"Create a dummy log object for testing\"\"\"\n class DummyLog:\n def __init__(self):", + "detail": "spectragraph-transforms.tests.logger", + "documentation": {} + }, + { + "label": "EventLevel", + "kind": 5, + "importPath": "spectragraph-transforms.tests.logger", + "description": "spectragraph-transforms.tests.logger", + "peekOfCode": "EventLevel = Literal[\"info\", \"warn\", \"error\", \"success\", \"debug\"]\nLEVEL_MAP = {\n \"info\": \"INFO\",\n \"warn\": \"WARN\",\n \"error\": \"FAILED\",\n \"success\": \"SUCCESS\",\n \"debug\": \"DEBUG\",\n}\nclass TestLogger:\n @staticmethod", + "detail": "spectragraph-transforms.tests.logger", + "documentation": {} + }, + { + "label": "LEVEL_MAP", + "kind": 5, + "importPath": "spectragraph-transforms.tests.logger", + "description": "spectragraph-transforms.tests.logger", + "peekOfCode": "LEVEL_MAP = {\n \"info\": \"INFO\",\n \"warn\": \"WARN\",\n \"error\": \"FAILED\",\n \"success\": \"SUCCESS\",\n \"debug\": \"DEBUG\",\n}\nclass TestLogger:\n @staticmethod\n def _format_message(type: str, message: str) -> str:", + "detail": "spectragraph-transforms.tests.logger", + "documentation": {} + }, + { + "label": "TestParams", + "kind": 6, + "importPath": "spectragraph-transforms.tests.test_github_repo", + "description": "spectragraph-transforms.tests.test_github_repo", + "peekOfCode": "class TestParams:\n \"\"\"Test parameter validation.\"\"\"\n def test_valid_params(self):\n \"\"\"Test valid parameter combinations.\"\"\"\n # Note: We are testing the Pydantic model directly here\n params = GitHubRepoParams(\n domain=\"example.com\",\n max_repos=25,\n min_stars=10,\n include_forks=True", + "detail": "spectragraph-transforms.tests.test_github_repo", + "documentation": {} + }, + { + "label": "TestPreprocess", + "kind": 6, + "importPath": "spectragraph-transforms.tests.test_github_repo", + "description": "spectragraph-transforms.tests.test_github_repo", + "peekOfCode": "class TestPreprocess:\n \"\"\"Test preprocessing logic.\"\"\"\n @pytest.mark.asyncio\n async def test_success(self, transform):\n \"\"\"Test successful preprocessing.\"\"\"\n # Preprocess converts input list to cleaned list of domains\n input_data = [\"anthropic.com\", {\"domain\": \"example.com\"}]\n result = await transform.preprocess(input_data)\n assert len(result) == 2\n assert \"anthropic.com\" in result", + "detail": "spectragraph-transforms.tests.test_github_repo", + "documentation": {} + }, + { + "label": "TestSearch", + "kind": 6, + "importPath": "spectragraph-transforms.tests.test_github_repo", + "description": "spectragraph-transforms.tests.test_github_repo", + "peekOfCode": "class TestSearch:\n \"\"\"Test organization search.\"\"\"\n @pytest.mark.asyncio\n async def test_search_organizations(self, transform, mock_org_response):\n \"\"\"Test successful organization search.\"\"\"\n mock_response = MagicMock()\n mock_response.json.return_value = {\n \"items\": [{\"login\": \"anthropics\", \"type\": \"Organization\"}]\n }\n mock_response.raise_for_status = MagicMock()", + "detail": "spectragraph-transforms.tests.test_github_repo", + "documentation": {} + }, + { + "label": "TestRepositories", + "kind": 6, + "importPath": "spectragraph-transforms.tests.test_github_repo", + "description": "spectragraph-transforms.tests.test_github_repo", + "peekOfCode": "class TestRepositories:\n \"\"\"Test repository retrieval.\"\"\"\n @pytest.mark.asyncio\n async def test_get_repositories(self, transform, mock_repo_response):\n \"\"\"Test successful repository retrieval.\"\"\"\n mock_response = MagicMock()\n mock_response.json.return_value = [mock_repo_response]\n mock_response.raise_for_status = MagicMock()\n mock_client = AsyncMock()\n mock_client.get.return_value = mock_response", + "detail": "spectragraph-transforms.tests.test_github_repo", + "documentation": {} + }, + { + "label": "TestFullScan", + "kind": 6, + "importPath": "spectragraph-transforms.tests.test_github_repo", + "description": "spectragraph-transforms.tests.test_github_repo", + "peekOfCode": "class TestFullScan:\n \"\"\"Test complete scan workflow.\"\"\"\n @pytest.mark.asyncio\n async def test_successful_scan(self, transform, mock_org_response, mock_repo_response):\n \"\"\"Test complete scan execution.\"\"\"\n with patch('httpx.AsyncClient') as mock_client_class:\n mock_client = AsyncMock()\n mock_client_class.return_value.__aenter__.return_value = mock_client\n with patch.object(transform, '_search_organizations', return_value=[mock_org_response]), \\\n patch.object(transform, '_get_org_repositories', return_value=[mock_repo_response]), \\", + "detail": "spectragraph-transforms.tests.test_github_repo", + "documentation": {} + }, + { + "label": "transform", + "kind": 2, + "importPath": "spectragraph-transforms.tests.test_github_repo", + "description": "spectragraph-transforms.tests.test_github_repo", + "peekOfCode": "def transform():\n \"\"\"Create transform instance.\"\"\"\n t = GitHubRepoTransform()\n # Mock params to simulate async_init resolution\n t.params = {\"github_token\": \"ghp_fake_token\"} \n return t\n@pytest.fixture\ndef sample_params():\n \"\"\"Sample valid parameters.\"\"\"\n return {", + "detail": "spectragraph-transforms.tests.test_github_repo", + "documentation": {} + }, + { + "label": "sample_params", + "kind": 2, + "importPath": "spectragraph-transforms.tests.test_github_repo", + "description": "spectragraph-transforms.tests.test_github_repo", + "peekOfCode": "def sample_params():\n \"\"\"Sample valid parameters.\"\"\"\n return {\n \"domain\": \"anthropic.com\",\n \"include_forks\": False,\n \"max_repos\": 10,\n \"min_stars\": 0,\n \"language_filter\": None\n }\n@pytest.fixture", + "detail": "spectragraph-transforms.tests.test_github_repo", + "documentation": {} + }, + { + "label": "mock_org_response", + "kind": 2, + "importPath": "spectragraph-transforms.tests.test_github_repo", + "description": "spectragraph-transforms.tests.test_github_repo", + "peekOfCode": "def mock_org_response():\n \"\"\"Mock GitHub organization API response.\"\"\"\n return {\n \"login\": \"anthropics\",\n \"name\": \"Anthropic\",\n \"description\": \"AI safety company\",\n \"blog\": \"anthropic.com\",\n \"location\": \"San Francisco\",\n \"email\": \"hello@anthropic.com\",\n \"twitter_username\": \"AnthropicAI\",", + "detail": "spectragraph-transforms.tests.test_github_repo", + "documentation": {} + }, + { + "label": "mock_repo_response", + "kind": 2, + "importPath": "spectragraph-transforms.tests.test_github_repo", + "description": "spectragraph-transforms.tests.test_github_repo", + "peekOfCode": "def mock_repo_response():\n \"\"\"Mock GitHub repository API response.\"\"\"\n return {\n \"name\": \"claude-api\",\n \"full_name\": \"anthropics/claude-api\",\n \"description\": \"Python client for Claude API\",\n \"html_url\": \"https://github.com/anthropics/claude-api\",\n \"homepage\": \"https://anthropic.com\",\n \"language\": \"Python\",\n \"stargazers_count\": 3400,", + "detail": "spectragraph-transforms.tests.test_github_repo", + "documentation": {} + }, + { + "label": "TestWhoxyTransformsVaultIntegration", + "kind": 6, + "importPath": "spectragraph-transforms.tests.test_vault_integration", + "description": "spectragraph-transforms.tests.test_vault_integration", + "peekOfCode": "class TestWhoxyTransformsVaultIntegration:\n \"\"\"Tests for WHOXY transforms vault integration.\"\"\"\n @pytest.mark.asyncio\n async def test_domain_to_history_gets_api_key_from_vault(\n self, mock_vault, sketch_id\n ):\n \"\"\"Test that domain_to_history retrieves WHOXY_API_KEY from vault.\"\"\"\n api_key = \"whoxy-api-key-12345\"\n mock_vault.get_secret.return_value = api_key\n transform = DomainToHistoryTransform(", + "detail": "spectragraph-transforms.tests.test_vault_integration", + "documentation": {} + }, + { + "label": "TestEtherscanTransformsVaultIntegration", + "kind": 6, + "importPath": "spectragraph-transforms.tests.test_vault_integration", + "description": "spectragraph-transforms.tests.test_vault_integration", + "peekOfCode": "class TestEtherscanTransformsVaultIntegration:\n \"\"\"Tests for Etherscan transforms vault integration.\"\"\"\n @pytest.mark.asyncio\n async def test_wallet_to_nfts_gets_api_key_from_vault(self, mock_vault, sketch_id):\n \"\"\"Test that wallet_to_nfts retrieves ETHERSCAN_API_KEY from vault.\"\"\"\n api_key = \"etherscan-api-key-12345\"\n mock_vault.get_secret.return_value = api_key\n transform = CryptoWalletAddressToNFTs(\n sketch_id=sketch_id, scan_id=\"scan_123\", vault=mock_vault, params={}\n )", + "detail": "spectragraph-transforms.tests.test_vault_integration", + "documentation": {} + }, + { + "label": "TestHIBPTransformsVaultIntegration", + "kind": 6, + "importPath": "spectragraph-transforms.tests.test_vault_integration", + "description": "spectragraph-transforms.tests.test_vault_integration", + "peekOfCode": "class TestHIBPTransformsVaultIntegration:\n \"\"\"Tests for HIBP transforms vault integration.\"\"\"\n @pytest.mark.asyncio\n async def test_email_to_breaches_gets_api_key_from_vault(\n self, mock_vault, sketch_id\n ):\n \"\"\"Test that email_to_breaches retrieves HIBP_API_KEY from vault.\"\"\"\n api_key = \"hibp-api-key-12345\"\n mock_vault.get_secret.return_value = api_key\n transform = EmailToBreachesTransform(", + "detail": "spectragraph-transforms.tests.test_vault_integration", + "documentation": {} + }, + { + "label": "TestVaultSecretWithUserProvidedID", + "kind": 6, + "importPath": "spectragraph-transforms.tests.test_vault_integration", + "description": "spectragraph-transforms.tests.test_vault_integration", + "peekOfCode": "class TestVaultSecretWithUserProvidedID:\n \"\"\"Tests for vault secrets when user provides a specific vault ID.\"\"\"\n @pytest.mark.asyncio\n async def test_transform_uses_user_provided_vault_id(self, mock_vault, sketch_id):\n \"\"\"Test that transform uses user-provided vault ID if specified.\"\"\"\n vault_id = str(uuid.uuid4())\n api_key = \"whoxy-api-key-12345\"\n # First call (by ID) returns the secret\n mock_vault.get_secret.return_value = api_key\n transform = DomainToHistoryTransform(", + "detail": "spectragraph-transforms.tests.test_vault_integration", + "documentation": {} + }, + { + "label": "TestMissingRequiredVaultSecret", + "kind": 6, + "importPath": "spectragraph-transforms.tests.test_vault_integration", + "description": "spectragraph-transforms.tests.test_vault_integration", + "peekOfCode": "class TestMissingRequiredVaultSecret:\n \"\"\"Tests for error handling when required vault secrets are missing.\"\"\"\n @pytest.mark.asyncio\n async def test_missing_required_secret_logs_error(self, mock_vault, sketch_id):\n \"\"\"Test that missing required secret logs an error message.\"\"\"\n # Vault returns None (secret not found)\n mock_vault.get_secret.return_value = None\n from unittest.mock import patch\n with patch(\"spectragraph_core.core.transform_base.Logger\") as mock_logger:\n transform = DomainToHistoryTransform(", + "detail": "spectragraph-transforms.tests.test_vault_integration", + "documentation": {} + }, + { + "label": "mock_vault", + "kind": 2, + "importPath": "spectragraph-transforms.tests.test_vault_integration", + "description": "spectragraph-transforms.tests.test_vault_integration", + "peekOfCode": "def mock_vault():\n \"\"\"Create a mock vault instance.\"\"\"\n vault = Mock()\n vault.get_secret = Mock()\n return vault\n@pytest.fixture\ndef sketch_id():\n \"\"\"Create a test sketch ID.\"\"\"\n return str(uuid.uuid4())\nclass TestWhoxyTransformsVaultIntegration:", + "detail": "spectragraph-transforms.tests.test_vault_integration", + "documentation": {} + }, + { + "label": "sketch_id", + "kind": 2, + "importPath": "spectragraph-transforms.tests.test_vault_integration", + "description": "spectragraph-transforms.tests.test_vault_integration", + "peekOfCode": "def sketch_id():\n \"\"\"Create a test sketch ID.\"\"\"\n return str(uuid.uuid4())\nclass TestWhoxyTransformsVaultIntegration:\n \"\"\"Tests for WHOXY transforms vault integration.\"\"\"\n @pytest.mark.asyncio\n async def test_domain_to_history_gets_api_key_from_vault(\n self, mock_vault, sketch_id\n ):\n \"\"\"Test that domain_to_history retrieves WHOXY_API_KEY from vault.\"\"\"", + "detail": "spectragraph-transforms.tests.test_vault_integration", + "documentation": {} + }, + { + "label": "Location", + "kind": 6, + "importPath": "spectragraph-types.src.spectragraph_types.address", + "description": "spectragraph-types.src.spectragraph_types.address", + "peekOfCode": "class Location(BaseModel):\n \"\"\"Represents a physical address with geographical coordinates.\"\"\"\n address: str = Field(..., description=\"Street address\", title=\"Street Address\")\n city: str = Field(..., description=\"City name\", title=\"City\")\n country: str = Field(..., description=\"Country name\", title=\"Country\")\n zip: str = Field(..., description=\"ZIP or postal code\", title=\"ZIP/Postal Code\")\n latitude: Optional[float] = Field(\n None, description=\"Latitude coordinate of the address\", title=\"Latitude\"\n )\n longitude: Optional[float] = Field(", + "detail": "spectragraph-types.src.spectragraph_types.address", + "documentation": {} + }, + { + "label": "Affiliation", + "kind": 6, + "importPath": "spectragraph-types.src.spectragraph_types.affiliation", + "description": "spectragraph-types.src.spectragraph_types.affiliation", + "peekOfCode": "class Affiliation(BaseModel):\n \"\"\"Represents an organizational affiliation or employment relationship.\"\"\"\n organization: str = Field(\n ..., description=\"Organization or group name\", title=\"Organization\"\n )\n role: Optional[str] = Field(\n None, description=\"Role or position within organization\", title=\"Role\"\n )\n start_date: Optional[str] = Field(\n None, description=\"Start date of affiliation\", title=\"Start Date\"", + "detail": "spectragraph-types.src.spectragraph_types.affiliation", + "documentation": {} + }, + { + "label": "Alias", + "kind": 6, + "importPath": "spectragraph-types.src.spectragraph_types.alias", + "description": "spectragraph-types.src.spectragraph_types.alias", + "peekOfCode": "class Alias(BaseModel):\n \"\"\"Represents an alias or alternative name used by an entity.\"\"\"\n alias: str = Field(..., description=\"Alias or alternative name\", title=\"Alias\")\n type: Optional[str] = Field(\n None,\n description=\"Type of alias (nickname, code name, etc.)\",\n title=\"Alias Type\",\n )\n context: Optional[str] = Field(\n None, description=\"Context where alias is used\", title=\"Context\"", + "detail": "spectragraph-types.src.spectragraph_types.alias", + "documentation": {} + }, + { + "label": "ASN", + "kind": 6, + "importPath": "spectragraph-types.src.spectragraph_types.asn", + "description": "spectragraph-types.src.spectragraph_types.asn", + "peekOfCode": "class ASN(BaseModel):\n \"\"\"Represents an Autonomous System Number with associated network information.\"\"\"\n number: int = Field(\n ..., description=\"Autonomous System Number (e.g., 15169)\", title=\"ASN Number\"\n )\n name: Optional[str] = Field(\n None,\n description=\"Name of the organization owning the ASN\",\n title=\"Organization Name\",\n )", + "detail": "spectragraph-types.src.spectragraph_types.asn", + "documentation": {} + }, + { + "label": "BankAccount", + "kind": 6, + "importPath": "spectragraph-types.src.spectragraph_types.bank_account", + "description": "spectragraph-types.src.spectragraph_types.bank_account", + "peekOfCode": "class BankAccount(BaseModel):\n \"\"\"Represents a bank account with financial and security information.\"\"\"\n account_number: str = Field(\n ..., description=\"Bank account number\", title=\"Account Number\"\n )\n bank_name: Optional[str] = Field(None, description=\"Bank name\", title=\"Bank Name\")\n account_type: Optional[str] = Field(\n None,\n description=\"Type of account (checking, savings, etc.)\",\n title=\"Account Type\",", + "detail": "spectragraph-types.src.spectragraph_types.bank_account", + "documentation": {} + }, + { + "label": "FingerprintBase", + "kind": 6, + "importPath": "spectragraph-types.src.spectragraph_types.base", + "description": "spectragraph-types.src.spectragraph_types.base", + "peekOfCode": "class FingerprintBase(BaseModel):\n \"\"\"\n Base class for entities that require deterministic fingerprinting.\n \"\"\"\n def _fingerprint_payload(self) -> dict:\n \"\"\"\n Override in child classes to control fingerprint inputs.\n \"\"\"\n return self.model_dump(exclude_none=True)\n def fingerprint(self) -> str:", + "detail": "spectragraph-types.src.spectragraph_types.base", + "documentation": {} + }, + { + "label": "Breach", + "kind": 6, + "importPath": "spectragraph-types.src.spectragraph_types.breach", + "description": "spectragraph-types.src.spectragraph_types.breach", + "peekOfCode": "class Breach(BaseModel):\n \"\"\"Represents a data breach incident with affected accounts and details.\"\"\"\n name: str = Field(\n ..., description=\"The name of the breach or service\", title=\"Breach Name\"\n )\n title: Optional[str] = Field(\n None, description=\"Title of the breach\", title=\"Breach Title\"\n )\n domain: Optional[str] = Field(\n None, description=\"Domain of the breached service\", title=\"Domain\"", + "detail": "spectragraph-types.src.spectragraph_types.breach", + "documentation": {} + }, + { + "label": "CIDR", + "kind": 6, + "importPath": "spectragraph-types.src.spectragraph_types.cidr", + "description": "spectragraph-types.src.spectragraph_types.cidr", + "peekOfCode": "class CIDR(BaseModel):\n \"\"\"Represents a CIDR (Classless Inter-Domain Routing) network block.\"\"\"\n network: IPvAnyNetwork = Field(\n ..., description=\"CIDR block (e.g., 8.8.8.0/24)\", title=\"Network Block\"\n )", + "detail": "spectragraph-types.src.spectragraph_types.cidr", + "documentation": {} + }, + { + "label": "Credential", + "kind": 6, + "importPath": "spectragraph-types.src.spectragraph_types.credential", + "description": "spectragraph-types.src.spectragraph_types.credential", + "peekOfCode": "class Credential(BaseModel):\n \"\"\"Represents user credentials with compromise and usage information.\"\"\"\n username: str = Field(..., description=\"Username or identifier\", title=\"Username\")\n service: Optional[str] = Field(\n None,\n description=\"Service or platform where credential is used\",\n title=\"Service\",\n )\n type: Optional[str] = Field(\n None,", + "detail": "spectragraph-types.src.spectragraph_types.credential", + "documentation": {} + }, + { + "label": "CreditCard", + "kind": 6, + "importPath": "spectragraph-types.src.spectragraph_types.credit_card", + "description": "spectragraph-types.src.spectragraph_types.credit_card", + "peekOfCode": "class CreditCard(BaseModel):\n \"\"\"Represents a credit card with financial details and security status.\"\"\"\n card_number: str = Field(..., description=\"Credit card number\", title=\"Card Number\")\n card_type: Optional[str] = Field(\n None, description=\"Type of card (Visa, Mastercard, etc.)\", title=\"Card Type\"\n )\n issuer: Optional[str] = Field(None, description=\"Card issuer bank\", title=\"Issuer\")\n expiry_date: Optional[str] = Field(\n None, description=\"Card expiry date\", title=\"Expiry Date\"\n )", + "detail": "spectragraph-types.src.spectragraph_types.credit_card", + "documentation": {} + }, + { + "label": "Device", + "kind": 6, + "importPath": "spectragraph-types.src.spectragraph_types.device", + "description": "spectragraph-types.src.spectragraph_types.device", + "peekOfCode": "class Device(BaseModel):\n \"\"\"Represents a device with hardware, software, and network information.\"\"\"\n device_id: str = Field(\n ..., description=\"Unique device identifier\", title=\"Device ID\"\n )\n type: Optional[str] = Field(\n None,\n description=\"Type of device (mobile, desktop, server, etc.)\",\n title=\"Device Type\",\n )", + "detail": "spectragraph-types.src.spectragraph_types.device", + "documentation": {} + }, + { + "label": "DNSRecord", + "kind": 6, + "importPath": "spectragraph-types.src.spectragraph_types.dns_record", + "description": "spectragraph-types.src.spectragraph_types.dns_record", + "peekOfCode": "class DNSRecord(BaseModel):\n \"\"\"Represents a DNS record with type, value, and security information.\"\"\"\n record_type: str = Field(\n ...,\n description=\"Type of DNS record (A, AAAA, CNAME, MX, etc.)\",\n title=\"Record Type\",\n )\n name: str = Field(..., description=\"Domain name\", title=\"Domain Name\")\n value: str = Field(..., description=\"Record value\", title=\"Record Value\")\n ttl: Optional[int] = Field(None, description=\"Time to live in seconds\", title=\"TTL\")", + "detail": "spectragraph-types.src.spectragraph_types.dns_record", + "documentation": {} + }, + { + "label": "Document", + "kind": 6, + "importPath": "spectragraph-types.src.spectragraph_types.document", + "description": "spectragraph-types.src.spectragraph_types.document", + "peekOfCode": "class Document(BaseModel):\n \"\"\"Represents a document with metadata, security, and content information.\"\"\"\n title: str = Field(..., description=\"Document title\", title=\"Title\")\n doc_type: Optional[str] = Field(\n None, description=\"Type of document (PDF, DOC, etc.)\", title=\"Document Type\"\n )\n file_size: Optional[int] = Field(\n None, description=\"File size in bytes\", title=\"File Size\"\n )\n created_date: Optional[str] = Field(", + "detail": "spectragraph-types.src.spectragraph_types.document", + "documentation": {} + }, + { + "label": "Domain", + "kind": 6, + "importPath": "spectragraph-types.src.spectragraph_types.domain", + "description": "spectragraph-types.src.spectragraph_types.domain", + "peekOfCode": "class Domain(FingerprintBase):\n \"\"\"Represents a domain name and its properties.\"\"\"\n domain: str = Field(..., description=\"Domain name\", title=\"Domain Name\")\n root: Optional[bool] = Field(\n True, description=\"Is root or not\", title=\"Is Root Domain\"\n )\n def _fingerprint_payload(self) -> dict:\n return{ \n \"domain\":\n self.domain.strip().lower()", + "detail": "spectragraph-types.src.spectragraph_types.domain", + "documentation": {} + }, + { + "label": "Email", + "kind": 6, + "importPath": "spectragraph-types.src.spectragraph_types.email", + "description": "spectragraph-types.src.spectragraph_types.email", + "peekOfCode": "class Email(BaseModel):\n \"\"\"Represents an email address.\"\"\"\n email: str = Field(..., description=\"Email address\", title=\"Email Address\")", + "detail": "spectragraph-types.src.spectragraph_types.email", + "documentation": {} + }, + { + "label": "File", + "kind": 6, + "importPath": "spectragraph-types.src.spectragraph_types.file", + "description": "spectragraph-types.src.spectragraph_types.file", + "peekOfCode": "class File(BaseModel):\n \"\"\"Represents a file with metadata, type information, and security assessment.\"\"\"\n filename: str = Field(..., description=\"File name\", title=\"Filename\")\n file_type: Optional[str] = Field(\n None, description=\"File type or extension\", title=\"File Type\"\n )\n file_size: Optional[int] = Field(\n None, description=\"File size in bytes\", title=\"File Size\"\n )\n created_date: Optional[str] = Field(", + "detail": "spectragraph-types.src.spectragraph_types.file", + "documentation": {} + }, + { + "label": "Gravatar", + "kind": 6, + "importPath": "spectragraph-types.src.spectragraph_types.gravatar", + "description": "spectragraph-types.src.spectragraph_types.gravatar", + "peekOfCode": "class Gravatar(BaseModel):\n \"\"\"Represents a Gravatar profile with image and user information.\"\"\"\n src: HttpUrl = Field(..., description=\"Gravatar image URL\", title=\"Image URL\")\n hash: str = Field(..., description=\"Gravatar hash\", title=\"Hash\")\n size: Optional[int] = Field(\n None, description=\"Image size in pixels\", title=\"Image Size\"\n )\n rating: Optional[str] = Field(\n None, description=\"Content rating (g, pg, r, x)\", title=\"Content Rating\"\n )", + "detail": "spectragraph-types.src.spectragraph_types.gravatar", + "documentation": {} + }, + { + "label": "Individual", + "kind": 6, + "importPath": "spectragraph-types.src.spectragraph_types.individual", + "description": "spectragraph-types.src.spectragraph_types.individual", + "peekOfCode": "class Individual(BaseModel):\n \"\"\"Represents an individual person with comprehensive personal information.\"\"\"\n # Basic Information\n first_name: str = Field(\n ..., description=\"First name of the individual\", title=\"First Name\"\n )\n last_name: str = Field(\n ..., description=\"Last name of the individual\", title=\"Last Name\"\n )\n full_name: str = Field(", + "detail": "spectragraph-types.src.spectragraph_types.individual", + "documentation": {} + }, + { + "label": "Ip", + "kind": 6, + "importPath": "spectragraph-types.src.spectragraph_types.ip", + "description": "spectragraph-types.src.spectragraph_types.ip", + "peekOfCode": "class Ip(BaseModel):\n \"\"\"Represents an IP address with geolocation and ISP information.\"\"\"\n address: str = Field(..., description=\"IP address\", title=\"IP Address\")\n latitude: Optional[float] = Field(\n None, description=\"Latitude coordinate of the IP location\", title=\"Latitude\"\n )\n longitude: Optional[float] = Field(\n None, description=\"Longitude coordinate of the IP location\", title=\"Longitude\"\n )\n country: Optional[str] = Field(", + "detail": "spectragraph-types.src.spectragraph_types.ip", + "documentation": {} + }, + { + "label": "Leak", + "kind": 6, + "importPath": "spectragraph-types.src.spectragraph_types.leak", + "description": "spectragraph-types.src.spectragraph_types.leak", + "peekOfCode": "class Leak(BaseModel):\n \"\"\"Represents a data leak or breach with associated data.\"\"\"\n name: str = Field(\n ..., description=\"The name of the leak or service brea\", title=\"Leak Name\"\n )\n leak: Optional[List[Dict]] = Field(\n None, description=\"List of data leaks found\", title=\"Leak Data\"\n )", + "detail": "spectragraph-types.src.spectragraph_types.leak", + "documentation": {} + }, + { + "label": "Malware", + "kind": 6, + "importPath": "spectragraph-types.src.spectragraph_types.malware", + "description": "spectragraph-types.src.spectragraph_types.malware", + "peekOfCode": "class Malware(BaseModel):\n \"\"\"Represents malware with family, capabilities, and threat intelligence.\"\"\"\n name: str = Field(..., description=\"Malware name or identifier\", title=\"Name\")\n family: Optional[str] = Field(None, description=\"Malware family\", title=\"Family\")\n type: Optional[str] = Field(\n None, description=\"Type of malware (trojan, ransomware, etc.)\", title=\"Type\"\n )\n description: Optional[str] = Field(\n None, description=\"Malware description\", title=\"Description\"\n )", + "detail": "spectragraph-types.src.spectragraph_types.malware", + "documentation": {} + }, + { + "label": "Message", + "kind": 6, + "importPath": "spectragraph-types.src.spectragraph_types.message", + "description": "spectragraph-types.src.spectragraph_types.message", + "peekOfCode": "class Message(BaseModel):\n \"\"\"Represents a message with content, metadata, and security analysis.\"\"\"\n message_id: str = Field(\n ..., description=\"Unique message identifier\", title=\"Message ID\"\n )\n content: str = Field(..., description=\"Message content\", title=\"Content\")\n sender: Optional[str] = Field(None, description=\"Message sender\", title=\"Sender\")\n recipient: Optional[str] = Field(\n None, description=\"Message recipient\", title=\"Recipient\"\n )", + "detail": "spectragraph-types.src.spectragraph_types.message", + "documentation": {} + }, + { + "label": "Organization", + "kind": 6, + "importPath": "spectragraph-types.src.spectragraph_types.organization", + "description": "spectragraph-types.src.spectragraph_types.organization", + "peekOfCode": "class Organization(BaseModel):\n \"\"\"Represents an organization with detailed business and administrative information.\"\"\"\n # Basic information\n name: Any = Field(..., description=\"Organization name\", title=\"Organization Name\")\n siren: Optional[Any] = Field(None, description=\"SIREN number\", title=\"SIREN Number\")\n nom_complet: Optional[Any] = Field(\n None, description=\"Complete name\", title=\"Complete Name\"\n )\n nom_raison_sociale: Optional[Any] = Field(\n None, description=\"Company name\", title=\"Company Name\"", + "detail": "spectragraph-types.src.spectragraph_types.organization", + "documentation": {} + }, + { + "label": "Phone", + "kind": 6, + "importPath": "spectragraph-types.src.spectragraph_types.phone", + "description": "spectragraph-types.src.spectragraph_types.phone", + "peekOfCode": "class Phone(BaseModel):\n \"\"\"Represents a phone number with country and carrier information.\"\"\"\n number: str = Field(..., description=\"Phone number\", title=\"Phone Number\")\n country: Optional[str] = Field(\n None, description=\"Country code (ISO 3166-1 alpha-2)\", title=\"Country Code\"\n )\n carrier: Optional[str] = Field(\n None, description=\"Mobile carrier or service provider\", title=\"Carrier\"\n )", + "detail": "spectragraph-types.src.spectragraph_types.phone", + "documentation": {} + }, + { + "label": "Phrase", + "kind": 6, + "importPath": "spectragraph-types.src.spectragraph_types.phrase", + "description": "spectragraph-types.src.spectragraph_types.phrase", + "peekOfCode": "class Phrase(BaseModel):\n \"\"\"Represents a phrase or text content.\"\"\"\n text: Any = Field(\n ..., description=\"The content of the phrase.\", title=\"Phrase text value.\"\n )", + "detail": "spectragraph-types.src.spectragraph_types.phrase", + "documentation": {} + }, + { + "label": "ReputationScore", + "kind": 6, + "importPath": "spectragraph-types.src.spectragraph_types.reputation_score", + "description": "spectragraph-types.src.spectragraph_types.reputation_score", + "peekOfCode": "class ReputationScore(BaseModel):\n \"\"\"Represents a reputation score for an entity with historical data and trends.\"\"\"\n entity_id: str = Field(..., description=\"Entity identifier\", title=\"Entity ID\")\n entity_type: Optional[str] = Field(\n None,\n description=\"Type of entity (domain, IP, email, etc.)\",\n title=\"Entity Type\",\n )\n score: Optional[float] = Field(\n None, description=\"Reputation score (0-100)\", title=\"Score\"", + "detail": "spectragraph-types.src.spectragraph_types.reputation_score", + "documentation": {} + }, + { + "label": "RiskProfile", + "kind": 6, + "importPath": "spectragraph-types.src.spectragraph_types.risk_profile", + "description": "spectragraph-types.src.spectragraph_types.risk_profile", + "peekOfCode": "class RiskProfile(BaseModel):\n \"\"\"Represents a comprehensive risk assessment profile for an entity.\"\"\"\n entity_id: str = Field(..., description=\"Entity identifier\", title=\"Entity ID\")\n entity_type: Optional[str] = Field(\n None, description=\"Type of entity\", title=\"Entity Type\"\n )\n overall_risk_score: Optional[float] = Field(\n None, description=\"Overall risk score (0-100)\", title=\"Overall Risk Score\"\n )\n risk_level: Optional[str] = Field(", + "detail": "spectragraph-types.src.spectragraph_types.risk_profile", + "documentation": {} + }, + { + "label": "Script", + "kind": 6, + "importPath": "spectragraph-types.src.spectragraph_types.script", + "description": "spectragraph-types.src.spectragraph_types.script", + "peekOfCode": "class Script(BaseModel):\n \"\"\"Represents a script or code file with analysis and security information.\"\"\"\n script_id: str = Field(\n ..., description=\"Unique script identifier\", title=\"Script ID\"\n )\n name: Optional[str] = Field(None, description=\"Script name\", title=\"Name\")\n language: Optional[str] = Field(\n None, description=\"Programming language\", title=\"Language\"\n )\n type: Optional[str] = Field(", + "detail": "spectragraph-types.src.spectragraph_types.script", + "documentation": {} + }, + { + "label": "Session", + "kind": 6, + "importPath": "spectragraph-types.src.spectragraph_types.session", + "description": "spectragraph-types.src.spectragraph_types.session", + "peekOfCode": "class Session(BaseModel):\n \"\"\"Represents a user session with device and activity information.\"\"\"\n session_id: str = Field(\n ..., description=\"Unique session identifier\", title=\"Session ID\"\n )\n user_id: Optional[str] = Field(None, description=\"User identifier\", title=\"User ID\")\n service: Optional[str] = Field(\n None, description=\"Service or platform\", title=\"Service\"\n )\n start_time: Optional[str] = Field(", + "detail": "spectragraph-types.src.spectragraph_types.session", + "documentation": {} + }, + { + "label": "SocialProfile", + "kind": 6, + "importPath": "spectragraph-types.src.spectragraph_types.social", + "description": "spectragraph-types.src.spectragraph_types.social", + "peekOfCode": "class SocialProfile(BaseModel):\n \"\"\"Represents a social media profile with engagement metrics.\"\"\"\n username: str = Field(\n ..., description=\"Username on the social platform\", title=\"Username\"\n )\n profile_url: Optional[str] = Field(\n None, description=\"URL to the user's profile page\", title=\"Profile URL\"\n )\n platform: Optional[str] = Field(\n None, description=\"Name of the social media platform\", title=\"Platform\"", + "detail": "spectragraph-types.src.spectragraph_types.social", + "documentation": {} + }, + { + "label": "SSLCertificate", + "kind": 6, + "importPath": "spectragraph-types.src.spectragraph_types.ssl_certificate", + "description": "spectragraph-types.src.spectragraph_types.ssl_certificate", + "peekOfCode": "class SSLCertificate(BaseModel):\n \"\"\"Represents an SSL/TLS certificate with validation and security details.\"\"\"\n subject: str = Field(\n ..., description=\"Certificate subject (domain name)\", title=\"Subject\"\n )\n issuer: Optional[str] = Field(\n None,\n description=\"Certificate authority that issued the certificate\",\n title=\"Issuer\",\n )", + "detail": "spectragraph-types.src.spectragraph_types.ssl_certificate", + "documentation": {} + }, + { + "label": "Username", + "kind": 6, + "importPath": "spectragraph-types.src.spectragraph_types.username", + "description": "spectragraph-types.src.spectragraph_types.username", + "peekOfCode": "class Username(BaseModel):\n \"\"\"Represents a username or handle on a platform with associated profile information.\"\"\"\n username: str = Field(..., description=\"Username or handle\", title=\"Username\")\n platform: Optional[str] = Field(\n None, description=\"Platform or service where username is used\", title=\"Platform\"\n )\n display_name: Optional[str] = Field(\n None, description=\"Display name associated with username\", title=\"Display Name\"\n )\n created_at: Optional[str] = Field(", + "detail": "spectragraph-types.src.spectragraph_types.username", + "documentation": {} + }, + { + "label": "CryptoWallet", + "kind": 6, + "importPath": "spectragraph-types.src.spectragraph_types.wallet", + "description": "spectragraph-types.src.spectragraph_types.wallet", + "peekOfCode": "class CryptoWallet(BaseModel):\n \"\"\"Represents a cryptocurrency wallet.\"\"\"\n address: str = Field(..., description=\"Wallet address\", title=\"Wallet Address\")\n node_id: Optional[str] = Field(\n None, description=\"Wallet Explorer node ID\", title=\"Node ID\"\n )\nclass CryptoWalletTransaction(BaseModel):\n \"\"\"Represents a cryptocurrency transaction.\"\"\"\n source: CryptoWallet = Field(\n ..., description=\"Source wallet\", title=\"Source Wallet\"", + "detail": "spectragraph-types.src.spectragraph_types.wallet", + "documentation": {} + }, + { + "label": "CryptoWalletTransaction", + "kind": 6, + "importPath": "spectragraph-types.src.spectragraph_types.wallet", + "description": "spectragraph-types.src.spectragraph_types.wallet", + "peekOfCode": "class CryptoWalletTransaction(BaseModel):\n \"\"\"Represents a cryptocurrency transaction.\"\"\"\n source: CryptoWallet = Field(\n ..., description=\"Source wallet\", title=\"Source Wallet\"\n )\n target: Optional[CryptoWallet] = Field(\n None, description=\"Target wallet\", title=\"Target Wallet\"\n )\n hash: Optional[str] = Field(\n None, description=\"Transaction hash\", title=\"Transaction Hash\"", + "detail": "spectragraph-types.src.spectragraph_types.wallet", + "documentation": {} + }, + { + "label": "CryptoNFT", + "kind": 6, + "importPath": "spectragraph-types.src.spectragraph_types.wallet", + "description": "spectragraph-types.src.spectragraph_types.wallet", + "peekOfCode": "class CryptoNFT(BaseModel):\n \"\"\"Represents a Non-Fungible Token (NFT) held or minted by a wallet.\"\"\"\n wallet: CryptoWallet = Field(..., description=\"Source wallet\", title=\"Wallet\")\n contract_address: str = Field(\n ...,\n description=\"Address of the NFT smart contract (ERC-721/1155)\",\n title=\"Contract Address\",\n )\n token_id: str = Field(\n ...,", + "detail": "spectragraph-types.src.spectragraph_types.wallet", + "documentation": {} + }, + { + "label": "Weapon", + "kind": 6, + "importPath": "spectragraph-types.src.spectragraph_types.weapon", + "description": "spectragraph-types.src.spectragraph_types.weapon", + "peekOfCode": "class Weapon(BaseModel):\n \"\"\"Represents a weapon with detailed specifications and forensic information.\"\"\"\n name: str = Field(..., description=\"Weapon name or identifier\", title=\"Name\")\n type: Optional[\n Literal[\n \"firearm\",\n \"melee\",\n \"explosive\",\n \"bladed\",\n \"blunt\",", + "detail": "spectragraph-types.src.spectragraph_types.weapon", + "documentation": {} + }, + { + "label": "WebTracker", + "kind": 6, + "importPath": "spectragraph-types.src.spectragraph_types.web_tracker", + "description": "spectragraph-types.src.spectragraph_types.web_tracker", + "peekOfCode": "class WebTracker(BaseModel):\n \"\"\"Represents a web tracking technology with privacy and compliance information.\"\"\"\n tracker_id: str = Field(\n ..., description=\"Unique tracker identifier\", title=\"Tracker ID\"\n )\n name: Optional[str] = Field(None, description=\"Tracker name\", title=\"Name\")\n type: Optional[str] = Field(\n None, description=\"Type of tracker (analytics, advertising, etc.)\", title=\"Type\"\n )\n domain: Optional[str] = Field(", + "detail": "spectragraph-types.src.spectragraph_types.web_tracker", + "documentation": {} + }, + { + "label": "Website", + "kind": 6, + "importPath": "spectragraph-types.src.spectragraph_types.website", + "description": "spectragraph-types.src.spectragraph_types.website", + "peekOfCode": "class Website(BaseModel):\n \"\"\"Represents a website with its URL, domain, and redirect information.\"\"\"\n url: HttpUrl = Field(\n ..., description=\"Full URL of the website\", title=\"Website URL\"\n )\n redirects: Optional[List[HttpUrl]] = Field(\n [], description=\"List of redirects from the website\", title=\"Redirects\"\n )\n domain: Optional[Domain] = Field(\n None, description=\"Domain information for the website\", title=\"Domain\"", + "detail": "spectragraph-types.src.spectragraph_types.website", + "documentation": {} + }, + { + "label": "Whois", + "kind": 6, + "importPath": "spectragraph-types.src.spectragraph_types.whois", + "description": "spectragraph-types.src.spectragraph_types.whois", + "peekOfCode": "class Whois(BaseModel):\n \"\"\"Represents WHOIS domain registration information.\"\"\"\n domain: str = Field(..., description=\"Domain name\", title=\"Domain\")\n registrar: Optional[str] = Field(\n None, description=\"Domain registrar name\", title=\"Registrar\"\n )\n org: Optional[str] = Field(\n None,\n description=\"Organization name associated with the domain\",\n title=\"Organization\",", + "detail": "spectragraph-types.src.spectragraph_types.whois", + "documentation": {} + } +] \ No newline at end of file diff --git a/README.md b/README.md index 875f718..b4d61df 100644 --- a/README.md +++ b/README.md @@ -1,129 +1,302 @@ -# 🌌 SpectraGraph +

+ + + + SpectraGraph + +

+ + + + The Open-Source OSINT Intelligence Studio , Ethical investigations, transparent reporting, and repeatable graph analysis. + -
-![SWoC 2026](https://img.shields.io/badge/SWoC-2026-orange?style=for-the-badge) ![License: AGPL-3.0](https://img.shields.io/badge/License-AGPL--3.0-blue.svg?style=for-the-badge) + ![Docker Support](https://img.shields.io/badge/Docker-Supported-blue?style=for-the-badge&logo=docker) + ![Build Status](https://img.shields.io/badge/Build-Passing-brightgreen?style=for-the-badge) -## **The Open-Source OSINT Intelligence Studio** *Ethical investigations, transparent reporting, and repeatable graph analysis.* -[Explore Live Demo](https://sr-857.github.io/SpectraGraph/landing/) • [Report a Bug](https://github.com/your-repo/issues) • [SWoC Guide](./docs/HACKATHON_BOOTSTRAP.md) +

+ SWoC 2026 Badge + +    + + SWoC Logo + +

+ +[Explore Live Demo](https://sr-857.github.io/SpectraGraph/landing/) | [Report a Bug](https://github.com/sr-857/SpectraGraph/issues) | [SWoC Guide](./docs/HACKATHON_BOOTSTRAP.md) --- + + ## ✨ Why SpectraGraph? -SpectraGraph empowers analysts, journalists, and incident responders to map relationships across digital footprints without sacrificing data custody. -- ⚡️ **Graph-first workspace** with fluid rendering and multiple visual modes. -- 🧠 **Live, modular transforms** that enrich entities as you explore. -- 🛡️ **Built for rigor**, ensuring investigation workflows are defensible end-to-end. ---- -### 🌟 Hall of Fame +**SpectraGraph** enables analysts, journalists, and incident responders to discover, analyze, and visualize relationships across digital footprints—without compromising data ownership or investigative integrity. - - - -### _Want to see your avatar here? [Make your first contribution today!](CONTRIBUTING.md)_ +- ⚡ **Graph-first workspace** + + Intuitive, high-performance graph visualizations with multiple viewing modes for exploring complex relationships. + + + +- 🧠 **Live, modular transforms** + + Plug-and-play enrichment modules that dynamically expand entities as investigations progress. + + +- 🛡️ **Built for investigative rigor** + End-to-end traceability ensures workflows remain transparent, reproducible, and defensible. +--- + + ## 🏗 System Architecture -Understanding the flow between the distributed components is essential for contributors. SpectraGraph uses a **Producer-Consumer** model to handle heavy OSINT workloads. + + + +SpectraGraph is built using a **Producer–Consumer architecture**, enabling asynchronous processing of OSINT tasks. This design ensures scalability, responsiveness, and fault isolation across distributed components. + + + + ```mermaid + graph TD + subgraph "Frontend Layer" + UI[Vite/React Dashboard] + end + + subgraph "API Gateway (FastAPI)" + API[FastAPI Router] + Vault[Vault Secret Manager] + end + + subgraph "Orchestration" + Broker((Redis Queue)) + Worker[Celery Transform Worker] + end + + subgraph "Persistence Layer" + PG[(PostgreSQL: Facts)] + Graph[(Neo4j: Relationships)] + end + + UI -->|Trigger Investigation| API + API -->|Encrypt Secrets| Vault + API -->|Enqueue Task| Broker + Broker -->|Execute| Worker + Worker -->|Fetch Signals| ExternalAPI[OSINT APIs] + Worker -->|Store Facts| PG + Worker -->|Map Edges| Graph + Graph -->|Visual Sync| UI + ``` + + --- + + ## 🚀 1-Minute Quick Start -Get the "Command Center" running in under 60 seconds. -# 1. Clone the repo -``` -git clone [https://github.com/sr-857/SpectraGraph.git](https://github.com/sr-857/SpectraGraph.git) + + +Get the **SpectraGraph Command Center** running locally in under 60 seconds. + + + +> **Prerequisites** + +> - Git installed + +> - Docker & Docker Compose installed + + + +### 1️⃣ Clone the Repository + +```bash + +git clone https://github.com/sr-857/SpectraGraph.git + cd SpectraGraph -``` -# 2. Initialize Environment ``` + + + +### 2️⃣ Initialize Environment Variables + +```bash + cp .env.example .env -``` -# 3. Launch the Stack (Docker Required) ``` + +💡 You can run SpectraGraph without adding any API keys initially. + + + +### 3️⃣ Launch the Full Stack (Docker Required) + +```bash + make dev + ``` + + | Service | URL | Purpose | | :--- | :--- | :--- | | **Frontend** | `http://localhost:3000` | Investigative UI & Dashboard | | **API Docs** | `http://localhost:5001/docs` | Swagger/OpenAPI interactive docs | | **Neo4j** | `http://localhost:7474` | Direct Graph Database access | ---- + + + + +--- + + ## 🧩 Anatomy of a Transform -Adding a new OSINT source is modular. Every transform follows a strict lifecycle within the `spectragraph-transforms/` package. -### Logic Flow -1. **Preprocess:** Validate the entity (e.g., Is this a valid IPv4?). -2. **Scan:** Authenticate with Vault and call the external OSINT API. -3. **Normalize:** Map the raw JSON response to **Shared Pydantic Types**. -### Code Template + +SpectraGraph uses **Transforms** to connect with external OSINT sources. + +Each transform is a **self-contained, modular unit**, making it easy to add new data sources without affecting the rest of the system. + + + +All transforms live inside the: + +```bash + +spectragraph-transforms/ + +``` + + + +directory and follow a **consistent lifecycle**. + + + + + +### 🔄 Transform Logic Flow + + + +Every transform executes in three clear steps: + + + +1. **Preprocess** + + Validate the input entity + + _Example: Check whether the provided value is a valid IPv4 address._ + + + +2. **Scan** + + Securely authenticate using Vault and query the external OSINT API. + + + +3. **Normalize** + + Convert the raw API response into **shared Pydantic data models** so it can be stored and visualized consistently. + + + +--- + + + +### 🧪 Minimal Transform Template + + + ```python + class NewOSINTTransform(BaseTransform): + """ - To contribute a new transform, subclass BaseTransform - and implement the scan logic. + + Example transform template. + + Subclass BaseTransform and implement the scan method. + """ + + + def scan(self, target: str, api_key: str): - # Your logic here + + # Call the external OSINT service + results = call_external_api(target, api_key) + + + + # Normalize results into shared data models + return self.normalize(results) + ``` --- - ## ⚙️ Configuration The system environment is split into logical categories for better scannability. @@ -142,9 +315,9 @@ The system environment is split into logical categories for better scannability. | Variable | Purpose | Example | | :--- | :--- | :--- | -| `DATABASE_URL` | Postgres Connection | `postgresql://user:pass@localhost:5433/db` | -| `NEO4J_URI_BOLT` | Neo4j Connection | `bolt://neo4j:7687` | -| `REDIS_URL` | Celery Broker | `redis://redis:6379/0` | +| `DATABASE_URL` | PostgreSQL database connection | `postgresql://user:pass@localhost:5433/db` | +| `NEO4J_URI_BOLT` |Neo4j graph database (Bolt)| `bolt://neo4j:7687` | +| `REDIS_URL` | Redis message broker for Celery| `redis://redis:6379/0` | @@ -158,45 +331,177 @@ The system environment is split into logical categories for better scannability. + + + --- + + ## ❓ Troubleshooting + + ### Database Connection Issues + + If you see database connection errors during startup: -1. **Check Docker is running**: `docker ps` -2. **Start services**: `make dev` -3. **Check health**: `curl http://localhost:5001/health/db` -4. **View logs**: `docker-compose logs postgres` + + +1. **Check Docker is running**: + +```bash + +docker ps + +``` + + + +2. **Start services**: + +```bash + +make dev + +``` + +3. **Check health**: + +```bash + +curl http://localhost:5001/health/db + +``` + +4. **View logs**: + +```bash + +docker-compose logs postgres + +``` The application will automatically retry connections (5 times) and provide a detailed diagnostic message if it fails. + | Issue | Symptom | Solution | | :--- | :--- | :--- | | **Database Connection** | `Connection Refused` | Ensure Docker is running and ports `5433` (Postgres) and `7687` (Neo4j) are free. | | **Celery Tasks Stuck** | Tasks remain 'Pending' | Check Redis logs: `docker logs spectragraph-redis`. Ensure the worker is initialized. | | **UI Blank Screen** | `VITE_API_URL` error | Ensure `.env` has the correct API host (usually `http://localhost:5001`). | + + For additional setup issues and resolutions, see the full [Troubleshooting Guide](./docs/TROUBLESHOOTING.md). + + +--- + + + +## 🖼️ View of the Website + + + +Below are previews of the SpectraGraph web interface to help new users understand the look and workflow of the platform. + + + + + +SpectraGraph Landing Page + + + +--- + + + + + +SpectraGraph Investigation Dashboard + + + +--- + + + + + +SpectraGraph Graph View + + + --- + + + + +SpectraGraph Transform Panel + + + + + + + +--- + + + ## 🗺 SWoC 2026 Roadmap + + - [ ] **Websocket Streams:** Real-time investigation status updates. + - [ ] **Transform Marketplace:** Plugin-style architecture for easy community PRs. + - [ ] **Visual Overhaul:** Dark-mode "Command Center" UI aesthetics. + + **Contributing:** Please read [CONTRIBUTING.md](./CONTRIBUTING.md) and look for the `SWoC` label on issues! + + --- + + +### 🌟 Hall of Fame + + + + + + + + + + + +### _Want to see your avatar here? [Make your first contribution today!](CONTRIBUTING.md)_ + + + ## 📄 License + + Licensed under **AGPL-3.0**. See the [LICENSE](./LICENSE) file for the full text. + + --- + + > **Note:** SpectraGraph is built for ethical investigations. Please ensure your use cases adhere to our [Ethics & Safety Guidelines](./ETHICS.md). + diff --git a/i.png b/i.png new file mode 100644 index 0000000000000000000000000000000000000000..b8ae1f4a1bc405718d13e69124ef2baf9cc59987 GIT binary patch literal 1643284 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

fmq&tDN!8P8FTPeZTK!xOHMZ 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 < z!C2SGn0u|P!js&+D0t$19AGxq>*eD~)^)Y_TIBI%b*$g_-O0(a3dKBKY2qI6ChlEi zr=C^kr!`-6{A$BF)OveGx;S-(Z{?G7_rbr{A_H>QA**@KmHerVrda9}CXdd{%U$n- zGqzFTNi`D@=N-P%W9L+Y-BRsGF=e3p@{>2B2L+6Hb-EmR#l21b^itoUCdyjB(|ysF zF|t$@GL_IEFXb5{w9e_&6OIiHe2u~)KpdRL%n=9oX-wXZBZJ!MgVven>)#0Dz0Zj8 ziX`HUqWaxf`YriFau>BkOs0_S$eO4%cD7{`r)XnfccfWATmOvxv;IQ-!$P9x8k9{? zxv;&WUXLw2aGSq5tJ8Nwc(x&*E@6$XoRQBqI%mhkVRv4Un`fkW^neDw5y$=olsX6F zAG&8j`Lo(espA>@p<1HS{(%$rti1 zD=UbRsF(fOGau5X%0wxd++%_gsE{!JP-R5!DL9o4buevUr8FH=s)O~r7rCJYzRz_C zvwjWQIX<&%MnICwZHD`#_bkUc4L4%qj z{T<GXOuJN4Dw7}W&!m+dMj!ta6e71jpF^swx*7aqJA3@LzvQU!x4gZ{ zo(FoLbSC;6=w7BgYQ59R2>z*$i}?TNLt|~OCpc^N2kQkjmYWc2>B}b0?e5Hn)c^V; zLhnEI%)GfbKkw%slpxR5;00l=4=31O*t2n%9%U;bVNr{=tegZqvow2oN@fsz`^wxKyiUSu&n}EdD z`{kHR39Q7rCHmS_TtBl)YK-VET7fTjU9bC^HD;4OvcxRAmB&d4vIUF0TM3XJ6)s5OL$plD2GtkvMbo+CTp%onUN6YR(tyvqlkGl?v28hyAM90R8Mh8r zavG^PLN`hk7zyR({Y~U@S!@L!+f7WM?)a$wQ1~v8b#98TM^&SnL)^7?uTgs^J8I9_ z6Vs?o17`{}>c$$`cz-$Xgkl_WC31^dosR5*BR3Cd9G#VU7|GRC1HjdRnE$o_KhSC^7WWHqVaF~G zO|v36*SK?Ufo~7SL+M-M{{Zf#SB14bm&x&8>{IHc+Pdz(FV{+K{i3OW(x0xz`yIF| zG`0oQ^BL#;PYZbFn)&C;`{@h$?)GwjSxLJ3e#Nuzv{A}f+gek$w&-j<3uj;bh5UGe z*FQTLoTOQblFHbw{S*;~0|}CX;H`5g*IPr8onHH)hR{YCJx0xHWy>E`1{N9q%e;jk zIP3NMo)i8r!qdz?XD?tEZEN5~UjaMI?F7P;AlDz7H94)L|M>?8vK2P@P?5O~?5&Qc z)r=|G%AK+WL5Q>yr?`Gn1^dhqPyToIs_-plAAi8Y+_um2XyqH%v2QT% z>@$;ne(tTA$x-xMUMtAj=dpV`a-#E_lV6lf<+QIgD)&Sf6-`m*+X5QIrDm){ZSKqUrN_zg~VdJ^; zRu4^&LK~?)z3iCx-cOwPrw)BMH!IXIc6=c}!(B+U;dlc!^Yg>>d&hxSaPQudBCsBOn;I0GrNq$d}C69pMKJyb`qyLN07a zUApkXj6~U8gWmjwybF8JOuE=^aYSaZ+4L$=VeVvdbO(qQhVA2*HHEuvUAYy^Gdl7z z^E?s&=*Zz0r3yeE=f;cW#e0?IyEvKn_p zX3`eZNLlEt(`lBr%iIR+_DDxSotzlY2-U?jPOIHht>cDD+% zeQ_SVsFVUyk}+;alNb1lQl*KKoLz0Ee=&6Z+dYeHcSeK~%qx9&rHJnjHL!lz4?38rzRb5e-p7FoNj6FAB5dUShM-{QEhp|IJYPF3(uMfyZX{lLu z;rlXajD@tXDupW5=@znH>=j6iIERiFV+(DL2>-TCojs~myXuLo5q&giM{!|_Fvj

dn%H)i}sQH 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⪼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ⅆ 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�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 z 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