@kya-os/contracts 1.0.0-alpha
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +130 -0
- package/dist/cli.d.ts +242 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +91 -0
- package/dist/cli.js.map +1 -0
- package/dist/handshake.d.ts +153 -0
- package/dist/handshake.d.ts.map +1 -0
- package/dist/handshake.js +53 -0
- package/dist/handshake.js.map +1 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +17 -0
- package/dist/index.js.map +1 -0
- package/dist/proof.d.ts +155 -0
- package/dist/proof.d.ts.map +1 -0
- package/dist/proof.js +41 -0
- package/dist/proof.js.map +1 -0
- package/dist/registry.d.ts +343 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +115 -0
- package/dist/registry.js.map +1 -0
- package/dist/test.d.ts +252 -0
- package/dist/test.d.ts.map +1 -0
- package/dist/test.js +115 -0
- package/dist/test.js.map +1 -0
- package/dist/verifier.d.ts +136 -0
- package/dist/verifier.d.ts.map +1 -0
- package/dist/verifier.js +63 -0
- package/dist/verifier.js.map +1 -0
- package/package.json +72 -0
- package/schemas/cli/register-output/v1.0.0.json +69 -0
- package/schemas/proof/v1.0.0.json +80 -0
- package/schemas/registry/receipt-v1.0.0.json +60 -0
- package/schemas/verifier/verify-page/v1.0.0.json +94 -0
- package/schemas/well-known/agent/v1.0.0.json +49 -0
package/README.md
ADDED
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
# @kya-os/contracts
|
|
2
|
+
|
|
3
|
+
Shared types and schemas for the XMCP-I ecosystem. This package provides a single source of truth for all contracts used across runtime, CLI, verifier, and registry components.
|
|
4
|
+
|
|
5
|
+
## Features
|
|
6
|
+
|
|
7
|
+
- **Type-safe contracts** using Zod schemas
|
|
8
|
+
- **Subpath exports** for modular imports
|
|
9
|
+
- **JSON schemas** with versioning for external validation
|
|
10
|
+
- **Zero runtime dependencies** (except Zod)
|
|
11
|
+
- **ESM-only** with tree-shaking support
|
|
12
|
+
|
|
13
|
+
## Installation
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
npm install @kya-os/contracts
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
## Usage
|
|
20
|
+
|
|
21
|
+
### Subpath Imports
|
|
22
|
+
|
|
23
|
+
```typescript
|
|
24
|
+
// Import specific namespaces
|
|
25
|
+
import { HandshakeRequest, SessionContext } from "@kya-os/contracts/handshake";
|
|
26
|
+
import { DetachedProof, ProofMeta } from "@kya-os/contracts/proof";
|
|
27
|
+
import { AgentContext, AGENT_HEADERS } from "@kya-os/contracts/verifier";
|
|
28
|
+
import {
|
|
29
|
+
RegistrationResult,
|
|
30
|
+
MCP_I_CAPABILITIES,
|
|
31
|
+
} from "@kya-os/contracts/registry";
|
|
32
|
+
import { StatusReport, ERROR_CODES } from "@kya-os/contracts/cli";
|
|
33
|
+
|
|
34
|
+
// Or import everything
|
|
35
|
+
import * as Contracts from "@kya-os/contracts";
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
### Schema Validation
|
|
39
|
+
|
|
40
|
+
```typescript
|
|
41
|
+
import { DetachedProofSchema } from "@kya-os/contracts/proof";
|
|
42
|
+
|
|
43
|
+
// Validate data at runtime
|
|
44
|
+
const result = DetachedProofSchema.safeParse(data);
|
|
45
|
+
if (result.success) {
|
|
46
|
+
// data is now typed as DetachedProof
|
|
47
|
+
console.log(result.data.meta.did);
|
|
48
|
+
}
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
### JSON Schemas
|
|
52
|
+
|
|
53
|
+
JSON schemas are available under the `/schemas/**` subpath:
|
|
54
|
+
|
|
55
|
+
```typescript
|
|
56
|
+
// Access versioned JSON schemas
|
|
57
|
+
import proofSchema from "@kya-os/contracts/schemas/proof/v1.0.0.json";
|
|
58
|
+
import agentSchema from "@kya-os/contracts/schemas/well-known/agent/v1.0.0.json";
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
## Namespaces
|
|
62
|
+
|
|
63
|
+
### Handshake (`/handshake`)
|
|
64
|
+
|
|
65
|
+
- `HandshakeRequest` - Nonce, audience, timestamp validation
|
|
66
|
+
- `SessionContext` - Session management and TTL
|
|
67
|
+
- `NonceCacheEntry` - Nonce cache storage
|
|
68
|
+
|
|
69
|
+
### Proof (`/proof`)
|
|
70
|
+
|
|
71
|
+
- `DetachedProof` - JWS signature with metadata
|
|
72
|
+
- `ProofMeta` - Proof metadata fields
|
|
73
|
+
- `AuditRecord` - Audit logging format
|
|
74
|
+
|
|
75
|
+
### Verifier (`/verifier`)
|
|
76
|
+
|
|
77
|
+
- `AgentContext` - Verified agent information
|
|
78
|
+
- `VerifierResult` - Middleware validation results
|
|
79
|
+
- `AGENT_HEADERS` - Frozen header name constants
|
|
80
|
+
|
|
81
|
+
### Registry (`/registry`)
|
|
82
|
+
|
|
83
|
+
- `RegistrationResult` - KTA registration response
|
|
84
|
+
- `AgentStatus` - Agent status reporting
|
|
85
|
+
- `MCP_I_CAPABILITIES` - Protocol capability constants
|
|
86
|
+
|
|
87
|
+
### CLI (`/cli`)
|
|
88
|
+
|
|
89
|
+
- `StatusReport` - CLI status command output
|
|
90
|
+
- `ScaffolderResult` - Scaffolder operation results
|
|
91
|
+
- `ERROR_CODES` - Error code constants
|
|
92
|
+
|
|
93
|
+
## Versioning
|
|
94
|
+
|
|
95
|
+
This package follows semantic versioning:
|
|
96
|
+
|
|
97
|
+
- **Major**: Breaking changes to existing contracts
|
|
98
|
+
- **Minor**: Additive changes (new fields, optional properties)
|
|
99
|
+
- **Patch**: Bug fixes and documentation updates
|
|
100
|
+
|
|
101
|
+
JSON schemas are versioned independently under `/schemas/{namespace}/v{major}.{minor}.{patch}.json`.
|
|
102
|
+
|
|
103
|
+
## Type Safety
|
|
104
|
+
|
|
105
|
+
All types are derived from Zod schemas to ensure runtime validation matches TypeScript types:
|
|
106
|
+
|
|
107
|
+
```typescript
|
|
108
|
+
// Schema definition
|
|
109
|
+
export const ProofMetaSchema = z.object({
|
|
110
|
+
did: z.string().min(1),
|
|
111
|
+
kid: z.string().min(1),
|
|
112
|
+
// ...
|
|
113
|
+
});
|
|
114
|
+
|
|
115
|
+
// Type derived from schema
|
|
116
|
+
export type ProofMeta = z.infer<typeof ProofMetaSchema>;
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
## Bundle Size
|
|
120
|
+
|
|
121
|
+
This package is optimized for minimal bundle impact:
|
|
122
|
+
|
|
123
|
+
- **Tarball size**: < 50 KB
|
|
124
|
+
- **Side effects**: None (`"sideEffects": false`)
|
|
125
|
+
- **Tree-shaking**: Full ESM support
|
|
126
|
+
- **Dependencies**: Only Zod for schema validation
|
|
127
|
+
|
|
128
|
+
## License
|
|
129
|
+
|
|
130
|
+
MIT
|
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1,242 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
/**
|
|
3
|
+
* CLI command schemas and results
|
|
4
|
+
*/
|
|
5
|
+
export declare const IdentityConfigSchema: z.ZodObject<{
|
|
6
|
+
version: z.ZodLiteral<"1.0">;
|
|
7
|
+
did: z.ZodString;
|
|
8
|
+
keyId: z.ZodString;
|
|
9
|
+
privateKey: z.ZodString;
|
|
10
|
+
publicKey: z.ZodString;
|
|
11
|
+
createdAt: z.ZodString;
|
|
12
|
+
lastRotated: z.ZodString;
|
|
13
|
+
}, "strip", z.ZodTypeAny, {
|
|
14
|
+
version: "1.0";
|
|
15
|
+
did: string;
|
|
16
|
+
keyId: string;
|
|
17
|
+
privateKey: string;
|
|
18
|
+
publicKey: string;
|
|
19
|
+
createdAt: string;
|
|
20
|
+
lastRotated: string;
|
|
21
|
+
}, {
|
|
22
|
+
version: "1.0";
|
|
23
|
+
did: string;
|
|
24
|
+
keyId: string;
|
|
25
|
+
privateKey: string;
|
|
26
|
+
publicKey: string;
|
|
27
|
+
createdAt: string;
|
|
28
|
+
lastRotated: string;
|
|
29
|
+
}>;
|
|
30
|
+
export declare const KeyRotationResultSchema: z.ZodObject<{
|
|
31
|
+
success: z.ZodBoolean;
|
|
32
|
+
oldKeyId: z.ZodString;
|
|
33
|
+
newKeyId: z.ZodString;
|
|
34
|
+
did: z.ZodString;
|
|
35
|
+
mode: z.ZodEnum<["dev", "prod"]>;
|
|
36
|
+
delegated: z.ZodBoolean;
|
|
37
|
+
forced: z.ZodBoolean;
|
|
38
|
+
auditLine: z.ZodString;
|
|
39
|
+
}, "strip", z.ZodTypeAny, {
|
|
40
|
+
did: string;
|
|
41
|
+
success: boolean;
|
|
42
|
+
oldKeyId: string;
|
|
43
|
+
newKeyId: string;
|
|
44
|
+
mode: "dev" | "prod";
|
|
45
|
+
delegated: boolean;
|
|
46
|
+
forced: boolean;
|
|
47
|
+
auditLine: string;
|
|
48
|
+
}, {
|
|
49
|
+
did: string;
|
|
50
|
+
success: boolean;
|
|
51
|
+
oldKeyId: string;
|
|
52
|
+
newKeyId: string;
|
|
53
|
+
mode: "dev" | "prod";
|
|
54
|
+
delegated: boolean;
|
|
55
|
+
forced: boolean;
|
|
56
|
+
auditLine: string;
|
|
57
|
+
}>;
|
|
58
|
+
export declare const StatusReportSchema: z.ZodObject<{
|
|
59
|
+
did: z.ZodString;
|
|
60
|
+
keyId: z.ZodString;
|
|
61
|
+
ktaURL: z.ZodString;
|
|
62
|
+
mirrorStatus: z.ZodEnum<["pending", "success", "error"]>;
|
|
63
|
+
lastHandshake: z.ZodOptional<z.ZodNumber>;
|
|
64
|
+
environment: z.ZodEnum<["dev", "prod"]>;
|
|
65
|
+
}, "strip", z.ZodTypeAny, {
|
|
66
|
+
did: string;
|
|
67
|
+
keyId: string;
|
|
68
|
+
ktaURL: string;
|
|
69
|
+
mirrorStatus: "success" | "pending" | "error";
|
|
70
|
+
environment: "dev" | "prod";
|
|
71
|
+
lastHandshake?: number | undefined;
|
|
72
|
+
}, {
|
|
73
|
+
did: string;
|
|
74
|
+
keyId: string;
|
|
75
|
+
ktaURL: string;
|
|
76
|
+
mirrorStatus: "success" | "pending" | "error";
|
|
77
|
+
environment: "dev" | "prod";
|
|
78
|
+
lastHandshake?: number | undefined;
|
|
79
|
+
}>;
|
|
80
|
+
export declare const DoctorResultSchema: z.ZodObject<{
|
|
81
|
+
packages: z.ZodArray<z.ZodObject<{
|
|
82
|
+
name: z.ZodString;
|
|
83
|
+
version: z.ZodString;
|
|
84
|
+
compatible: z.ZodBoolean;
|
|
85
|
+
}, "strip", z.ZodTypeAny, {
|
|
86
|
+
version: string;
|
|
87
|
+
name: string;
|
|
88
|
+
compatible: boolean;
|
|
89
|
+
}, {
|
|
90
|
+
version: string;
|
|
91
|
+
name: string;
|
|
92
|
+
compatible: boolean;
|
|
93
|
+
}>, "many">;
|
|
94
|
+
xmcpUpstream: z.ZodObject<{
|
|
95
|
+
version: z.ZodString;
|
|
96
|
+
compatible: z.ZodBoolean;
|
|
97
|
+
}, "strip", z.ZodTypeAny, {
|
|
98
|
+
version: string;
|
|
99
|
+
compatible: boolean;
|
|
100
|
+
}, {
|
|
101
|
+
version: string;
|
|
102
|
+
compatible: boolean;
|
|
103
|
+
}>;
|
|
104
|
+
environment: z.ZodObject<{
|
|
105
|
+
valid: z.ZodBoolean;
|
|
106
|
+
missing: z.ZodArray<z.ZodString, "many">;
|
|
107
|
+
}, "strip", z.ZodTypeAny, {
|
|
108
|
+
valid: boolean;
|
|
109
|
+
missing: string[];
|
|
110
|
+
}, {
|
|
111
|
+
valid: boolean;
|
|
112
|
+
missing: string[];
|
|
113
|
+
}>;
|
|
114
|
+
kta: z.ZodObject<{
|
|
115
|
+
reachable: z.ZodBoolean;
|
|
116
|
+
authenticated: z.ZodBoolean;
|
|
117
|
+
}, "strip", z.ZodTypeAny, {
|
|
118
|
+
reachable: boolean;
|
|
119
|
+
authenticated: boolean;
|
|
120
|
+
}, {
|
|
121
|
+
reachable: boolean;
|
|
122
|
+
authenticated: boolean;
|
|
123
|
+
}>;
|
|
124
|
+
cache: z.ZodObject<{
|
|
125
|
+
type: z.ZodString;
|
|
126
|
+
functional: z.ZodBoolean;
|
|
127
|
+
}, "strip", z.ZodTypeAny, {
|
|
128
|
+
type: string;
|
|
129
|
+
functional: boolean;
|
|
130
|
+
}, {
|
|
131
|
+
type: string;
|
|
132
|
+
functional: boolean;
|
|
133
|
+
}>;
|
|
134
|
+
}, "strip", z.ZodTypeAny, {
|
|
135
|
+
environment: {
|
|
136
|
+
valid: boolean;
|
|
137
|
+
missing: string[];
|
|
138
|
+
};
|
|
139
|
+
packages: {
|
|
140
|
+
version: string;
|
|
141
|
+
name: string;
|
|
142
|
+
compatible: boolean;
|
|
143
|
+
}[];
|
|
144
|
+
xmcpUpstream: {
|
|
145
|
+
version: string;
|
|
146
|
+
compatible: boolean;
|
|
147
|
+
};
|
|
148
|
+
kta: {
|
|
149
|
+
reachable: boolean;
|
|
150
|
+
authenticated: boolean;
|
|
151
|
+
};
|
|
152
|
+
cache: {
|
|
153
|
+
type: string;
|
|
154
|
+
functional: boolean;
|
|
155
|
+
};
|
|
156
|
+
}, {
|
|
157
|
+
environment: {
|
|
158
|
+
valid: boolean;
|
|
159
|
+
missing: string[];
|
|
160
|
+
};
|
|
161
|
+
packages: {
|
|
162
|
+
version: string;
|
|
163
|
+
name: string;
|
|
164
|
+
compatible: boolean;
|
|
165
|
+
}[];
|
|
166
|
+
xmcpUpstream: {
|
|
167
|
+
version: string;
|
|
168
|
+
compatible: boolean;
|
|
169
|
+
};
|
|
170
|
+
kta: {
|
|
171
|
+
reachable: boolean;
|
|
172
|
+
authenticated: boolean;
|
|
173
|
+
};
|
|
174
|
+
cache: {
|
|
175
|
+
type: string;
|
|
176
|
+
functional: boolean;
|
|
177
|
+
};
|
|
178
|
+
}>;
|
|
179
|
+
export declare const ScaffolderOptionsSchema: z.ZodObject<{
|
|
180
|
+
projectName: z.ZodString;
|
|
181
|
+
xmcpVersion: z.ZodOptional<z.ZodString>;
|
|
182
|
+
xmcpChannel: z.ZodOptional<z.ZodEnum<["latest", "next"]>>;
|
|
183
|
+
noIdentity: z.ZodDefault<z.ZodBoolean>;
|
|
184
|
+
}, "strip", z.ZodTypeAny, {
|
|
185
|
+
projectName: string;
|
|
186
|
+
noIdentity: boolean;
|
|
187
|
+
xmcpVersion?: string | undefined;
|
|
188
|
+
xmcpChannel?: "latest" | "next" | undefined;
|
|
189
|
+
}, {
|
|
190
|
+
projectName: string;
|
|
191
|
+
xmcpVersion?: string | undefined;
|
|
192
|
+
xmcpChannel?: "latest" | "next" | undefined;
|
|
193
|
+
noIdentity?: boolean | undefined;
|
|
194
|
+
}>;
|
|
195
|
+
export declare const ScaffolderResultSchema: z.ZodObject<{
|
|
196
|
+
success: z.ZodBoolean;
|
|
197
|
+
projectPath: z.ZodString;
|
|
198
|
+
xmcpVersion: z.ZodString;
|
|
199
|
+
identityEnabled: z.ZodBoolean;
|
|
200
|
+
warnings: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
201
|
+
}, "strip", z.ZodTypeAny, {
|
|
202
|
+
success: boolean;
|
|
203
|
+
xmcpVersion: string;
|
|
204
|
+
projectPath: string;
|
|
205
|
+
identityEnabled: boolean;
|
|
206
|
+
warnings?: string[] | undefined;
|
|
207
|
+
}, {
|
|
208
|
+
success: boolean;
|
|
209
|
+
xmcpVersion: string;
|
|
210
|
+
projectPath: string;
|
|
211
|
+
identityEnabled: boolean;
|
|
212
|
+
warnings?: string[] | undefined;
|
|
213
|
+
}>;
|
|
214
|
+
export type IdentityConfig = z.infer<typeof IdentityConfigSchema>;
|
|
215
|
+
export type KeyRotationResult = z.infer<typeof KeyRotationResultSchema>;
|
|
216
|
+
export type StatusReport = z.infer<typeof StatusReportSchema>;
|
|
217
|
+
export type DoctorResult = z.infer<typeof DoctorResultSchema>;
|
|
218
|
+
export type ScaffolderOptions = z.infer<typeof ScaffolderOptionsSchema>;
|
|
219
|
+
export type ScaffolderResult = z.infer<typeof ScaffolderResultSchema>;
|
|
220
|
+
export declare const ERROR_CODES: {
|
|
221
|
+
readonly XMCP_I_EBADPROOF: "XMCP_I_EBADPROOF";
|
|
222
|
+
readonly XMCP_I_ENOIDENTITY: "XMCP_I_ENOIDENTITY";
|
|
223
|
+
readonly XMCP_I_EMIRRORPENDING: "XMCP_I_EMIRRORPENDING";
|
|
224
|
+
readonly XMCP_I_EHANDSHAKE: "XMCP_I_EHANDSHAKE";
|
|
225
|
+
readonly XMCP_I_ESESSION: "XMCP_I_ESESSION";
|
|
226
|
+
readonly XMCP_I_ECLAIM: "XMCP_I_ECLAIM";
|
|
227
|
+
readonly XMCP_I_ECONFIG: "XMCP_I_ECONFIG";
|
|
228
|
+
readonly XMCP_I_ERUNTIME: "XMCP_I_ERUNTIME";
|
|
229
|
+
};
|
|
230
|
+
export type ErrorCode = keyof typeof ERROR_CODES;
|
|
231
|
+
export declare const CLI_EXIT_CODES: {
|
|
232
|
+
readonly SUCCESS: 0;
|
|
233
|
+
readonly GENERAL_ERROR: 1;
|
|
234
|
+
readonly BADPROOF: 20;
|
|
235
|
+
readonly NOIDENTITY: 21;
|
|
236
|
+
readonly HANDSHAKE: 22;
|
|
237
|
+
readonly SESSION: 23;
|
|
238
|
+
readonly CLAIM: 24;
|
|
239
|
+
readonly CONFIG: 25;
|
|
240
|
+
readonly RUNTIME: 26;
|
|
241
|
+
};
|
|
242
|
+
//# sourceMappingURL=cli.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;GAEG;AAEH,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;EAQ/B,CAAC;AAEH,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;;;;;;;;;;EASlC,CAAC;AAEH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;EAO7B,CAAC;AAEH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAwB7B,CAAC;AAEH,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;EAKlC,CAAC;AAEH,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;EAMjC,CAAC;AAGH,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAClE,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC;AACxE,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAC9D,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAC9D,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC;AACxE,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AAGtE,eAAO,MAAM,WAAW;;;;;;;;;CASd,CAAC;AAEX,MAAM,MAAM,SAAS,GAAG,MAAM,OAAO,WAAW,CAAC;AAGjD,eAAO,MAAM,cAAc;;;;;;;;;;CAUjB,CAAC"}
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
/**
|
|
3
|
+
* CLI command schemas and results
|
|
4
|
+
*/
|
|
5
|
+
export const IdentityConfigSchema = z.object({
|
|
6
|
+
version: z.literal("1.0"),
|
|
7
|
+
did: z.string().min(1),
|
|
8
|
+
keyId: z.string().min(1),
|
|
9
|
+
privateKey: z.string().min(1), // base64-encoded Ed25519 private key
|
|
10
|
+
publicKey: z.string().min(1), // base64-encoded Ed25519 public key
|
|
11
|
+
createdAt: z.string().datetime(),
|
|
12
|
+
lastRotated: z.string().datetime(),
|
|
13
|
+
});
|
|
14
|
+
export const KeyRotationResultSchema = z.object({
|
|
15
|
+
success: z.boolean(),
|
|
16
|
+
oldKeyId: z.string().min(1),
|
|
17
|
+
newKeyId: z.string().min(1),
|
|
18
|
+
did: z.string().min(1),
|
|
19
|
+
mode: z.enum(["dev", "prod"]),
|
|
20
|
+
delegated: z.boolean(),
|
|
21
|
+
forced: z.boolean(),
|
|
22
|
+
auditLine: z.string().min(1),
|
|
23
|
+
});
|
|
24
|
+
export const StatusReportSchema = z.object({
|
|
25
|
+
did: z.string().min(1),
|
|
26
|
+
keyId: z.string().min(1),
|
|
27
|
+
ktaURL: z.string().url(),
|
|
28
|
+
mirrorStatus: z.enum(["pending", "success", "error"]),
|
|
29
|
+
lastHandshake: z.number().int().positive().optional(),
|
|
30
|
+
environment: z.enum(["dev", "prod"]),
|
|
31
|
+
});
|
|
32
|
+
export const DoctorResultSchema = z.object({
|
|
33
|
+
packages: z.array(z.object({
|
|
34
|
+
name: z.string(),
|
|
35
|
+
version: z.string(),
|
|
36
|
+
compatible: z.boolean(),
|
|
37
|
+
})),
|
|
38
|
+
xmcpUpstream: z.object({
|
|
39
|
+
version: z.string(),
|
|
40
|
+
compatible: z.boolean(),
|
|
41
|
+
}),
|
|
42
|
+
environment: z.object({
|
|
43
|
+
valid: z.boolean(),
|
|
44
|
+
missing: z.array(z.string()),
|
|
45
|
+
}),
|
|
46
|
+
kta: z.object({
|
|
47
|
+
reachable: z.boolean(),
|
|
48
|
+
authenticated: z.boolean(),
|
|
49
|
+
}),
|
|
50
|
+
cache: z.object({
|
|
51
|
+
type: z.string(),
|
|
52
|
+
functional: z.boolean(),
|
|
53
|
+
}),
|
|
54
|
+
});
|
|
55
|
+
export const ScaffolderOptionsSchema = z.object({
|
|
56
|
+
projectName: z.string().min(1),
|
|
57
|
+
xmcpVersion: z.string().optional(),
|
|
58
|
+
xmcpChannel: z.enum(["latest", "next"]).optional(),
|
|
59
|
+
noIdentity: z.boolean().default(false),
|
|
60
|
+
});
|
|
61
|
+
export const ScaffolderResultSchema = z.object({
|
|
62
|
+
success: z.boolean(),
|
|
63
|
+
projectPath: z.string().min(1),
|
|
64
|
+
xmcpVersion: z.string().min(1),
|
|
65
|
+
identityEnabled: z.boolean(),
|
|
66
|
+
warnings: z.array(z.string()).optional(),
|
|
67
|
+
});
|
|
68
|
+
// Error codes as string literal union
|
|
69
|
+
export const ERROR_CODES = {
|
|
70
|
+
XMCP_I_EBADPROOF: "XMCP_I_EBADPROOF",
|
|
71
|
+
XMCP_I_ENOIDENTITY: "XMCP_I_ENOIDENTITY",
|
|
72
|
+
XMCP_I_EMIRRORPENDING: "XMCP_I_EMIRRORPENDING",
|
|
73
|
+
XMCP_I_EHANDSHAKE: "XMCP_I_EHANDSHAKE",
|
|
74
|
+
XMCP_I_ESESSION: "XMCP_I_ESESSION",
|
|
75
|
+
XMCP_I_ECLAIM: "XMCP_I_ECLAIM",
|
|
76
|
+
XMCP_I_ECONFIG: "XMCP_I_ECONFIG",
|
|
77
|
+
XMCP_I_ERUNTIME: "XMCP_I_ERUNTIME",
|
|
78
|
+
};
|
|
79
|
+
// CLI exit codes
|
|
80
|
+
export const CLI_EXIT_CODES = {
|
|
81
|
+
SUCCESS: 0,
|
|
82
|
+
GENERAL_ERROR: 1,
|
|
83
|
+
BADPROOF: 20,
|
|
84
|
+
NOIDENTITY: 21,
|
|
85
|
+
HANDSHAKE: 22,
|
|
86
|
+
SESSION: 23,
|
|
87
|
+
CLAIM: 24,
|
|
88
|
+
CONFIG: 25,
|
|
89
|
+
RUNTIME: 26,
|
|
90
|
+
};
|
|
91
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
/**
|
|
3
|
+
* Handshake and session management schemas
|
|
4
|
+
*/
|
|
5
|
+
export declare const HandshakeRequestSchema: z.ZodObject<{
|
|
6
|
+
nonce: z.ZodString;
|
|
7
|
+
audience: z.ZodString;
|
|
8
|
+
timestamp: z.ZodNumber;
|
|
9
|
+
}, "strip", z.ZodTypeAny, {
|
|
10
|
+
nonce: string;
|
|
11
|
+
audience: string;
|
|
12
|
+
timestamp: number;
|
|
13
|
+
}, {
|
|
14
|
+
nonce: string;
|
|
15
|
+
audience: string;
|
|
16
|
+
timestamp: number;
|
|
17
|
+
}>;
|
|
18
|
+
export declare const SessionContextSchema: z.ZodObject<{
|
|
19
|
+
sessionId: z.ZodString;
|
|
20
|
+
audience: z.ZodString;
|
|
21
|
+
nonce: z.ZodString;
|
|
22
|
+
timestamp: z.ZodNumber;
|
|
23
|
+
createdAt: z.ZodNumber;
|
|
24
|
+
lastActivity: z.ZodNumber;
|
|
25
|
+
ttlMinutes: z.ZodDefault<z.ZodNumber>;
|
|
26
|
+
}, "strip", z.ZodTypeAny, {
|
|
27
|
+
createdAt: number;
|
|
28
|
+
nonce: string;
|
|
29
|
+
audience: string;
|
|
30
|
+
timestamp: number;
|
|
31
|
+
sessionId: string;
|
|
32
|
+
lastActivity: number;
|
|
33
|
+
ttlMinutes: number;
|
|
34
|
+
}, {
|
|
35
|
+
createdAt: number;
|
|
36
|
+
nonce: string;
|
|
37
|
+
audience: string;
|
|
38
|
+
timestamp: number;
|
|
39
|
+
sessionId: string;
|
|
40
|
+
lastActivity: number;
|
|
41
|
+
ttlMinutes?: number | undefined;
|
|
42
|
+
}>;
|
|
43
|
+
export declare const NonceCacheEntrySchema: z.ZodObject<{
|
|
44
|
+
sessionId: z.ZodString;
|
|
45
|
+
expiresAt: z.ZodNumber;
|
|
46
|
+
}, "strip", z.ZodTypeAny, {
|
|
47
|
+
sessionId: string;
|
|
48
|
+
expiresAt: number;
|
|
49
|
+
}, {
|
|
50
|
+
sessionId: string;
|
|
51
|
+
expiresAt: number;
|
|
52
|
+
}>;
|
|
53
|
+
export type HandshakeRequest = z.infer<typeof HandshakeRequestSchema>;
|
|
54
|
+
export type SessionContext = z.infer<typeof SessionContextSchema>;
|
|
55
|
+
export type NonceCacheEntry = z.infer<typeof NonceCacheEntrySchema>;
|
|
56
|
+
/**
|
|
57
|
+
* Nonce cache interface for replay prevention
|
|
58
|
+
*/
|
|
59
|
+
export interface NonceCache {
|
|
60
|
+
/**
|
|
61
|
+
* Check if a nonce exists in the cache
|
|
62
|
+
*/
|
|
63
|
+
has(nonce: string): Promise<boolean>;
|
|
64
|
+
/**
|
|
65
|
+
* Add a nonce to the cache with TTL
|
|
66
|
+
* MUST ensure atomic add-if-absent semantics for replay prevention
|
|
67
|
+
*/
|
|
68
|
+
add(nonce: string, ttl: number): Promise<void>;
|
|
69
|
+
/**
|
|
70
|
+
* Clean up expired entries
|
|
71
|
+
* Should be safe to call frequently and should be no-op for backends that auto-expire
|
|
72
|
+
*/
|
|
73
|
+
cleanup(): Promise<void>;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Configuration for nonce cache implementations
|
|
77
|
+
*/
|
|
78
|
+
export declare const NonceCacheConfigSchema: z.ZodObject<{
|
|
79
|
+
type: z.ZodOptional<z.ZodEnum<["memory", "redis", "dynamodb", "cloudflare-kv"]>>;
|
|
80
|
+
redis: z.ZodOptional<z.ZodObject<{
|
|
81
|
+
url: z.ZodString;
|
|
82
|
+
keyPrefix: z.ZodDefault<z.ZodString>;
|
|
83
|
+
}, "strip", z.ZodTypeAny, {
|
|
84
|
+
url: string;
|
|
85
|
+
keyPrefix: string;
|
|
86
|
+
}, {
|
|
87
|
+
url: string;
|
|
88
|
+
keyPrefix?: string | undefined;
|
|
89
|
+
}>>;
|
|
90
|
+
dynamodb: z.ZodOptional<z.ZodObject<{
|
|
91
|
+
tableName: z.ZodString;
|
|
92
|
+
region: z.ZodOptional<z.ZodString>;
|
|
93
|
+
keyAttribute: z.ZodDefault<z.ZodString>;
|
|
94
|
+
ttlAttribute: z.ZodDefault<z.ZodString>;
|
|
95
|
+
}, "strip", z.ZodTypeAny, {
|
|
96
|
+
tableName: string;
|
|
97
|
+
keyAttribute: string;
|
|
98
|
+
ttlAttribute: string;
|
|
99
|
+
region?: string | undefined;
|
|
100
|
+
}, {
|
|
101
|
+
tableName: string;
|
|
102
|
+
region?: string | undefined;
|
|
103
|
+
keyAttribute?: string | undefined;
|
|
104
|
+
ttlAttribute?: string | undefined;
|
|
105
|
+
}>>;
|
|
106
|
+
cloudflareKv: z.ZodOptional<z.ZodObject<{
|
|
107
|
+
namespace: z.ZodString;
|
|
108
|
+
keyPrefix: z.ZodDefault<z.ZodString>;
|
|
109
|
+
}, "strip", z.ZodTypeAny, {
|
|
110
|
+
keyPrefix: string;
|
|
111
|
+
namespace: string;
|
|
112
|
+
}, {
|
|
113
|
+
namespace: string;
|
|
114
|
+
keyPrefix?: string | undefined;
|
|
115
|
+
}>>;
|
|
116
|
+
}, "strip", z.ZodTypeAny, {
|
|
117
|
+
type?: "memory" | "redis" | "dynamodb" | "cloudflare-kv" | undefined;
|
|
118
|
+
redis?: {
|
|
119
|
+
url: string;
|
|
120
|
+
keyPrefix: string;
|
|
121
|
+
} | undefined;
|
|
122
|
+
dynamodb?: {
|
|
123
|
+
tableName: string;
|
|
124
|
+
keyAttribute: string;
|
|
125
|
+
ttlAttribute: string;
|
|
126
|
+
region?: string | undefined;
|
|
127
|
+
} | undefined;
|
|
128
|
+
cloudflareKv?: {
|
|
129
|
+
keyPrefix: string;
|
|
130
|
+
namespace: string;
|
|
131
|
+
} | undefined;
|
|
132
|
+
}, {
|
|
133
|
+
type?: "memory" | "redis" | "dynamodb" | "cloudflare-kv" | undefined;
|
|
134
|
+
redis?: {
|
|
135
|
+
url: string;
|
|
136
|
+
keyPrefix?: string | undefined;
|
|
137
|
+
} | undefined;
|
|
138
|
+
dynamodb?: {
|
|
139
|
+
tableName: string;
|
|
140
|
+
region?: string | undefined;
|
|
141
|
+
keyAttribute?: string | undefined;
|
|
142
|
+
ttlAttribute?: string | undefined;
|
|
143
|
+
} | undefined;
|
|
144
|
+
cloudflareKv?: {
|
|
145
|
+
namespace: string;
|
|
146
|
+
keyPrefix?: string | undefined;
|
|
147
|
+
} | undefined;
|
|
148
|
+
}>;
|
|
149
|
+
export type NonceCacheConfig = z.infer<typeof NonceCacheConfigSchema>;
|
|
150
|
+
export declare const DEFAULT_SESSION_TTL_MINUTES = 30;
|
|
151
|
+
export declare const DEFAULT_TIMESTAMP_SKEW_SECONDS = 120;
|
|
152
|
+
export declare const NONCE_LENGTH_BYTES = 16;
|
|
153
|
+
//# sourceMappingURL=handshake.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handshake.d.ts","sourceRoot":"","sources":["../src/handshake.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;GAEG;AAEH,eAAO,MAAM,sBAAsB;;;;;;;;;;;;EAIjC,CAAC;AAEH,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;EAQ/B,CAAC;AAEH,eAAO,MAAM,qBAAqB;;;;;;;;;EAGhC,CAAC;AAGH,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AACtE,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAClE,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAEpE;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB;;OAEG;IACH,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAErC;;;OAGG;IACH,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE/C;;;OAGG;IACH,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1B;AAED;;GAEG;AACH,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAsBjC,CAAC;AAEH,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AAGtE,eAAO,MAAM,2BAA2B,KAAK,CAAC;AAC9C,eAAO,MAAM,8BAA8B,MAAM,CAAC;AAClD,eAAO,MAAM,kBAAkB,KAAK,CAAC"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
/**
|
|
3
|
+
* Handshake and session management schemas
|
|
4
|
+
*/
|
|
5
|
+
export const HandshakeRequestSchema = z.object({
|
|
6
|
+
nonce: z.string().min(1),
|
|
7
|
+
audience: z.string().min(1),
|
|
8
|
+
timestamp: z.number().int().positive(),
|
|
9
|
+
});
|
|
10
|
+
export const SessionContextSchema = z.object({
|
|
11
|
+
sessionId: z.string().min(1),
|
|
12
|
+
audience: z.string().min(1),
|
|
13
|
+
nonce: z.string().min(1),
|
|
14
|
+
timestamp: z.number().int().positive(),
|
|
15
|
+
createdAt: z.number().int().positive(),
|
|
16
|
+
lastActivity: z.number().int().positive(),
|
|
17
|
+
ttlMinutes: z.number().int().positive().default(30),
|
|
18
|
+
});
|
|
19
|
+
export const NonceCacheEntrySchema = z.object({
|
|
20
|
+
sessionId: z.string().min(1),
|
|
21
|
+
expiresAt: z.number().int().positive(),
|
|
22
|
+
});
|
|
23
|
+
/**
|
|
24
|
+
* Configuration for nonce cache implementations
|
|
25
|
+
*/
|
|
26
|
+
export const NonceCacheConfigSchema = z.object({
|
|
27
|
+
type: z.enum(["memory", "redis", "dynamodb", "cloudflare-kv"]).optional(),
|
|
28
|
+
redis: z
|
|
29
|
+
.object({
|
|
30
|
+
url: z.string().url(),
|
|
31
|
+
keyPrefix: z.string().default("xmcpi:nonce:"),
|
|
32
|
+
})
|
|
33
|
+
.optional(),
|
|
34
|
+
dynamodb: z
|
|
35
|
+
.object({
|
|
36
|
+
tableName: z.string(),
|
|
37
|
+
region: z.string().optional(),
|
|
38
|
+
keyAttribute: z.string().default("nonce"),
|
|
39
|
+
ttlAttribute: z.string().default("expiresAt"),
|
|
40
|
+
})
|
|
41
|
+
.optional(),
|
|
42
|
+
cloudflareKv: z
|
|
43
|
+
.object({
|
|
44
|
+
namespace: z.string(),
|
|
45
|
+
keyPrefix: z.string().default("nonce:"),
|
|
46
|
+
})
|
|
47
|
+
.optional(),
|
|
48
|
+
});
|
|
49
|
+
// Constants
|
|
50
|
+
export const DEFAULT_SESSION_TTL_MINUTES = 30;
|
|
51
|
+
export const DEFAULT_TIMESTAMP_SKEW_SECONDS = 120;
|
|
52
|
+
export const NONCE_LENGTH_BYTES = 16; // 128-bit
|
|
53
|
+
//# sourceMappingURL=handshake.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handshake.js","sourceRoot":"","sources":["../src/handshake.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;GAEG;AAEH,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC7C,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACxB,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC3B,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;CACvC,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3C,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC5B,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC3B,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACxB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;IACtC,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;IACtC,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;IACzC,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;CACpD,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC5C,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC5B,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;CACvC,CAAC,CAAC;AA6BH;;GAEG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC7C,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,eAAe,CAAC,CAAC,CAAC,QAAQ,EAAE;IACzE,KAAK,EAAE,CAAC;SACL,MAAM,CAAC;QACN,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE;QACrB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,cAAc,CAAC;KAC9C,CAAC;SACD,QAAQ,EAAE;IACb,QAAQ,EAAE,CAAC;SACR,MAAM,CAAC;QACN,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;QACrB,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QAC7B,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC;QACzC,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,WAAW,CAAC;KAC9C,CAAC;SACD,QAAQ,EAAE;IACb,YAAY,EAAE,CAAC;SACZ,MAAM,CAAC;QACN,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;QACrB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC;KACxC,CAAC;SACD,QAAQ,EAAE;CACd,CAAC,CAAC;AAIH,YAAY;AACZ,MAAM,CAAC,MAAM,2BAA2B,GAAG,EAAE,CAAC;AAC9C,MAAM,CAAC,MAAM,8BAA8B,GAAG,GAAG,CAAC;AAClD,MAAM,CAAC,MAAM,kBAAkB,GAAG,EAAE,CAAC,CAAC,UAAU"}
|