This is a major release that has substantially changed both the interfaces available and the formats used for all three major components, language graph, instance model, and attack graph.
Instance Model:
- the language classes factory has been removed and replaced by the lightweight `ModelAsset` class, this means that the only requirement to create a model now is a `LanguageGraph`.
- `ModelAssets` should be created directly using the `Model` `add_asset` method instead of creating them separately and then adding them to the `Model` afterwards.
- Associations are no longer an explicit concept in the instance model, but they are properties of the `ModelAsset`. Each `ModelAsset` has an `associations` dictionary that is keyed by the relevant fieldname and leads to the associated `ModelAssets` via that association.
- Associations are now added by using the `add_associated_assets` method of the `ModelAsset`. This adds the relevant assets on both ends of the association, it does not need to be called twice for each of the sides.
- There is partial validation of the `ModelAssets`, but more rigorous validation may be added later on.
- The model updater has been itself updated(oh, irony) and should now be able to handle converting older models to the current format. See the [README Command Line section](https://github.com/mal-lang/mal-toolbox?tab=readme-ov-file#command-line-client) `upgrade-model` for more details.
- Improved `__repr__` methods to make their output more legible.
Attack Graph:
- Analogously to the `Model` and `ModelAsset`, `AttackGraphNodes` are now created when adding them to the `AttackGraph` using the `add_node` method.
- `AttackGraphNode` and `Attacker` classes are now hashable and use sets and id keyed dictionaries in the `AttackGraph`.
- Improved `__repr__` methods to make their output more legible.
Language Graph:
- associations are now keyed by the relevant fieldname for `LanguageGraphAssets`
- added Detectors
- Improved `__repr__` methods to make their output more legible.