Skip to main content

memstead_base/
lib.rs

1//! Backend-agnostic graph kernel for Memstead.
2//!
3//! Hosts the parts of the engine that do not assume a git-backed
4//! storage: token-budget chunking, workspace-root utilities, the
5//! entity types and markdown pipeline (parse / generate / write), the
6//! in-memory store, graph queries and community detection, the mem
7//! router, the operation request/response types (including the
8//! gix-free read paths in `ops::health` / `ops::search`), the search
9//! index, validators, and rendering.
10//!
11//! Consumers that need only graph operations against directory or
12//! archive storage depend on this crate alone — its dependency closure
13//! does not include `gix`. Code that needs git-backed mems depends on
14//! `memstead-git-branch`, which builds on `memstead-base`.
15
16pub mod anchor;
17pub mod backend;
18pub mod binding;
19pub mod binding_migrate;
20pub mod build_info;
21pub mod check;
22pub mod chunking;
23pub mod derivation;
24pub mod domain_authority_wire;
25pub mod engine;
26pub mod entity;
27pub mod filesystem;
28pub mod friction;
29pub mod graph;
30pub mod ingest;
31pub mod markdown;
32pub mod mem;
33pub mod mem_management;
34pub mod ops;
35pub mod overview;
36pub mod pipeline;
37pub mod pipeline_edit;
38pub mod pipeline_migrate;
39pub mod pipeline_store;
40pub mod preparation;
41pub mod provenance;
42pub mod render;
43pub mod runtime_validator;
44pub mod schema_source;
45#[cfg(not(target_arch = "wasm32"))]
46pub mod search_index;
47pub mod section_format;
48pub mod storage;
49pub mod store;
50pub mod validator;
51pub mod vcs;
52pub mod workspace;
53pub mod workspace_root;
54pub mod workspace_store;
55
56use std::sync::Arc;
57
58use memstead_schema::{TypeDefinition, type_by_name};
59
60pub use anchor::{
61    ANCHOR_SIDECAR_PATH, Anchor, AnchorGrain, AnchorHashStability, AnchorInput,
62    AnchorProvenanceClass, AnchorSidecar, AnchorState, AnchorValidationError, AnchorVersion,
63    ArtifactObservation, EntityAnchorComposition, INVALID_ANCHOR_CODE, compose_entity_anchors,
64    resolve_anchor,
65};
66pub use backend::{BackendError, MemBackend};
67pub use binding_migrate::{
68    BindingMigrateError, LegacyBindingV1, MigratedBinding, check_all_consumed, fold_v1_binding,
69    migrate_gen2_bindings,
70};
71pub use engine::{
72    BackendFactory, BootError, CreateEntityArgs, CreateEntityOutcome, DeleteEntityArgs,
73    DeleteEntityOutcome, DeleteReferrers, Engine, EngineError, EntityHistoryReport, EntityTouch,
74    FromArchiveBytesError, GitBranchBranchResetFn, GitBranchChangesSinceFn, GitBranchDiffFn,
75    GitBranchExportFn, GitBranchExportToBytesFn, GitBranchFetchFn, GitBranchLsRemoteFn,
76    GitBranchOps, GitBranchPullFn, GitBranchPushFn, GitBranchReadTreeFn, GitBranchResolveRefFn,
77    HISTORY_PAGE_DEFAULT, HISTORY_PAGE_MAX, INLINE_LIST_CAP, MutationClock, ReferrerInfo,
78    RelateAction, RelateEntityArgs, RelateEntityOutcome, RenameEntityArgs, RenameEntityOutcome,
79    RetypeEdge, RetypeEdgeDirection, RetypeEntityArgs, RetypeEntityOutcome, RetypeProblem,
80    ReviewMarkStatus, SchemaSourceDiagnostic, SchemaStaging, SetReviewMarkOutcome, StoryStart,
81    UpdateEntityArgs, UpdateEntityOutcome, format_inline_list_overflow,
82};
83pub use entity::id::{ENTITY_ID_MAX_LEN, SlugError, TITLE_GRAMMAR_RULE};
84pub use entity::{Entity, EntityId, MetadataValue, ParseResult, Relationship};
85pub use graph::{ClusterInfo, LouvainOutput};
86pub use mem::{MEM_META_DIR, MemOrigin, MemRouterSnapshot};
87
88/// The engine crate SEMVER of the running binary. Version-carrying
89/// surfaces — the per-mem mutation stamp (`MemConfig.mutation_stamp`),
90/// the boot-time `ENGINE_VERSION_SKEW` comparison, the overview's
91/// `_engine_version`, CLI `--version`, MCP `serverInfo.version` — use
92/// [`build_info::full_version`] instead (semver plus the git build sha
93/// when present), so dev builds between releases stay distinguishable;
94/// this constant is the bare semver component.
95pub const ENGINE_VERSION: &str = env!("CARGO_PKG_VERSION");
96pub use mem_management::{CreateRuleSet, DeleteRuleSet, MatcherSet, MatcherSetError};
97pub use ops::{
98    BackendChanges, BatchEntry, BatchError, BatchResult, ChangeEnvelope, ChangesReport,
99    ContextResult, CreateArgs, CreateResult, DeleteResult, EMPTY_TREE_SHA, ExportResult, Facets,
100    HealthReport, HealthSummary, ListResult, MemExportResult, ModifiedMetadata, ModifiedSections,
101    Query, RENAME_SIMILARITY_DEFAULT, RENAME_SIMILARITY_MAX, RENAME_SIMILARITY_MIN, RelateArg,
102    RelateResult, ReloadReport, ReloadResult, RenameResult, SearchHit, SearchResult, SearchScope,
103    SetMemVersionOutcome, UpdateArgs, UpdateResult, WarningHint,
104};
105pub use pipeline::{
106    Facet, IngestTrigger, Medium, MediumType, PatternEntry, PatternMode, Projection,
107};
108pub use pipeline_edit::PipelineEditError;
109pub use pipeline_migrate::{migrate_legacy_pipeline, read_legacy_pipeline_configs};
110pub use pipeline_store::{
111    BindingConfigs, MemPipelineRecord, PipelineConfigs, PipelineRecord,
112    load_legacy_pipeline_configs, load_pipeline_configs,
113};
114pub use provenance::{Provenance, ProvenanceKind};
115pub use store::{Edge, EdgeSource, InEdge, Store};
116pub use workspace::{
117    CreateRuleSetting, DeleteRuleSetting, MEMSTEAD_REF_BRANCH, Mount, MountCapability,
118    MountLifecycle, MountStorage, SCHEMA_WILDCARD, Workspace, WorkspaceSettings, branch_full_ref,
119    branch_short_name,
120};
121pub use workspace_store::{
122    FileWorkspaceStore, InstantiateError, Layout, StoreError, WORKSPACE_STORE_DIR,
123    WorkspaceStoreAdapter, detect_layout, instantiate_lean_backend, is_mem_repo_shaped,
124    is_workspace_root, standalone_workspace, workspace_shape_label,
125};
126
127/// Lowercase hex encoding of a digest. Byte-identical to the `{:x}`
128/// formatting that `sha2 < 0.11` digests carried; hash strings persisted
129/// under the old encoding must keep matching.
130pub fn hex_lower(bytes: &[u8]) -> String {
131    use std::fmt::Write;
132    bytes
133        .iter()
134        .fold(String::with_capacity(bytes.len() * 2), |mut s, b| {
135            let _ = write!(s, "{b:02x}");
136            s
137        })
138}
139
140/// Engine-wide sentinel type. Used by ops that need a shared reference
141/// type at the Engine level (search, health, list) — always resolves to
142/// `default@1.0.0::spec`. Per-entity resolution still goes through
143/// `type_by_name` + schema lookup.
144pub fn engine_fallback_type() -> Arc<TypeDefinition> {
145    type_by_name("spec").expect("spec type must exist in the default builtin schema")
146}