- kei-router — keyword-dispatch meta-tool (CfC ML fallback removed) - kei-sage — Obsidian-style knowledge graph, FTS5 + BFS + PageRank - kei-task — task DAG with deps, milestones, dependency-chain queries - kei-chat-store — Claude conversation session persistence + FTS search - kei-crossdomain — typed-edge store + BFS cross-domain glue - kei-search-core — 3-wave deep research with microcent budget cap - kei-content-store — asset + prompt + campaign registry - kei-social-store — people + interactions CRM (lite) - kei-curator — edge-decay graph hygiene utility - kei-auth — multi-tenant session tokens (replaces single-bearer) Genesis-scan pre-import pass: skipped pkg/mxl1/*, pkg/inference/*, pkg/trainer/*, pkg/nc01/*, internal/ml/* (all Genesis/CfC adjacent, sensitive IP). Security: skipped tools_threat/radio/protocol/med/mlreg (offensive/banned). Domain verticals skipped: hr/legal/infra/ops/api/osint/edu/geo/hw/finance. New 'mcp' profile in MANIFEST.toml bundles all 10 for MCP server deployment. Workspace now 24 crates, cargo check --workspace clean, 94 workspace tests pass.
45 lines
1.1 KiB
Rust
45 lines
1.1 KiB
Rust
use serde::{Deserialize, Serialize};
|
|
use std::fmt;
|
|
use std::str::FromStr;
|
|
|
|
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
|
|
pub enum Scope {
|
|
Read,
|
|
Write,
|
|
Admin,
|
|
}
|
|
|
|
impl Scope {
|
|
pub fn as_str(&self) -> &'static str {
|
|
match self { Scope::Read => "read", Scope::Write => "write", Scope::Admin => "admin" }
|
|
}
|
|
|
|
/// Admin ⊇ Write ⊇ Read.
|
|
pub fn allows(&self, required: Scope) -> bool {
|
|
use Scope::*;
|
|
match (self, required) {
|
|
(Admin, _) => true,
|
|
(Write, Read) | (Write, Write) => true,
|
|
(Read, Read) => true,
|
|
_ => false,
|
|
}
|
|
}
|
|
}
|
|
|
|
impl fmt::Display for Scope {
|
|
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
|
f.write_str(self.as_str())
|
|
}
|
|
}
|
|
|
|
impl FromStr for Scope {
|
|
type Err = String;
|
|
fn from_str(s: &str) -> Result<Self, Self::Err> {
|
|
match s {
|
|
"read" => Ok(Scope::Read),
|
|
"write" => Ok(Scope::Write),
|
|
"admin" => Ok(Scope::Admin),
|
|
_ => Err(format!("unknown scope: {s}")),
|
|
}
|
|
}
|
|
}
|