Generated Class Diagrams
Class diagrams are generated from the C++ codebase by clang-uml. The generated Mermaid files live under docs/diagrams/generated/ and are expected to be refreshed when the diagram config changes.
The diagrams are focused by subsystem. Do not generate a repository-wide class diagram.
Generated Groups
| Diagram | Scope |
|---|---|
problem_system |
Problem item and problem manager. |
parser_sacm_tree |
Parser model, SACM domain model, and tree model. |
project_storage |
Project manifest, file entries, project load report, project service, and app state. |
controllers |
App event bus and controller layer. |
ui_panels |
Panel model/callback structs and panel entry points. |
review_ai |
Review items, proposals, proposal storage, AI service, AI task runner, and AI review payloads. |
Core Relationships
This hand-authored diagram mirrors the generated groups and stays visible even if the generated Mermaid files have not been refreshed yet.
classDiagram
class AppRuntimeState
class AppEvents
class AppState
class AssuranceTree
class ProblemsManager
class ElementEditController
class ReviewController
class ProposalController
class ProjectController
class AiReviewController
class AssuranceCase
class AssuranceCasePackage
class AssuranceProject
AppRuntimeState --> AppEvents
AppRuntimeState --> AppState
AppRuntimeState --> AssuranceTree
AppRuntimeState --> ProblemsManager
AppRuntimeState --> ElementEditController
AppRuntimeState --> ReviewController
AppRuntimeState --> ProposalController
AppRuntimeState --> ProjectController
AppRuntimeState --> AiReviewController
AppState --> AssuranceCase
AppState --> AssuranceCasePackage
AppState --> AssuranceProject
Problem System
classDiagram
class C_0001878241832316903513["core::ProblemsManager"]
class C_0001878241832316903513 {
+AddOrUpdateProblem() void
+AddProblem() void
+ClearProblems() void
+ClearProblemsBySource() void
+ClearProblemsForElement() void
+ClearProblemsForElementAndSource() void
+GetProblemById() [const] std::optional<ProblemItem>
+GetProblems() [const] const std::vector<ProblemItem> &
+RemoveProblem() void
}
class C_0000213003322182496209["core::ProblemItem"]
class C_0000213003322182496209 {
+element_id : std::string
+guideline_id : std::string
+id : std::string
+message : std::string
+quick_fix_label : std::string
+quick_fix_payload : std::string
+severity : ProblemSeverity
+source : ProblemSource
+type : std::string
}
C_0001878241832316903513 o-- C_0000213003322182496209 : -problems_
%% Generated with clang-uml, version 0.6.2
%% LLVM version Ubuntu clang version 18.1.3 (1ubuntu1)
Parser, SACM, And Tree
classDiagram
class C_0012699810395856657409["core::TreeNode"]
class C_0012699810395856657409 {
+away_module_identifier : std::string
+challenge_anchor_id : std::string
+challenge_relationship_id : std::string
+challenge_side : ChallengeSide
+challenge_target_id : std::string
+challenge_target_is_relationship : bool
+group : ElementGroup
+group1_children : std::vector<TreeNode *>
+group2_attachments : std::vector<TreeNode *>
+has_name : bool
+has_name_secondary : bool
+id : std::string
+is_counter_source : bool
+label : std::string
+label_secondary : std::string
+left_overhang : int
+parent : TreeNode *
+right_overhang : int
+role : NodeRole
+subtree_width : int
+undeveloped : bool
+uninstantiated : bool
}
class C_0008695457393642795255["core::AssuranceTree"]
class C_0008695457393642795255 {
+Build() AssuranceTree$
+nodes : std::vector<std::unique_ptr<TreeNode>>
+orphans : std::vector<TreeNode *>
+root : TreeNode *
}
class C_0012872520490416317341["sacm::MultiLangText"]
class C_0012872520490416317341 {
+get() [const] std::string
+get_primary() [const] std::string
+has() [const] bool
+has_secondary() [const] bool
+set() void
+texts : std::map<std::string,std::string>
}
class C_0012772506654234102188["sacm::SacmElement"]
class C_0012772506654234102188 {
+abstractForm : std::string
+citedElement : std::string
+description : std::string
+description_ml : MultiLangText
+gid : std::string
+id : std::string
+isAbstract : bool
+isCitation : bool
+name : std::string
+name_ml : MultiLangText
+taggedValues : std::vector<TaggedValue>
}
class C_0000594752243637295909["sacm::Claim"]
class C_0000594752243637295909 {
+assertionDeclaration : std::string
+content : std::string
+content_ml : MultiLangText
+metaClaims : std::vector<std::string>
+undeveloped : bool
}
class C_0016201727617268315389["sacm::ArgumentReasoning"]
class C_0016201727617268315389 {
+content : std::string
+content_ml : MultiLangText
+structure : std::string
+undeveloped : bool
}
class C_0010402830211990012660["sacm::ArtifactReference"]
class C_0010402830211990012660 {
+referencedArtifact : std::string
}
class C_0010093363535350823343["sacm::AssertedRelationship"]
class C_0010093363535350823343 {
+assertionDeclaration : std::string
+isCounter : bool
+metaClaims : std::vector<std::string>
+sources : std::vector<std::string>
+targets : std::vector<std::string>
}
class C_0001556272983761822546["sacm::AssertedInference"]
class C_0001556272983761822546 {
+reasoning : std::string
}
class C_0009164996540627157343["sacm::AssertedContext"]
class C_0009164996540627157343 {
}
class C_0016551471758690947987["sacm::AssertedEvidence"]
class C_0016551471758690947987 {
}
class C_0001728852923295955920["sacm::ArgumentPackage"]
class C_0001728852923295955920 {
+argumentReasonings : std::vector<ArgumentReasoning>
+artifactReferences : std::vector<ArtifactReference>
+assertedContexts : std::vector<AssertedContext>
+assertedEvidences : std::vector<AssertedEvidence>
+assertedInferences : std::vector<AssertedInference>
+claims : std::vector<Claim>
+terminologyPackages : std::vector<TerminologyPackage>
}
class C_0010448209917370529791["sacm::AssuranceCasePackage"]
class C_0010448209917370529791 {
+argumentPackages : std::vector<ArgumentPackage>
+artifactPackages : std::vector<ArtifactPackage>
+namespace_prefix : std::string
+namespace_uri : std::string
+terminologyPackages : std::vector<TerminologyPackage>
}
C_0012699810395856657409 --> C_0012699810395856657409 : +group1_children
C_0012699810395856657409 --> C_0012699810395856657409 : +group2_attachments
C_0012699810395856657409 --> C_0012699810395856657409 : +parent
C_0008695457393642795255 --> C_0012699810395856657409 : +root
C_0008695457393642795255 --> C_0012699810395856657409 : +orphans
C_0008695457393642795255 o-- C_0012699810395856657409 : +nodes
C_0012772506654234102188 o-- C_0012872520490416317341 : +name_ml
C_0012772506654234102188 o-- C_0012872520490416317341 : +description_ml
C_0000594752243637295909 o-- C_0012872520490416317341 : +content_ml
C_0012772506654234102188 <|-- C_0000594752243637295909 :
C_0016201727617268315389 o-- C_0012872520490416317341 : +content_ml
C_0012772506654234102188 <|-- C_0016201727617268315389 :
C_0012772506654234102188 <|-- C_0010402830211990012660 :
C_0012772506654234102188 <|-- C_0010093363535350823343 :
C_0010093363535350823343 <|-- C_0001556272983761822546 :
C_0010093363535350823343 <|-- C_0009164996540627157343 :
C_0010093363535350823343 <|-- C_0016551471758690947987 :
C_0001728852923295955920 o-- C_0000594752243637295909 : +claims
C_0001728852923295955920 o-- C_0016201727617268315389 : +argumentReasonings
C_0001728852923295955920 o-- C_0010402830211990012660 : +artifactReferences
C_0001728852923295955920 o-- C_0001556272983761822546 : +assertedInferences
C_0001728852923295955920 o-- C_0009164996540627157343 : +assertedContexts
C_0001728852923295955920 o-- C_0016551471758690947987 : +assertedEvidences
C_0012772506654234102188 <|-- C_0001728852923295955920 :
C_0010448209917370529791 o-- C_0001728852923295955920 : +argumentPackages
C_0012772506654234102188 <|-- C_0010448209917370529791 :
%% Generated with clang-uml, version 0.6.2
%% LLVM version Ubuntu clang version 18.1.3 (1ubuntu1)
Project Storage
classDiagram
class C_0002250599518939653669["core::ProjectFileEntry"]
class C_0002250599518939653669 {
+elementIndexHash : std::string
+hashAlgorithm : std::string
+id : std::string
+lastError : std::string
+parseStatus : std::string
+rawHash : std::string
+relationshipGraphHash : std::string
+relativePath : std::filesystem::path
+role : ProjectFileRole
+semanticHash : std::string
+state : ProjectFileState
}
class C_0016361120993294187360["core::AssuranceProject"]
class C_0016361120993294187360 {
+createdUtc : std::string
+createdWith : std::string
+defaultLanguage : std::string
+description : std::string
+files : std::vector<ProjectFileEntry>
+formatVersion : std::string
+id : std::string
+lastOpenedWith : std::string
+modifiedUtc : std::string
+name : std::string
+rootPath : std::filesystem::path
+validationMode : std::string
}
class C_0014391661803423093314["core::ProjectLoadStep"]
class C_0014391661803423093314 {
+label : std::string
+message : std::string
+status : ProjectLoadStepStatus
}
class C_0014821650531329809433["core::ProjectLoadReport"]
class C_0014821650531329809433 {
+has_failures() [const] bool
+externalChanges : std::vector<ExternalFileChange>
+showPopup : bool
+steps : std::vector<ProjectLoadStep>
+warnings : std::vector<std::string>
}
class C_0000404631206007732817["core::AppState"]
class C_0000404631206007732817 {
+EnsureAuditStoreForFirstArgument() void
+bump_case_revision() void
+create_empty_project() bool
+create_project_evidence_register() bool
+create_project_from_sacm() bool
+create_project_j3377_cae_register() bool
+create_project_sacm_file() bool
+has_projected_package() [const] bool
+import_sacm_file() bool
+load_file() bool
+mark_dirty() void
+open_project() bool
+open_project_file() bool
+projected_package() [const] const sacm::AssuranceCasePackage &
+refresh_tracked_file_hashes() bool
+save_current_document() bool
+save_file() bool
+save_project() bool
+sync_library_document() void
+active_project_file_path : std::filesystem::path
+active_project_file_role : ProjectFileRole
+case_revision : std::uint64_t
+current_project : std::optional<AssuranceProject>
+has_unsaved_changes : bool
+last_project_load_report : ProjectLoadReport
+library_document : std::unique_ptr<sacm_adapter::LibraryDocument>
+load_warnings : std::vector<std::string>
+loaded_case : std::optional<parser::AssuranceCase>
+loaded_file_path : std::filesystem::path
+sacm_package : std::optional<sacm::AssuranceCasePackage>
+status_message : std::string
}
class C_0004251518630533706412["core::ProjectService"]
class C_0004251518630533706412 {
+AcknowledgeExternalChanges() bool$
+AddEvidenceRegister() bool$
+AddJ3377CaeRegister() bool$
+AddReviewItemsFile() bool$
+AddReviewProposalFile() bool$
+AddSacmFile() bool$
+CreateEmptyProject() bool$
+CreateProjectFromSacm() bool$
+DefaultImportedSacmFileName() std::filesystem::path$
+FindCreateProjectObstacle() CreateProjectObstacle$
+ImportSacmFile() bool$
+ManifestPath() std::filesystem::path$
+OpenProject() bool$
+PlanProjectRoot() std::filesystem::path$
+RefreshFileStatus() ProjectLoadReport$
+RemoveTrackedFile() bool$
+SaveConfidenceFile() bool$
+SaveRegisterAssessmentsFile() bool$
+SaveReviewItemsFile() bool$
+SaveReviewProposalFile() bool$
+TrackExistingFile() bool$
+WriteManifestSafely() bool$
}
class C_0006261563529291419590["sacm_adapter::LibraryDocument"]
class C_0006261563529291419590 {
}
C_0016361120993294187360 o-- C_0002250599518939653669 : +files
C_0014821650531329809433 o-- C_0014391661803423093314 : +steps
C_0000404631206007732817 ..> C_0002250599518939653669 :
C_0000404631206007732817 o-- C_0006261563529291419590 : +library_document
C_0000404631206007732817 o-- C_0016361120993294187360 : +current_project
C_0000404631206007732817 o-- C_0014821650531329809433 : +last_project_load_report
C_0004251518630533706412 ..> C_0016361120993294187360 :
C_0004251518630533706412 ..> C_0014821650531329809433 :
C_0004251518630533706412 ..> C_0002250599518939653669 :
%% Generated with clang-uml, version 0.6.2
%% LLVM version Ubuntu clang version 18.1.3 (1ubuntu1)
Controllers
classDiagram
class C_0011258537118237043733["core::reviews::ReviewItem"]
class C_0011258537118237043733 {
+applied_note : std::string
+created_utc : std::string
+draft_group_ids : std::vector<std::string>
+element_id : std::string
+guideline_ids : std::vector<std::string>
+id : std::string
+message : std::string
+proposal_id : std::optional<std::string>
+reviewer_name : std::string
+severity : std::string
+source : ReviewItemSource
+status : ReviewItemStatus
+title : std::string
+updated_utc : std::string
}
class C_0001784637889564864947["core::reviews::ReviewProposal"]
class C_0001784637889564864947 {
+affected_existing_element_ids : std::vector<std::string>
+anchor_element_id : std::string
+author_name : std::string
+base_element_hashes : std::map<std::string,std::string>
+base_model_hash : std::string
+created_utc : std::string
+id : std::string
+operations : std::vector<PatchOperation>
+review_item_id : std::string
+schema : std::string
+summary : std::string
+title : std::string
}
class C_0014251431951803862762["core::commands::CommandBus"]
class C_0014251431951803862762 {
+Execute() CommandResult
+Manifest() [const] const audit::AuditManifest &
+Open() std::unique_ptr<CommandBus>$
+RecordAcceptedDocument() bool
+SacmPath() [const] const std::filesystem::path &
+Store() [const] const audit::EventStore &
}
class C_0013513933648998836800["core::GuidelineCatalog"]
class C_0013513933648998836800 {
+document : parser::GuidelinesDocument
+entries : std::vector<GuidelineCatalogEntry>
+ids : std::unordered_set<std::string>
+review_profile_entries : std::vector<ReviewProfileCatalogEntry>
+review_profile_ids : std::unordered_set<std::string>
+source_path : std::filesystem::path
}
class C_0000597907423933914082["core::SacmElement"]
class C_0000597907423933914082 {
+artifact_location : std::string
+assertion_declaration : std::string
+away_module_identifier : std::string
+category_refs : std::vector<std::string>
+cited_element_id : std::string
+content : std::string
+content_langs : std::map<std::string,std::string>
+cse_assessment : CseAssessmentRecord
+description : std::string
+description_langs : std::map<std::string,std::string>
+evidence : EvidenceRecord
+external_reference : std::string
+gid : std::string
+gsn_identifier : std::string
+id : std::string
+is_abstract : bool
+is_citation : bool
+is_counter : bool
+meta_claim_refs : std::vector<std::string>
+name : std::string
+name_langs : std::map<std::string,std::string>
+origin_ref : std::string
+reasoning_ref : std::string
+referenced_artifact_id : std::string
+source_refs : std::vector<std::string>
+structure_ref : std::string
+target_refs : std::vector<std::string>
+type : std::string
+undeveloped : bool
}
class C_0018441795320970234485["app::controllers::ElementEditController"]
class C_0018441795320970234485 {
+ElementEditController() void
+AddAwayElement() bool
+AddChallenge() bool
+AddChildToSelected() bool
+AddTopGoal() bool
+CancelPendingRemoval() void
+CommitElementTextEdit() bool
+ConfirmPendingRemoval() bool
+CreateEvidence() std::string
+DropRelationshipReference() bool
+FlushPendingTextEdits() int
+ImportEvidenceAssessments() bool
+LinkEvidence() bool
+MoveStrategyToReasoning() bool
+PendingRemoveConsequences() [const] const std::vector<RemovalEffect> &
+PendingRemoveId() [const] const std::string &
+PendingRemoveIds() [const] const std::vector<std::string> &
+PendingRemoveMode() [const] core::RemoveMode
+PendingRemovePreviewAvailable() [const] bool
+PendingRemoveTargets() [const] const std::vector<RemovalEffect> &
+PendingRemoveWarnings() [const] const std::vector<std::string> &
+RemoveRelationship() bool
+RemoveSelected() bool
+RenumberGsnIdentifier() bool
+SetCseAttribute() bool
+SetElementUndeveloped() bool
+SetEvidenceAttribute() bool
+SetEvidenceLocation() bool
+ShouldShowRemoveConfirm() [const] bool
}
class C_0011104235723651995916["app::controllers::AiReviewController"]
class C_0011104235723651995916 {
+AiReviewController() void
+BeginReviewForSelection() void
+BeginReviewForSelection() void
+CancelPendingRequest() void
+HasPendingRequest() [const] bool
+IsReviewRunning() [const] bool
+LastParseError() [const] const std::string &
+LastRawResponse() [const] const std::string &
+MarkPendingRequestIncludesWorkingDraft() void
+PendingDebugText() [const] const std::string &
+PendingPrompt() [const] const std::string &
+PollTask() void
+SetDebugModalVisible() void
+SetPendingPrompt() void
+ShouldShowDebugModal() [const] bool
+StartPendingRequest() void
+WaitForCompletion() [const] bool
}
class C_0003317484071518590268["app::controllers::ProjectController"]
class C_0003317484071518590268 {
+BeginProjectFileCreate() void
+LoadRecentProjectsPreference() void
+RecentProjectsPreferenceJson() [const] std::string
+RefreshCreateProjectObstacle() void
+RemoveRecentProjectByPath() void
+ScanDirectory() void
+TouchCurrentProjectRecent() void
+create_project_error : std::string
+create_project_file_error : std::string
+create_project_obstacle : core::CreateProjectObstacle
+dir_path_buf : char[512]
+file_path_buf : char[512]
+open_project_path_buf : char[512]
+pending_create_project_source_sacm : std::filesystem::path
+pending_import_sacm_source : std::filesystem::path
+pending_open_project_file_entry : std::optional<core::ProjectFileEntry>
+pending_project_file_kind : ProjectFileCreateKind
+project_file_name_buf : char[256]
+project_name_buf : char[128]
+project_parent_buf : char[512]
+recent_projects : std::vector<RecentProjectEntry>
+selected_file_idx : int
+show_create_project_modal : bool
+show_overwrite_confirm : bool
+show_project_file_name_modal : bool
+show_save_before_project_file_open_modal : bool
+show_startup_project_window : bool
+xml_files : std::vector<std::string>
}
class C_0006659114052005454335["app::controllers::ProposalController"]
class C_0006659114052005454335 {
+ActiveOperationCount() [const] size_t
+BeginDraft() void
+BeginEditDraft() void
+CanSaveActiveDraft() [const] bool
+ClearActiveState() void
+ClosePreviewIfOpen() bool
+HasActiveDraftForItem() [const] bool
+IsCanvasActive() [const] bool
+creator_active : bool
+creator_generated_ids : std::map<std::string,std::string>
+creator_pending_clear_selection : bool
+creator_pending_select_create_ref : std::optional<std::string>
+creator_preview_refresh_pending : bool
+draft : core::reviews::ReviewProposal
+manager : core::reviews::ReviewProposalManager
+preview_active : bool
+preview_id : std::string
+preview_model : parser::AssuranceCase
}
class C_0005552319214775046176["app::controllers::ReviewController"]
class C_0005552319214775046176 {
+ReviewController() void
+AddDraftGroup() bool
+AddManualItem() bool
+AddOrUpdateItem() bool
+BeginDeleteReviewItem() void
+CancelDeleteReviewItem() void
+ClearAiReviewItemsForElementAndPrefix() size_t
+ClearDirty() void
+ClearProposal() bool
+ClearStorage() void
+ConfigureStorage() bool
+DeleteReviewItem() bool
+ElementReviewStateForElement() [const] core::reviews::ElementReviewState
+ElementReviewStates() [const] const core::reviews::ElementReviewStateMap &
+FilePath() [const] const std::filesystem::path &
+GetItemById() [const] std::optional<core::reviews::ReviewItem>
+IsDirty() [const] bool
+Items() [const] const std::vector<core::reviews::ReviewItem> &
+ItemsForElement() [const] std::vector<core::reviews::ReviewItem>
+MarkDirty() void
+PendingDeleteReviewItem() [const] const core::reviews::ReviewItem &
+ReloadIfChangedExternally() bool
+ResolveReviewItem() bool
+SaveIfDirty() bool
+SetAiReviewOutcome() bool
+SetManualReviewOk() bool
+SetProposal() bool
+ShouldShowDeleteConfirm() [const] bool
+StatusForElement() [const] ElementReviewStatus
}
class C_0014310741392462431627["app::controllers::ModalCoordinator"]
class C_0014310741392462431627 {
+ApplyModalRequest() void
+CancelClose() void
+ConsumeCloseRequest() bool
+RequestClose() void
+close_requested : bool
+not_implemented_feature : std::string
+show_not_implemented_modal : bool
+show_preferences_window : bool
+show_reviewer_name_prompt : bool
+show_save_before_exit_modal : bool
}
class C_0007829914580691537067["app::AppRuntimeState"]
class C_0007829914580691537067 {
+AppRuntimeState() void
+~AppRuntimeState() void
+DraftDocumentChanges() const core::drafts::DraftDocumentDiff &
+DraftDocumentHasChanges() bool
+DraftRevision() [const] std::uint64_t
+EnsureGuidelineCatalogLoaded() void
+IsProposalCanvasActive() [const] bool
+LoadAiSettingsState() void
+LoadMcpSettingsState() void
+RefreshDraftDocumentView() void
+RefreshStoredAiKeyState() void
+WorkingPackage() const sacm::AssuranceCasePackage *
+acp_controller : std::unique_ptr<controllers::AcpController>
+agent_bridge : std::unique_ptr<controllers::AgentBridgeController>
+agent_bridge_start_attempted : bool
+agent_change_revision_drawn : std::uint64_t
+agent_change_sets : core::changesets::ChangeSetStore
+agent_preview_added_ids : std::vector<std::string>
+agent_preview_case : std::optional<parser::AssuranceCase>
+ai : AiUiState
+app_state : core::AppState
+autosave_persisted_pending_edit : bool
+command_bus : std::unique_ptr<core::commands::CommandBus>
+confidence_controller : std::unique_ptr<controllers::ConfidenceController>
+current_tree : core::AssuranceTree
+document_dirty : bool
+draft_added_ids : std::vector<std::string>
+draft_canvas_view : const parser::AssuranceCase *
+draft_canvas_view_case_revision : std::uint64_t
+draft_canvas_view_draft_revision : std::uint64_t
+draft_canvas_view_mode : ui::DraftViewMode
+draft_changes_only_view : parser::AssuranceCase
+draft_document : core::drafts::DraftDocumentStore
+draft_document_changes : core::drafts::DraftDocumentDiff
+draft_document_index : core::drafts::DraftChangeIndex
+draft_document_index_case_revision : std::uint64_t
+draft_document_index_revision : std::uint64_t
+draft_document_package : sacm::AssuranceCasePackage
+draft_document_view : parser::AssuranceCase
+draft_document_view_case_revision : std::uint64_t
+draft_document_view_differs : bool
+draft_document_view_revision : std::uint64_t
+draft_frame_materialization : std::shared_ptr<const core::drafts::DraftMaterializationResult>
+draft_presentation_view : parser::AssuranceCase
+draft_revision_drawn : std::uint64_t
+draft_workspace : core::drafts::DraftWorkspaceStore
+draft_workspace_argument : std::filesystem::path
+draft_workspace_root : std::filesystem::path
+element_edit_controller : std::unique_ptr<controllers::ElementEditController>
+events : AppEvents
+guideline_catalog : std::optional<core::GuidelineCatalog>
+guideline_catalog_error : std::string
+guideline_catalog_load_attempted : bool
+inspector_model : parser::AssuranceCase
+inspector_model_case_revision : std::uint64_t
+inspector_model_draft_revision : std::uint64_t
+inspector_model_valid : bool
+last_audit_verification : std::optional<core::audit::ReplayVerificationResult>
+last_autosave_error : std::string
+layout : LayoutState
+mcp_settings : core::McpUserSettings
+mcp_status : std::string
+modal_coordinator : std::unique_ptr<controllers::ModalCoordinator>
+pending_accepted_argument_reload : bool
+pending_draft_rejection : PendingDraftRejection
+pending_reconcile_audit_store : bool
+problems_dirty : ProblemSyncDirty
+problems_manager : core::ProblemsManager
+project_controller : std::unique_ptr<controllers::ProjectController>
+proposal_controller : std::unique_ptr<controllers::ProposalController>
+rederive_views_from_library : bool
+register_controller : std::unique_ptr<controllers::RegisterController>
+review_controller : std::unique_ptr<controllers::ReviewController>
+reviewer_name : std::string
+reviewer_name_buf : char[128]
+sacm_package_tree_cache : std::map<std::string,sacm::SacmPackageTreeResult>
+selected_package_file_path : std::filesystem::path
+selected_package_node : std::optional<sacm::SacmPackageTreeNode>
+terminology : TerminologyUiState
+translation_review_marks_pending_rebuild : std::vector<std::string>
+translation_review_pending_ids : std::unordered_set<std::string>
+tree_display_order : core::TreeDisplayOrder
+tree_edit_index : core::TreeEditIndex
+tree_edit_index_valid : bool
+tree_needs_rebuild : bool
+workbench : WorkbenchState
}
class C_0000243771318467953735["app::AppEvents"]
class C_0000243771318467953735 {
+Clear() void
+Emit() [const] void
+Emit<EventT>() [const] void
+Subscribe<EventT,ListenerT>() SubscriptionId
+Unsubscribe() void
}
C_0018441795320970234485 ..> C_0007829914580691537067 :
C_0018441795320970234485 --> C_0000243771318467953735 : -events_
C_0011104235723651995916 --> C_0000243771318467953735 : -events_
C_0011104235723651995916 --> C_0005552319214775046176 : -review_controller_
C_0006659114052005454335 ..> C_0011258537118237043733 :
C_0006659114052005454335 ..> C_0000597907423933914082 :
C_0006659114052005454335 o-- C_0001784637889564864947 : +draft
C_0005552319214775046176 --> C_0000243771318467953735 : -events_
C_0005552319214775046176 o-- C_0011258537118237043733 : -pending_delete_item_
C_0007829914580691537067 o-- C_0000243771318467953735 : +events
C_0007829914580691537067 o-- C_0018441795320970234485 : +element_edit_controller
C_0007829914580691537067 o-- C_0014310741392462431627 : +modal_coordinator
C_0007829914580691537067 o-- C_0003317484071518590268 : +project_controller
C_0007829914580691537067 o-- C_0006659114052005454335 : +proposal_controller
C_0007829914580691537067 o-- C_0005552319214775046176 : +review_controller
C_0007829914580691537067 o-- C_0013513933648998836800 : +guideline_catalog
C_0007829914580691537067 o-- C_0014251431951803862762 : +command_bus
%% Generated with clang-uml, version 0.6.2
%% LLVM version Ubuntu clang version 18.1.3 (1ubuntu1)
UI Panels
classDiagram
class C_0014801729964585547727["ui::gsn::GsnCanvas"]
class C_0014801729964585547727 {
+GsnCanvas() void
+CenterOnIds() bool
+CenterOnNode() bool
+ClearHistoryHighlights() void
+ConsumePendingFocus() bool
+GetContentBounds() [const] void
+GetHistoryHighlights() [const] const std::unordered_map<std::string,core::audit::HistoryHighlightKind> &
+GetLastRenderStats() [const] CanvasRenderStats
+GetViewOffset() [const] ImVec2
+GetZoom() [const] float
+HasPendingFocus() [const] bool
+Pan() void
+Render() void
+RequestFocusOnIds() void
+ResetZoom() void
+SetCaseRevision() void
+SetElements() void
+SetHistoryHighlights() void
+SetTree() void
+ZoomAtPoint() void
+ZoomIn() void
+ZoomOut() void
}
class C_0002852410610867774835["ui::gsn::GsnNode"]
class C_0002852410610867774835 {
+away_module_identifier : std::string
+id : std::string
+is_counter : bool
+label : std::string
+label_secondary : std::string
+position : ImVec2
+size : ImVec2
+type : std::string
+undeveloped : bool
+uninstantiated : bool
}
class C_0001484045509554317287["ui::panels::ProblemsPanelModel"]
class C_0001484045509554317287 {
+problems_manager : const core::ProblemsManager &
+ui_state : ui::UiState &
}
class C_0003597558651768431837["ui::panels::ProblemsPanelCallbacks"]
class C_0003597558651768431837 {
+on_open_review : std::function<void (const core::ProblemItem &)>
+on_problem_activated : std::function<void (const core::ProblemItem &)>
+on_quick_fix : std::function<void (const core::ProblemItem &)>
}
class C_0004408184301576521383["ui::panels::WelcomeModalCallbacks"]
class C_0004408184301576521383 {
+create_empty_project : std::function<void ()>
+create_project_from_sacm : std::function<void ()>
+open_example_project : std::function<void ()>
+open_guide_ai_client : std::function<void ()>
+open_guide_ai_review : std::function<void ()>
+open_guide_get_started : std::function<void ()>
+open_project : std::function<void ()>
+open_recent_project : std::function<void (const RecentProjectEntry &)>
}
class C_0018262571651195257144["ui::panels::SacmViewerPanelModel"]
class C_0018262571651195257144 {
+app_state : core::AppState &
+dir_path_buf : char *
+dir_path_buf_size : std::size_t
+file_path_buf : char *
+file_path_buf_size : std::size_t
+selected_file_idx : int &
+show_overwrite_confirm : bool &
+xml_files : std::vector<std::string> &
}
class C_0016572357059630075294["ui::panels::SacmViewerPanelCallbacks"]
class C_0016572357059630075294 {
+on_load_failure : std::function<void ()>
+on_load_success : std::function<void ()>
+scan_directory : std::function<void ()>
}
class C_0014080272427648970361["ui::panels::ReviewPanelModel"]
class C_0014080272427648970361 {
+active_proposal_can_save : bool
+active_proposal_operation_count : size_t
+active_proposal_review_item_id : std::string
+agent_change_sets : std::vector<AgentChangeSetRow>
+ai_review_failed : bool
+ai_review_ok : bool
+connected_agents : std::vector<std::string>
+focus_review_item_id : std::string
+guideline_options : std::vector<ReviewGuidelineOption>
+guideline_status : std::string
+has_project : bool
+manual_review_ok : bool
+problem_items : std::vector<core::ProblemItem>
+proposal_text_changes : std::map<std::string,std::vector<ProposalTextChangePreview>>
+proposal_validity : std::map<std::string,core::reviews::ProposalValidityResult>
+review_items : std::vector<core::reviews::ReviewItem>
+review_status_detail : std::string
+review_status_passed : bool
+review_status_text : std::string
+selected_element_id : std::string
}
class C_0005546080897833507417["ui::panels::ReviewPanelCallbacks"]
class C_0005546080897833507417 {
+accept_agent_change_set : std::function<void (const std::string &)>
+add_review_item : std::function<void (const std::string &,const std::string &,const std::vector<std::string> &)>
+apply_proposal : std::function<void (const core::reviews::ReviewItem &)>
+create_proposed_change : std::function<void (const core::reviews::ReviewItem &)>
+delete_problem : std::function<void (const core::ProblemItem &)>
+delete_proposal : std::function<void (const core::reviews::ReviewItem &)>
+delete_review_item : std::function<void (const core::reviews::ReviewItem &)>
+edit_proposal : std::function<void (const core::reviews::ReviewItem &)>
+preview_proposal : std::function<void (const core::reviews::ReviewItem &)>
+quick_fix_problem : std::function<void (const core::ProblemItem &)>
+reject_agent_change_set : std::function<void (const std::string &)>
+resolve_review_item : std::function<void (const core::reviews::ReviewItem &)>
+save_proposal : std::function<void (const core::reviews::ReviewItem &)>
+set_manual_review_ok : std::function<void (bool)>
}
class C_0001683488159576886119["ui::panels::PreferencesPanelModel"]
class C_0001683488159576886119 {
+aiAvailable : bool
+aiEnabled : bool
+aiProviderName : std::string
+apiKeyBuffer : char *
+apiKeyBufferSize : size_t
+connectionMessage : std::string
+connectionSeverity : AiStatusSeverity
+keyStored : bool
+language : ui::i18n::Language
+mcpClientConfig : std::string
+mcpConfigUnavailableReason : std::string
+mcpEnabled : bool
+mcpStatus : std::string
+modelBuffer : char *
+modelBufferSize : size_t
+reviewerNameBuffer : char *
+reviewerNameBufferSize : size_t
+secureStoreAvailable : bool
+secureStoreUnavailableReason : std::string
+showDeveloperTools : bool
+testRunning : bool
+theme : ui::AppTheme
}
class C_0009112363299729511720["ui::panels::PreferencesPanelCallbacks"]
class C_0009112363299729511720 {
+remove_api_key : std::function<void ()>
+save_api_key : std::function<void (const char *)>
+save_reviewer_name : std::function<void (const char *)>
+save_settings : std::function<void (bool,const char *)>
+set_ai_enabled : std::function<void (bool)>
+set_language : std::function<void (ui::i18n::Language)>
+set_mcp_enabled : std::function<void (bool)>
+set_show_developer_tools : std::function<void (bool)>
+set_theme : std::function<void (ui::AppTheme)>
+test_connection : std::function<void ()>
}
class C_0010282600184686086488["ui::CseRegisterRow"]
class C_0010282600184686086488 {
+assessment_status : std::string
+claim : std::string
+claim_criteria : std::string
+claim_id : std::string
+claim_owner : std::string
+cse_id : std::string
+evidence : std::string
+evidence_criteria : std::string
+evidence_id : std::string
+evidence_owner : std::string
+notes : std::string
+record : core::CseAssessmentRecord
+relationship_id : std::string
+safety_case_owner : std::string
+shares_relationship : bool
+stored_in_project_file : bool
}
class C_0004557610385586098000["ui::EvidenceRegisterRow"]
class C_0004557610385586098000 {
+citations : std::vector<Citation>
+controlled_environment : std::string
+evidence : std::string
+evidence_id : std::string
+evidence_owner : std::string
+is_artifact_reference : bool
+location : std::string
+maturity : std::string
+notes : std::string
+recency : std::string
+record : core::EvidenceRecord
+stored_in_project_file : bool
+type : std::string
+used_by_cse_count : int
}
class C_0014208541808005611683["ui::ElementContextActions"]
class C_0014208541808005611683 {
+add_acp_to_relationship : std::function<void (const std::string &)>
+add_acp_to_selected_element : std::function<void ()>
+add_away_element : std::function<void (core::AwayElementKind,const std::string &)>
+add_child : std::function<void (core::NewElementKind)>
+add_counter_argument : std::function<void ()>
+add_counter_argument_to_relationship : std::function<void (const std::string &)>
+add_counter_evidence : std::function<void ()>
+add_counter_evidence_to_relationship : std::function<void (const std::string &)>
+add_terminology_term_as_context : std::function<void (const std::string &,const core::TerminologyPackageRef &,const core::TerminologyTermRef &)>
+add_top_goal : std::function<void ()>
+add_visible_terminology_term_context : std::function<void (const std::string &,const core::TerminologyPackageRef &,const core::TerminologyTermRef &)>
+away_assumption_candidates : std::vector<core::AwayCandidate>
+away_goal_candidates : std::vector<core::AwayCandidate>
+away_justification_candidates : std::vector<core::AwayCandidate>
+change_terminology_meaning : std::function<void (const std::string &,const std::string &)>
+define_terminology_term : std::function<void (const std::string &,const std::string &)>
+edit_terminology_term : std::function<void (const core::TerminologyPackageRef &,const core::TerminologyTermRef &)>
+find_terminology_usages : std::function<void (const core::TerminologyPackageRef &,const core::TerminologyTermRef &)>
+focus_problem : std::function<void (const std::string &,const std::string &)>
+not_implemented : std::function<void (const char *)>
+open_evidence_location : std::function<void (const std::string &)>
+open_terminology_term : std::function<void (const core::TerminologyPackageRef &,const core::TerminologyTermRef &)>
+remove_acp : std::function<void (const std::string &)>
+remove_relationship : std::function<void (const std::string &)>
+remove_selected : std::function<void (core::RemoveMode)>
+render_ai_review_menu : std::function<void ()>
+set_status : std::function<void (const std::string &)>
}
class C_0007524743718931793893["ui::UiState"]
class C_0007524743718931793893 {
+active_problem_filter : ProblemFilter
+active_secondary_lang : std::string
+agent_change_set_id : std::string
+agent_change_set_title : std::string
+agent_change_status : std::unordered_map<std::string,core::changesets::ElementChange>
+ai_review_primary_element_id : std::string
+ai_review_running_element_ids : std::unordered_set<std::string>
+ai_review_scope_element_ids : std::unordered_set<std::string>
+ai_review_success_markers : std::unordered_map<std::string,AiReviewSuccessMarker>
+center_on_draft_group_pending : bool
+center_on_marked : bool
+center_on_selection : bool
+center_view : CenterView
+confidence_states : std::unordered_map<std::string,ElementConfidence>
+dim_non_proposal_nodes : bool
+draft_accept_error : std::string
+draft_accept_error_revision : std::uint64_t
+draft_edge_status : std::unordered_map<std::string,DraftEdgeDecoration>
+draft_element_status : std::unordered_map<std::string,DraftNodeDecoration>
+draft_selected_detail : DraftElementDetailView
+draft_view_mode : DraftViewMode
+element_badge_summaries : std::unordered_map<std::string,core::ElementBadgeSummary>
+fit_canvas_pending : bool
+marked_for_removal : std::unordered_set<std::string>
+model_has_translations : bool
+problems_panel_focus_pending : bool
+problems_panel_open_pending : bool
+proposal_canvas_active : bool
+proposal_highlight_ids : std::unordered_set<std::string>
+proposal_text_changes : std::unordered_map<std::string,std::vector<ProposalTextChangePreview>>
+selected_acp_id : std::string
+selected_draft_group_id : std::string
+selected_element_id : std::string
+selected_problem_element_id : std::string
+selected_problem_id : std::string
+selected_relationship_edge_key : std::string
+selected_relationship_id : std::string
+show_developer_tools : bool
+show_perf_overlay : bool
+show_secondary_language : bool
}
C_0014801729964585547727 ..> C_0007524743718931793893 :
C_0014801729964585547727 ..> C_0014208541808005611683 :
C_0001484045509554317287 --> C_0007524743718931793893 : +ui_state
%% Generated with clang-uml, version 0.6.2
%% LLVM version Ubuntu clang version 18.1.3 (1ubuntu1)
Review And AI
classDiagram
class C_0004671794534424799053["core::reviews::ReviewItemManager"]
class C_0004671794534424799053 {
+AddDraftGroup() bool
+AddOrUpdateItem() bool
+Clear() void
+ClearElementReviewState() bool
+ClearProposal() bool
+FilePath() [const] const std::filesystem::path &
+GetElementReviewState() [const] ElementReviewState
+GetElementReviewStates() [const] const ElementReviewStateMap &
+GetItemById() [const] std::optional<ReviewItem>
+GetItems() [const] const std::vector<ReviewItem> &
+GetItemsForElement() [const] std::vector<ReviewItem>
+Load() bool
+RemoveItem() bool
+RemoveItemsForElementSourceAndIdPrefix() size_t
+Save() [const] bool
+SetElementReviewState() bool
+SetFilePath() void
+SetProposal() bool
}
class C_0009778806587250446660["core::reviews::ReviewProposalManager"]
class C_0009778806587250446660 {
+ReviewProposalManager() [default] void
+ReviewProposalManager() void
+DeleteProposal() [const] bool
+InvalidateProposalCache() [const] void
+ListProposals() [const] std::vector<ReviewProposalSummary>
+LoadProposal() [const] std::optional<ReviewProposal>
+ProposalPath() [const] std::filesystem::path
+ProposalsDirectory() [const] std::filesystem::path
+SaveProposal() [const] bool
+SetProjectRoot() void
}
class C_0003873520081805353508["core::reviews::ReviewProposalPatchService"]
class C_0003873520081805353508 {
+ApplyProposal() [const] ApplyProposalResult
+ApplyProposalWithIds() [const] ApplyProposalResult
+BuildPreviewModel() [const] ProposalPreviewResult
}
class C_0011258537118237043733["core::reviews::ReviewItem"]
class C_0011258537118237043733 {
+applied_note : std::string
+created_utc : std::string
+draft_group_ids : std::vector<std::string>
+element_id : std::string
+guideline_ids : std::vector<std::string>
+id : std::string
+message : std::string
+proposal_id : std::optional<std::string>
+reviewer_name : std::string
+severity : std::string
+source : ReviewItemSource
+status : ReviewItemStatus
+title : std::string
+updated_utc : std::string
}
class C_0015431095045660430157["core::reviews::PatchOperation"]
class C_0015431095045660430157 {
+create_ref : std::optional<std::string>
+element : std::optional<ElementRef>
+field : std::string
+new_value : std::string
+old_value : std::string
+source : std::optional<ElementRef>
+target : std::optional<ElementRef>
+text : std::string
+translations : std::map<std::string,std::string>
+type : PatchOperationType
}
class C_0001784637889564864947["core::reviews::ReviewProposal"]
class C_0001784637889564864947 {
+affected_existing_element_ids : std::vector<std::string>
+anchor_element_id : std::string
+author_name : std::string
+base_element_hashes : std::map<std::string,std::string>
+base_model_hash : std::string
+created_utc : std::string
+id : std::string
+operations : std::vector<PatchOperation>
+review_item_id : std::string
+schema : std::string
+summary : std::string
+title : std::string
}
class C_0000967858013829163137["core::reviews::ProposalValidityResult"]
class C_0000967858013829163137 {
+reason : std::string
+validity : ProposalValidity
}
class C_0001878241832316903513["core::ProblemsManager"]
class C_0001878241832316903513 {
+AddOrUpdateProblem() void
+AddProblem() void
+ClearProblems() void
+ClearProblemsBySource() void
+ClearProblemsForElement() void
+ClearProblemsForElementAndSource() void
+GetProblemById() [const] std::optional<ProblemItem>
+GetProblems() [const] const std::vector<ProblemItem> &
+RemoveProblem() void
}
class C_0000213003322182496209["core::ProblemItem"]
class C_0000213003322182496209 {
+element_id : std::string
+guideline_id : std::string
+id : std::string
+message : std::string
+quick_fix_label : std::string
+quick_fix_payload : std::string
+severity : ProblemSeverity
+source : ProblemSource
+type : std::string
}
class C_0001619465951829813672["ai::AiService"]
class C_0001619465951829813672 {
+AiService() void
+DeleteApiKey() [const] SecretStoreResult
+Generate() [const] AiResponse
+Generate() [const] AiResponse
+HasConfiguredProvider() [const] bool
+HasStoredApiKey() [const] bool
+IsEnabled() [const] bool
+LoadSettings() [const] AiProviderSettings
+SaveApiKey() [const] SecretStoreResult
+SaveSettings() [const] bool
+TestConnection() [const] AiConnectionStatus
}
class C_0002532633831831673772["ai::AiTaskHandle"]
class C_0002532633831831673772 {
+IsRunning() [const] bool
+Snapshot() [const] AiTaskSnapshot
+WaitUntilComplete() [const] bool
}
class C_0001225707820796791708["ai::AiTaskRunner"]
class C_0001225707820796791708 {
+RunConnectionTest() std::shared_ptr<AiTaskHandle>
+RunGenerate() std::shared_ptr<AiTaskHandle>
}
class C_0010068890106686075862["ai::AiProviderSettings"]
class C_0010068890106686075862 {
+displayName : std::string
+enabled : bool
+model : std::string
+provider : AiProviderId
+requestTimeoutSeconds : int
+seed : std::optional<long long>
+sendProjectDataOnlyOnExplicitUserAction : bool
+serviceTier : std::optional<std::string>
+temperature : std::optional<double>
}
class C_0016213196805394838223["ai::AiRequest"]
class C_0016213196805394838223 {
+jsonSchema : std::optional<std::string>
+jsonSchemaName : std::optional<std::string>
+promptCacheDisabled : bool
+promptCacheKey : std::string
+promptSegments : std::vector<AiPromptSegment>
+systemInstruction : std::string
+userPrompt : std::string
}
class C_0001559823946355444724["ai::AiResponse"]
class C_0001559823946355444724 {
+errorCode : AiErrorCode
+errorMessage : std::string
+httpStatus : long
+providerErrorCode : std::string
+rawJson : std::string
+serviceTier : std::string
+success : bool
+text : std::string
+usage : AiUsage
}
C_0004671794534424799053 o-- C_0011258537118237043733 : -items_
C_0009778806587250446660 ..> C_0001784637889564864947 :
C_0003873520081805353508 ..> C_0001784637889564864947 :
C_0001784637889564864947 o-- C_0015431095045660430157 : +operations
C_0001878241832316903513 o-- C_0000213003322182496209 : -problems_
C_0001619465951829813672 ..> C_0010068890106686075862 :
C_0001619465951829813672 ..> C_0016213196805394838223 :
C_0001619465951829813672 ..> C_0001559823946355444724 :
C_0002532633831831673772 <.. C_0001225707820796791708 : +[friend]
C_0001225707820796791708 ..> C_0002532633831831673772 :
%% Generated with clang-uml, version 0.6.2
%% LLVM version Ubuntu clang version 18.1.3 (1ubuntu1)
Generation Commands
cmake -S . -B build-docs -G Ninja -DCMAKE_EXPORT_COMPILE_COMMANDS=ON -DHELLOIMGUI_DOWNLOAD_GLFW_IF_NEEDED=ON
clang-uml -g mermaid
Generated output appears under:
docs/diagrams/generated/
The generated .mmd files are part of the documentation assets. If they are out of date, rerun clang-uml -g mermaid and review the diff.