feat(ncp): add core types for Nexus Context Protocol
This commit is contained in:
parent
b6edd5c403
commit
904ddae674
|
|
@ -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
|
||||||
|
|
@ -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
|
||||||
Loading…
Reference in New Issue