@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 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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;GAEG;AAEH,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3C,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC;IACzB,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACtB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACxB,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,qCAAqC;IACpE,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,oCAAoC;IAClE,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAChC,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CACnC,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC9C,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE;IACpB,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC3B,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC3B,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACtB,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IAC7B,SAAS,EAAE,CAAC,CAAC,OAAO,EAAE;IACtB,MAAM,EAAE,CAAC,CAAC,OAAO,EAAE;IACnB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;CAC7B,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC;IACzC,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACtB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACxB,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE;IACxB,YAAY,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;IACrD,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;IACrD,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;CACrC,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC;IACzC,QAAQ,EAAE,CAAC,CAAC,KAAK,CACf,CAAC,CAAC,MAAM,CAAC;QACP,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;QAChB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;QACnB,UAAU,EAAE,CAAC,CAAC,OAAO,EAAE;KACxB,CAAC,CACH;IACD,YAAY,EAAE,CAAC,CAAC,MAAM,CAAC;QACrB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;QACnB,UAAU,EAAE,CAAC,CAAC,OAAO,EAAE;KACxB,CAAC;IACF,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;QACpB,KAAK,EAAE,CAAC,CAAC,OAAO,EAAE;QAClB,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;KAC7B,CAAC;IACF,GAAG,EAAE,CAAC,CAAC,MAAM,CAAC;QACZ,SAAS,EAAE,CAAC,CAAC,OAAO,EAAE;QACtB,aAAa,EAAE,CAAC,CAAC,OAAO,EAAE;KAC3B,CAAC;IACF,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC;QACd,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;QAChB,UAAU,EAAE,CAAC,CAAC,OAAO,EAAE;KACxB,CAAC;CACH,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC9C,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC9B,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAClC,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,EAAE;IAClD,UAAU,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;CACvC,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC7C,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE;IACpB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC9B,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC9B,eAAe,EAAE,CAAC,CAAC,OAAO,EAAE;IAC5B,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;CACzC,CAAC,CAAC;AAUH,sCAAsC;AACtC,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,gBAAgB,EAAE,kBAAkB;IACpC,kBAAkB,EAAE,oBAAoB;IACxC,qBAAqB,EAAE,uBAAuB;IAC9C,iBAAiB,EAAE,mBAAmB;IACtC,eAAe,EAAE,iBAAiB;IAClC,aAAa,EAAE,eAAe;IAC9B,cAAc,EAAE,gBAAgB;IAChC,eAAe,EAAE,iBAAiB;CAC1B,CAAC;AAIX,iBAAiB;AACjB,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,OAAO,EAAE,CAAC;IACV,aAAa,EAAE,CAAC;IAChB,QAAQ,EAAE,EAAE;IACZ,UAAU,EAAE,EAAE;IACd,SAAS,EAAE,EAAE;IACb,OAAO,EAAE,EAAE;IACX,KAAK,EAAE,EAAE;IACT,MAAM,EAAE,EAAE;IACV,OAAO,EAAE,EAAE;CACH,CAAC"}
@@ -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"}