@karpo.dev/protocol
v0.4.0
Published
Wire format, canonical JSON, hashing, and identifiers shared across Karpo.
Readme
@karpo.dev/protocol
TypeScript home of Karpo's wire contracts: the manifest artifact shape, the
canonical JSON serializer, the schema hash, and the sync protocol messages. Zod
schemas are the source of truth; every type is a z.infer derivation, never
hand-maintained alongside them.
npm install @karpo.dev/protocolThe SDK and the CLI depend on it already — install it directly only when you are speaking to the platform's HTTP surface yourself.
| Module | Contract |
| --- | --- |
| artifact.ts | Manifest artifact shape |
| canonical.ts | Canonical JSON serializer — struct fields in declaration order, map keys sorted, hand-written per type on purpose |
| hash.ts | schemaHash — SHA-256 (lowercase hex) over the canonical bytes of schema |
| sync.ts | Sync protocol wire schemas |
| identity.ts | Identity and session wire schemas |
| json.ts | JsonValue, the model behind the opaque artifact slots |
import { ArtifactSchema, canonicalizeSchema, schemaHash } from "@karpo.dev/protocol";
const artifact = ArtifactSchema.parse(await res.json());
schemaHash(artifact.schema) === artifact.schemaHash; // what the engine verifiesschemaHash is synchronous and hashes with @noble/hashes, not WebCrypto or
node:crypto, so the same code runs in the CLI, in browsers, and in React
Native.
Zod checks shape and strictness only. Semantic rules — defaults matching
column types, live reference targets, addedIn consistency, tombstone
correctness — belong to the manifest engine and surface as E_* violation
codes; duplicating them here would be a second implementation of the platform's
most safety-critical ruleset.
The Rust side of the platform validates the same bytes, and parity between the two implementations is pinned by shared fixtures.
Documentation
- Sync: https://karpo.dev/sync
- Schema: https://karpo.dev/schema
- Source: https://github.com/Chirich-GmbH/karpo-core (
packages/protocol)
