mirror of
https://github.com/zap-proto/mcp.git
synced 2026-10-30 15:04:37 +00:00
* feat: ZAP JavaScript/TypeScript bindings v0.2.1
JavaScript/TypeScript client library for ZAP (Zero-Copy App Proto).
- Full ZAP protocol support (tools, resources, prompts)
- MCP Gateway bridging
- Post-quantum cryptography (ML-KEM, ML-DSA)
- W3C DID support
- Lux consensus integration
* feat: add documentation site using @hanzo/docs framework
- Next.js 14 docs site in docs/ directory
- Package.json with @hanzo/ui and @hanzo/docs dependencies
- GitHub Actions workflow for deployment to GitHub Pages
- Documentation pages covering:
- Installation and Quick Start
- Client API, Gateway, Server
- TypeScript Types and Configuration
- Error Handling and Identity/DIDs
- Browser and Node.js usage guides
- Code examples and patterns
- Configured basePath '/zap-js' for GitHub Pages
- Uses pnpm and Node 22
* fix: docs build - remove unused @hanzo/docs, upgrade to Next.js 15
- Remove @hanzo/docs and @hanzo/ui dependencies (not actually used)
- Upgrade to Next.js 15 and React 19 for next.config.ts support
- Rename postcss.config.js to postcss.config.cjs for ESM compatibility
- Add pnpm-lock.yaml for reproducible builds
* rebrand: Cap'n Proto → ZAP
Update all documentation to use ZAP branding instead of Cap'n Proto.
* chore: update to Node 22 and latest packages
- Node.js 22 in CI workflow
- fumadocs-core/ui v15
- next v15.1
- react v19
- Consistent workflow across all repos
* fix: revert to fumadocs v14 for compatibility
* fix: update metadata description to use ZAP branding
* chore: rename package to @zap-proto/zap
- Change npm package name from @hanzo/zap to @zap-proto/zap
- Update repository URL to zap-protocol org
- Update homepage to zap-protocol.github.io
- Update keywords and author
* feat: add transport layer and gateway improvements
- Add server transport abstraction
- Add crypto, gateway, and protocol tests
- Update client/server implementations
- Add CI workflow configuration
- Update vitest config with coverage thresholds
* feat: add .zap test schema for native ZAP format testing
* feat: add ZAP-format schema
Convert zap.capnp to proper whitespace-based .zap syntax
* chore: brand-neutral cleanup — remove cross-tenant references
* docs(readme): add canonical link → zap-proto.dev/docs
* docs(readme): also link Native ZAP RPC guide
* test(pqrns): import canonical KAT fixture
* test(pqrns): DID KAT — must match Go reference at zap-proto/rns
* chore: depend on @zap-proto/zap ^1.1.0 (foundation rolled back from premature v2.0.0)
* chore: pin @zap-proto/zap to ^0.1.0 (foundation reset to pre-1.0)
The @zap-proto/zap foundation was reset to v0.1.0 — native ZAP wire
runtime, no Cap'n Proto. Match the pre-1.0 line; no tags until 1.0
works end-to-end across @zap-proto/{zap,web,mcp}.
* chore: depend on @zap-proto/zap ^1.1.0
@zap-proto/zap is published at 1.1.0 (native ZAP wire runtime, back in
the 1.x line). Point the runtime dep at it instead of the pre-publish
^0.1.0. Lockfiles (npm + pnpm) regenerated; 105 tests still pass.
---------
Co-authored-by: Hanzo Dev <[email protected]>
Co-authored-by: z <[email protected]>
119 lines
3.4 KiB
TypeScript
119 lines
3.4 KiB
TypeScript
import { describe, it, expect } from 'vitest';
|
|
import {
|
|
Did,
|
|
DidDocument,
|
|
DidMethod,
|
|
VerificationMethod,
|
|
VerificationMethodType,
|
|
didUri,
|
|
parseDid,
|
|
createDidFromKey,
|
|
createDidFromWeb,
|
|
generateDocument,
|
|
MLDSA_PUBLIC_KEY_SIZE,
|
|
} from '../src/identity.js';
|
|
|
|
describe('Did', () => {
|
|
it('should create a did:lux DID', () => {
|
|
const did: Did = { method: DidMethod.Lux, id: 'z6MkTest123' };
|
|
expect(did.method).toBe(DidMethod.Lux);
|
|
expect(did.id).toBe('z6MkTest123');
|
|
});
|
|
|
|
it('should create a did:key DID', () => {
|
|
const did: Did = { method: DidMethod.Key, id: 'z6MkTestKey456' };
|
|
expect(did.method).toBe(DidMethod.Key);
|
|
expect(did.id).toBe('z6MkTestKey456');
|
|
});
|
|
|
|
it('should create a did:web DID', () => {
|
|
const did: Did = { method: DidMethod.Web, id: 'example.com:user:alice' };
|
|
expect(did.method).toBe(DidMethod.Web);
|
|
expect(did.id).toBe('example.com:user:alice');
|
|
});
|
|
});
|
|
|
|
describe('didUri', () => {
|
|
it('should format DID URI', () => {
|
|
const did: Did = { method: DidMethod.Lux, id: 'z6MkTest123' };
|
|
expect(didUri(did)).toBe('did:lux:z6MkTest123');
|
|
});
|
|
});
|
|
|
|
describe('parseDid', () => {
|
|
it('should parse did:lux DID', () => {
|
|
const did = parseDid('did:lux:z6MkTest123');
|
|
expect(did.method).toBe(DidMethod.Lux);
|
|
expect(did.id).toBe('z6MkTest123');
|
|
});
|
|
|
|
it('should parse did:key DID', () => {
|
|
const did = parseDid('did:key:z6MkTestKey456');
|
|
expect(did.method).toBe(DidMethod.Key);
|
|
expect(did.id).toBe('z6MkTestKey456');
|
|
});
|
|
|
|
it('should parse did:web DID', () => {
|
|
const did = parseDid('did:web:example.com:user:alice');
|
|
expect(did.method).toBe(DidMethod.Web);
|
|
expect(did.id).toBe('example.com:user:alice');
|
|
});
|
|
|
|
it('should throw on invalid DID', () => {
|
|
expect(() => parseDid('invalid')).toThrow();
|
|
});
|
|
});
|
|
|
|
describe('generateDocument', () => {
|
|
it('should create a DID document', () => {
|
|
const did: Did = { method: DidMethod.Lux, id: 'z6MkTest123' };
|
|
const doc = generateDocument(did);
|
|
expect(doc.id).toBe('did:lux:z6MkTest123');
|
|
});
|
|
|
|
it('should include context', () => {
|
|
const did: Did = { method: DidMethod.Lux, id: 'z6MkTest123' };
|
|
const doc = generateDocument(did);
|
|
// Context can be string or array
|
|
const context = doc['@context'];
|
|
if (Array.isArray(context)) {
|
|
expect(context).toContain('https://www.w3.org/ns/did/v1');
|
|
} else {
|
|
expect(context).toBe('https://www.w3.org/ns/did/v1');
|
|
}
|
|
});
|
|
});
|
|
|
|
describe('createDidFromKey', () => {
|
|
it('should create did:key from ML-DSA public key', () => {
|
|
// 1952-byte fake public key
|
|
const publicKey = new Uint8Array(MLDSA_PUBLIC_KEY_SIZE);
|
|
for (let i = 0; i < publicKey.length; i++) {
|
|
publicKey[i] = i % 256;
|
|
}
|
|
const did = createDidFromKey(publicKey);
|
|
|
|
expect(did.method).toBe(DidMethod.Key);
|
|
expect(did.id.startsWith('z')).toBe(true);
|
|
});
|
|
|
|
it('should throw on invalid key length', () => {
|
|
const shortKey = new Uint8Array(16);
|
|
expect(() => createDidFromKey(shortKey)).toThrow();
|
|
});
|
|
});
|
|
|
|
describe('createDidFromWeb', () => {
|
|
it('should create did:web from domain', () => {
|
|
const did = createDidFromWeb('example.com');
|
|
expect(did.method).toBe(DidMethod.Web);
|
|
expect(did.id).toBe('example.com');
|
|
});
|
|
|
|
it('should create did:web with path', () => {
|
|
const did = createDidFromWeb('example.com', 'users:alice');
|
|
expect(did.method).toBe(DidMethod.Web);
|
|
expect(did.id).toContain('example.com');
|
|
});
|
|
});
|