Remove the ANTHROPIC_OAUTH provider type, anthropic_oauth_provider,
AnthropicOAuthWorker, and all associated UI authentication flows
from settings_controller. Update provider_types, factory, message
format adapter mapping, and migration maps accordingly.
Classify thunk and library functions (FUNC_THUNK | FUNC_LIB) as
symbol_type "external" instead of "function", matching the classification
already used for graph nodes in _ida_function_to_node_dict().
Address is unchanged (func.start_ea is always the correct stub address
in IDA for thunk/library functions).
External/thunk functions were all exported as node_type="function",
making the web UI unable to color them differently. Now classifies
externals using IDA FUNC_LIB/FUNC_THUNK flags on export, and adds
EXTERNAL to NodeType enum and graph store queries.
Add qt_compat.py shim that tries PySide6 first, falls back to PyQt5,
and re-exports all Qt classes under unified names. Replace all direct
PySide6 imports across 22 files with qt_compat imports. Normalize
scoped enums to flat enums for PyQt5 compatibility, replace .exec()
with exec_dialog() wrapper, and fix QTimeZone.utc() portability.
Bump version to 1.2.0 and add IDA 9.1 to supported versions.
Detect conflicting or missing PySide6 installations during plugin init
and guard OnCreate against the fatal Qt abort() that crashes IDA when
platform plugins are missing. The plugin stays loaded but disables UI,
showing a clear diagnostic message instead of crashing.
Add create_vulnerable_via_edges() to TaintAnalyzer for BFS-based
reachability from entry points to vulnerable nodes. Improve source/sink
detection with tiered matching: function name normalization, callee
name fallback, and deduplication of taint edges.
Fix orphaned tool results in query_controller by reconstructing missing
assistant messages with tool_calls when native storage callback was skipped.
Add ESC key shortcut to cancel edit mode without saving in QueryTab and
ExplainTab. Wire SecurityAnalysisWorker to emit VULNERABLE_VIA edge count.
Derive _ALLOWED_EDGE_TYPES from EdgeType enum via is_structural()
so the agent can create security edges (VULNERABLE_VIA, TAINT_FLOWS_TO,
etc.) and community edges (BELONGS_TO_COMMUNITY, SIBLING) in addition
to the original 4 semantic types. Structural edges remain blocked.