feat(ncp): add core types for Nexus Context Protocol

This commit is contained in:
Markus Maiwald 2026-02-02 12:09:38 +01:00
parent b6edd5c403
commit 904ddae674
Signed by: markus
GPG Key ID: 07DDBEA3CBDC090A
2 changed files with 90 additions and 0 deletions

14
ncp-prototype/README.md Normal file
View File

@ -0,0 +1,14 @@
## NCP Core Types
This directory contains the Nexus Context Protocol prototype implementation.
### Structure
- `src/types.nim` - Core types (CID, ContextNode, Path)
- `src/l0_storage.nim` - File backend, CID generation (Blake3)
- `src/l1_index.nim` - B-Tree index, path-based addressing
- `tests/test_ncp.nim` - Unit tests
### Status
Feature 1 (Core Types): In Progress

View File

@ -0,0 +1,76 @@
## types.nim: Core Types for Nexus Context Protocol
## RFC-NCP-001 Implementation
## Author: Frankie (Silicon Architect)
import std/[tables, options, times]
## Content Identifier (CID) using Blake3
## 256-bit hash for content-addressed storage
type CID* = array[32, uint8]
## Content types for Context Nodes
type ContentType* = enum
ctText ## Plain text content
ctImage ## Image data
ctEmbedding ## Vector embedding (L2)
ctToolCall ## Tool/function call
ctMemory ## Agent memory
ctSignature ## Cryptographic signature
## Context Node: The fundamental unit of NCP
## Represents any piece of context in the system
type ContextNode* = object
cid*: CID ## Content identifier (Blake3 hash)
parent*: Option[CID] ## Previous version (for versioning)
path*: string ## Hierarchical path /agent/task/subtask
contentType*: ContentType ## Type of content
data*: seq[byte] ## Raw content bytes
embedding*: Option[seq[float32]] ## Vector embedding (optional)
timestamp*: int64 ## Unix nanoseconds
metadata*: Table[string, string] ## Key-value metadata
## Path utilities for hierarchical addressing
type Path* = object
segments*: seq[string]
absolute*: bool
proc initPath*(path: string): Path =
## Parse a path string into segments
## Example: "/agents/frankie/tasks" -> ["agents", "frankie", "tasks"]
result.absolute = path.startsWith("/")
result.segments = path.split("/").filterIt(it.len > 0)
proc toString*(p: Path): string =
## Convert path back to string
result = if p.absolute: "/" else: ""
result.add(p.segments.join("/"))
## CID Generation (placeholder - actual Blake3 integration later)
proc generateCID*(data: openArray[byte]): CID =
## Generate content identifier from data
## TODO: Integrate with actual Blake3 library
## For now: simple XOR-based hash (NOT for production)
var result: CID
for i in 0..<32:
result[i] = 0
for i, b in data:
result[i mod 32] = result[i mod 32] xor uint8(b)
return result
## Context Node Operations
proc initContextNode*(
path: string,
contentType: ContentType,
data: openArray[byte]
): ContextNode =
## Initialize a new ContextNode
result.path = path
result.contentType = contentType
result.data = @data
result.cid = generateCID(data)
result.timestamp = getTime().toUnix() * 1_000_000_000 # nanoseconds
result.metadata = initTable[string, string]()
## Export utility functions
export CID, ContentType, ContextNode, Path
export initPath, toString, generateCID, initContextNode