@kya-os/mcp 1.17.0 → 1.20.0
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/CHANGELOG.md +398 -0
- package/CONFORMANCE.md +18 -6
- package/README.md +59 -0
- package/SPEC.md +57 -4
- package/dist/card/cimd.js +6 -2
- package/dist/card/cimd.js.map +1 -1
- package/dist/card/delegation.d.ts +12 -3
- package/dist/card/delegation.js +13 -7
- package/dist/card/delegation.js.map +1 -1
- package/dist/card/index.d.ts +1 -0
- package/dist/card/index.js +1 -0
- package/dist/card/index.js.map +1 -1
- package/dist/card/revocation.d.ts +15 -4
- package/dist/card/revocation.js +9 -4
- package/dist/card/revocation.js.map +1 -1
- package/dist/card/status-list-proof.d.ts +32 -0
- package/dist/card/status-list-proof.js +102 -0
- package/dist/card/status-list-proof.js.map +1 -0
- package/dist/delegation/chain-enforcement.d.ts +16 -0
- package/dist/delegation/chain-enforcement.js +17 -0
- package/dist/delegation/chain-enforcement.js.map +1 -1
- package/dist/delegation/verification-method-key.d.ts +4 -1
- package/dist/delegation/verification-method-key.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/middleware/index.d.ts +3 -1
- package/dist/middleware/index.js +2 -0
- package/dist/middleware/index.js.map +1 -1
- package/dist/middleware/kya-os-transport.d.ts +43 -12
- package/dist/middleware/kya-os-transport.js +151 -28
- package/dist/middleware/kya-os-transport.js.map +1 -1
- package/dist/middleware/mcp-tool-callback.d.ts +48 -0
- package/dist/middleware/mcp-tool-callback.js +38 -0
- package/dist/middleware/mcp-tool-callback.js.map +1 -0
- package/dist/middleware/serve-in-process.d.ts +41 -0
- package/dist/middleware/serve-in-process.js +86 -0
- package/dist/middleware/serve-in-process.js.map +1 -0
- package/dist/middleware/with-kya-os-server.d.ts +20 -3
- package/dist/middleware/with-kya-os-server.js +16 -1
- package/dist/middleware/with-kya-os-server.js.map +1 -1
- package/dist/middleware/with-kya-os.config-types.d.ts +34 -0
- package/dist/middleware/with-kya-os.d.ts +4 -0
- package/dist/middleware/with-kya-os.delegation-gate.d.ts +2 -1
- package/dist/middleware/with-kya-os.delegation-gate.js +12 -18
- package/dist/middleware/with-kya-os.delegation-gate.js.map +1 -1
- package/dist/middleware/with-kya-os.delegation-verify.d.ts +7 -12
- package/dist/middleware/with-kya-os.delegation-verify.js +44 -9
- package/dist/middleware/with-kya-os.delegation-verify.js.map +1 -1
- package/dist/middleware/with-kya-os.deps.d.ts +15 -4
- package/dist/middleware/with-kya-os.helpers.d.ts +5 -0
- package/dist/middleware/with-kya-os.helpers.js +13 -0
- package/dist/middleware/with-kya-os.helpers.js.map +1 -1
- package/dist/middleware/with-kya-os.js +23 -0
- package/dist/middleware/with-kya-os.js.map +1 -1
- package/dist/middleware/with-kya-os.outcome.d.ts +18 -0
- package/dist/middleware/with-kya-os.outcome.js +36 -0
- package/dist/middleware/with-kya-os.outcome.js.map +1 -0
- package/dist/middleware/with-kya-os.policy-gate.d.ts +2 -1
- package/dist/middleware/with-kya-os.policy-gate.js +2 -1
- package/dist/middleware/with-kya-os.policy-gate.js.map +1 -1
- package/dist/middleware/with-kya-os.session.d.ts +76 -10
- package/dist/middleware/with-kya-os.session.js +739 -164
- package/dist/middleware/with-kya-os.session.js.map +1 -1
- package/dist/middleware/with-kya-os.types.d.ts +102 -8
- package/dist/proof/generator.d.ts +13 -0
- package/dist/proof/generator.js +15 -0
- package/dist/proof/generator.js.map +1 -1
- package/dist/proof/verifier.js +14 -9
- package/dist/proof/verifier.js.map +1 -1
- package/package.json +18 -14
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Call KYA-OS-wrapped tool handlers in process, outside an MCP server, and
|
|
3
|
+
* get the results a client would receive.
|
|
4
|
+
*
|
|
5
|
+
* The middleware makes its response proofs where the KYA-OS transport sends a
|
|
6
|
+
* result, because the MCP SDK changes a result after the handler returns it.
|
|
7
|
+
* A script, a walkthrough or a test that calls a wrapped handler directly
|
|
8
|
+
* therefore needs a KYA-OS transport to send what the handler returns, as a
|
|
9
|
+
* server connected through `withKyaOs()` or `createKyaOsTransport()` has. This
|
|
10
|
+
* module is that transport, with nothing on the far end but the caller.
|
|
11
|
+
*
|
|
12
|
+
* ```ts
|
|
13
|
+
* const local = serveInProcess(kyaos);
|
|
14
|
+
* const checkout = local.tool('checkout', kyaos.wrapWithDelegation('checkout', consent, handler));
|
|
15
|
+
* const result = await checkout({ item: 'laptop' }); // proved, as a client receives it
|
|
16
|
+
* await local.close();
|
|
17
|
+
* ```
|
|
18
|
+
*
|
|
19
|
+
* @module serve-in-process
|
|
20
|
+
*/
|
|
21
|
+
import type { KyaOsMiddleware, KyaOsToolHandler, KyaOsToolResult } from "./with-kya-os.types.js";
|
|
22
|
+
/** A KYA-OS transport for in-process calls, open until {@link InProcessServer.close}. */
|
|
23
|
+
export interface InProcessServer {
|
|
24
|
+
/**
|
|
25
|
+
* `handler`, answering as an MCP server would: its result goes through the
|
|
26
|
+
* KYA-OS transport, and the caller gets what a client receives, proof
|
|
27
|
+
* included. `toolName` names the call, as a client's `tools/call` would.
|
|
28
|
+
*/
|
|
29
|
+
tool<R = KyaOsToolResult>(toolName: string, handler: KyaOsToolHandler): (args: Record<string, unknown>, sessionId?: string) => Promise<R>;
|
|
30
|
+
/**
|
|
31
|
+
* Close the transport. It no longer counts as open for the middleware, and
|
|
32
|
+
* its tools refuse further calls.
|
|
33
|
+
*/
|
|
34
|
+
close(): Promise<void>;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Open a KYA-OS transport for `kyaos` whose far end is the caller. While it
|
|
38
|
+
* is open it counts as an open KYA-OS transport for the middleware, so close
|
|
39
|
+
* it when done.
|
|
40
|
+
*/
|
|
41
|
+
export declare function serveInProcess(kyaos: KyaOsMiddleware): InProcessServer;
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Call KYA-OS-wrapped tool handlers in process, outside an MCP server, and
|
|
3
|
+
* get the results a client would receive.
|
|
4
|
+
*
|
|
5
|
+
* The middleware makes its response proofs where the KYA-OS transport sends a
|
|
6
|
+
* result, because the MCP SDK changes a result after the handler returns it.
|
|
7
|
+
* A script, a walkthrough or a test that calls a wrapped handler directly
|
|
8
|
+
* therefore needs a KYA-OS transport to send what the handler returns, as a
|
|
9
|
+
* server connected through `withKyaOs()` or `createKyaOsTransport()` has. This
|
|
10
|
+
* module is that transport, with nothing on the far end but the caller.
|
|
11
|
+
*
|
|
12
|
+
* ```ts
|
|
13
|
+
* const local = serveInProcess(kyaos);
|
|
14
|
+
* const checkout = local.tool('checkout', kyaos.wrapWithDelegation('checkout', consent, handler));
|
|
15
|
+
* const result = await checkout({ item: 'laptop' }); // proved, as a client receives it
|
|
16
|
+
* await local.close();
|
|
17
|
+
* ```
|
|
18
|
+
*
|
|
19
|
+
* @module serve-in-process
|
|
20
|
+
*/
|
|
21
|
+
import { createKyaOsTransport } from "./kya-os-transport.js";
|
|
22
|
+
/**
|
|
23
|
+
* Open a KYA-OS transport for `kyaos` whose far end is the caller. While it
|
|
24
|
+
* is open it counts as an open KYA-OS transport for the middleware, so close
|
|
25
|
+
* it when done.
|
|
26
|
+
*/
|
|
27
|
+
export function serveInProcess(kyaos) {
|
|
28
|
+
// Each call's answer, by its request id, as it crossed the wire.
|
|
29
|
+
const answers = new Map();
|
|
30
|
+
let closed = false;
|
|
31
|
+
const inner = {
|
|
32
|
+
start: async () => { },
|
|
33
|
+
close: async () => { },
|
|
34
|
+
send: async (message) => {
|
|
35
|
+
// What crosses the wire is JSON.
|
|
36
|
+
if (typeof message.id === "number")
|
|
37
|
+
answers.set(message.id, JSON.parse(JSON.stringify(message)));
|
|
38
|
+
},
|
|
39
|
+
};
|
|
40
|
+
const transport = createKyaOsTransport(inner, kyaos);
|
|
41
|
+
const ready = transport.start();
|
|
42
|
+
let nextId = 0;
|
|
43
|
+
return {
|
|
44
|
+
tool(toolName, handler) {
|
|
45
|
+
return async (args, sessionId) => {
|
|
46
|
+
if (closed)
|
|
47
|
+
throw new Error("[kya-os] serveInProcess: the transport is closed");
|
|
48
|
+
await ready;
|
|
49
|
+
const id = ++nextId;
|
|
50
|
+
inner.onmessage?.({
|
|
51
|
+
jsonrpc: "2.0",
|
|
52
|
+
id,
|
|
53
|
+
method: "tools/call",
|
|
54
|
+
params: { name: toolName, arguments: args },
|
|
55
|
+
});
|
|
56
|
+
let result;
|
|
57
|
+
try {
|
|
58
|
+
result = await handler(args, sessionId);
|
|
59
|
+
}
|
|
60
|
+
catch (error) {
|
|
61
|
+
// Answered as a server answers a failed request, so the transport
|
|
62
|
+
// forgets the call; then the caller gets the handler's error.
|
|
63
|
+
await transport.send({
|
|
64
|
+
jsonrpc: "2.0",
|
|
65
|
+
id,
|
|
66
|
+
error: { code: -32603, message: error instanceof Error ? error.message : String(error) },
|
|
67
|
+
});
|
|
68
|
+
answers.delete(id);
|
|
69
|
+
throw error;
|
|
70
|
+
}
|
|
71
|
+
await transport.send({ jsonrpc: "2.0", id, result });
|
|
72
|
+
const answer = answers.get(id);
|
|
73
|
+
answers.delete(id);
|
|
74
|
+
return answer.result;
|
|
75
|
+
};
|
|
76
|
+
},
|
|
77
|
+
async close() {
|
|
78
|
+
if (closed)
|
|
79
|
+
return;
|
|
80
|
+
closed = true;
|
|
81
|
+
await ready;
|
|
82
|
+
await transport.close();
|
|
83
|
+
},
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=serve-in-process.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serve-in-process.js","sourceRoot":"","sources":["../../src/middleware/serve-in-process.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAE,oBAAoB,EAAuB,MAAM,uBAAuB,CAAC;AAqBlF;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,KAAsB;IACnD,iEAAiE;IACjE,MAAM,OAAO,GAAG,IAAI,GAAG,EAA0B,CAAC;IAClD,IAAI,MAAM,GAAG,KAAK,CAAC;IACnB,MAAM,KAAK,GAMP;QACF,KAAK,EAAE,KAAK,IAAI,EAAE,GAAE,CAAC;QACrB,KAAK,EAAE,KAAK,IAAI,EAAE,GAAE,CAAC;QACrB,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;YACtB,iCAAiC;YACjC,IAAI,OAAO,OAAO,CAAC,EAAE,KAAK,QAAQ;gBAAE,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAmB,CAAC,CAAC;QACrH,CAAC;KACF,CAAC;IACF,MAAM,SAAS,GAAG,oBAAoB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IACrD,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,EAAE,CAAC;IAChC,IAAI,MAAM,GAAG,CAAC,CAAC;IAEf,OAAO;QACL,IAAI,CAAsB,QAAgB,EAAE,OAAyB;YACnE,OAAO,KAAK,EAAE,IAA6B,EAAE,SAAkB,EAAc,EAAE;gBAC7E,IAAI,MAAM;oBAAE,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;gBAChF,MAAM,KAAK,CAAC;gBACZ,MAAM,EAAE,GAAG,EAAE,MAAM,CAAC;gBACpB,KAAK,CAAC,SAAS,EAAE,CAAC;oBAChB,OAAO,EAAE,KAAK;oBACd,EAAE;oBACF,MAAM,EAAE,YAAY;oBACpB,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,EAAE;iBAC5C,CAAC,CAAC;gBACH,IAAI,MAAuB,CAAC;gBAC5B,IAAI,CAAC;oBACH,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;gBAC1C,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,kEAAkE;oBAClE,8DAA8D;oBAC9D,MAAM,SAAS,CAAC,IAAI,CAAC;wBACnB,OAAO,EAAE,KAAK;wBACd,EAAE;wBACF,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;qBACzF,CAAC,CAAC;oBACH,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;oBACnB,MAAM,KAAK,CAAC;gBACd,CAAC;gBACD,MAAM,SAAS,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;gBACrD,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,EAAE,CAAkB,CAAC;gBAChD,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;gBACnB,OAAO,MAAM,CAAC,MAAM,CAAC;YACvB,CAAC,CAAC;QACJ,CAAC;QACD,KAAK,CAAC,KAAK;YACT,IAAI,MAAM;gBAAE,OAAO;YACnB,MAAM,GAAG,IAAI,CAAC;YACd,MAAM,KAAK,CAAC;YACZ,MAAM,SAAS,CAAC,KAAK,EAAE,CAAC;QAC1B,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -42,16 +42,27 @@ export interface WithKyaOsOptions {
|
|
|
42
42
|
* once. Passed through to the middleware (see `KyaOsConfig.requireAtomicNonce`).
|
|
43
43
|
*/
|
|
44
44
|
requireAtomicNonce?: boolean;
|
|
45
|
+
/**
|
|
46
|
+
* How long a wrapper's result may wait to be sent before its proof is
|
|
47
|
+
* given up (default five minutes, at most 2147483647). Passed through to
|
|
48
|
+
* the middleware (see `KyaOsConfig.pendingProofTtlMs`).
|
|
49
|
+
*/
|
|
50
|
+
pendingProofTtlMs?: number;
|
|
45
51
|
/**
|
|
46
52
|
* Response-proof profile for every proof this server mints (SPEC §7.3).
|
|
47
53
|
* Defaults to the body profile; the envelope profile also binds
|
|
48
|
-
* `structuredContent` and `
|
|
49
|
-
*
|
|
54
|
+
* `structuredContent`, `isError` and `resultType`. Under either profile the
|
|
55
|
+
* proofs are made by the transport this function wraps. Passed through to
|
|
56
|
+
* the middleware (see `KyaOsConfig.responseProofProfile`).
|
|
50
57
|
*/
|
|
51
58
|
responseProofProfile?: ResponseProofProfile;
|
|
52
59
|
/** Auto-create sessions for non-KYA-OS clients (default: true) */
|
|
53
60
|
autoSession?: boolean;
|
|
54
|
-
/**
|
|
61
|
+
/**
|
|
62
|
+
* Attach proofs to all tool responses (default: true). With `false` no
|
|
63
|
+
* transport is wrapped, so nothing is proven, and the wrappers refuse to
|
|
64
|
+
* run; leave a tool unproven with `excludeTools` instead.
|
|
65
|
+
*/
|
|
55
66
|
proofAllTools?: boolean;
|
|
56
67
|
/**
|
|
57
68
|
* Also emit the proof under the legacy bare `_meta.proof` key (default: true),
|
|
@@ -95,6 +106,12 @@ export declare function generateIdentity(crypto: CryptoProvider): Promise<KyaOsI
|
|
|
95
106
|
interface McpServerLike {
|
|
96
107
|
connect(transport: Transport): Promise<unknown>;
|
|
97
108
|
registerTool(...args: unknown[]): void;
|
|
109
|
+
/** McpServer reports whether a transport is already connected (SDK 1.10+). */
|
|
110
|
+
isConnected?(): boolean;
|
|
111
|
+
/** The underlying Server, whose `transport` is set once connected (SDK 1.3+). */
|
|
112
|
+
server?: {
|
|
113
|
+
transport?: unknown;
|
|
114
|
+
};
|
|
98
115
|
}
|
|
99
116
|
/**
|
|
100
117
|
* Add KYA-OS to a McpServer instance.
|
|
@@ -13,6 +13,7 @@
|
|
|
13
13
|
import { generateDidKeyFromBase64, didKeyFragment } from "../utils/did-helpers.js";
|
|
14
14
|
import { KYA_OS_ACTIONS, createKyaOsMiddleware, } from "./with-kya-os.js";
|
|
15
15
|
import { createKyaOsTransport } from "./kya-os-transport.js";
|
|
16
|
+
import { logger } from "../logging/index.js";
|
|
16
17
|
import { z } from "zod";
|
|
17
18
|
/**
|
|
18
19
|
* Generate a fresh Ed25519 identity for KYA-OS.
|
|
@@ -52,6 +53,17 @@ export async function generateIdentity(crypto) {
|
|
|
52
53
|
* @returns The KyaOsMiddleware instance for advanced usage (wrapWithDelegation, etc.)
|
|
53
54
|
*/
|
|
54
55
|
export async function withKyaOs(server, options) {
|
|
56
|
+
// withKyaOs() wraps transports by patching connect(), so it only reaches
|
|
57
|
+
// transports connected from now on. Said before anything is registered: if
|
|
58
|
+
// the server had no tools yet, the SDK refuses the _kyaos registration below
|
|
59
|
+
// with a generic error, and this explains it; if it had some, nothing else
|
|
60
|
+
// would, and the connected transport would serve tool results unproved.
|
|
61
|
+
const alreadyConnected = server.isConnected?.() ?? server.server?.transport !== undefined;
|
|
62
|
+
if (options.proofAllTools !== false && alreadyConnected) {
|
|
63
|
+
logger.warn("[kya-os] withKyaOs() ran after server.connect(): the transport that is already " +
|
|
64
|
+
"connected is not wrapped, so its tool results carry no KYA-OS proof and no " +
|
|
65
|
+
"transport audit record. Call withKyaOs() before server.connect().");
|
|
66
|
+
}
|
|
55
67
|
const identity = options.identity ?? (await generateIdentity(options.crypto));
|
|
56
68
|
const kyaos = createKyaOsMiddleware({
|
|
57
69
|
identity,
|
|
@@ -68,6 +80,9 @@ export async function withKyaOs(server, options) {
|
|
|
68
80
|
...(options.requireAtomicNonce !== undefined
|
|
69
81
|
? { requireAtomicNonce: options.requireAtomicNonce }
|
|
70
82
|
: {}),
|
|
83
|
+
...(options.pendingProofTtlMs !== undefined
|
|
84
|
+
? { pendingProofTtlMs: options.pendingProofTtlMs }
|
|
85
|
+
: {}),
|
|
71
86
|
...(options.responseProofProfile !== undefined
|
|
72
87
|
? { responseProofProfile: options.responseProofProfile }
|
|
73
88
|
: {}),
|
|
@@ -113,7 +128,7 @@ export async function withKyaOs(server, options) {
|
|
|
113
128
|
// Tool registration order does not matter — proofs are injected at the
|
|
114
129
|
// transport boundary, after McpServer has already dispatched the call.
|
|
115
130
|
if (options.proofAllTools !== false) {
|
|
116
|
-
const exclude =
|
|
131
|
+
const exclude = options.excludeTools ?? [];
|
|
117
132
|
const originalConnect = server.connect.bind(server);
|
|
118
133
|
server.connect = (transport) => originalConnect(createKyaOsTransport(transport, kyaos, exclude));
|
|
119
134
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"with-kya-os-server.js","sourceRoot":"","sources":["../../src/middleware/with-kya-os-server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAQH,OAAO,EAAE,wBAAwB,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACnF,OAAO,EACL,cAAc,EACd,qBAAqB,GAItB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,oBAAoB,EAAkB,MAAM,uBAAuB,CAAC;AAC7E,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"with-kya-os-server.js","sourceRoot":"","sources":["../../src/middleware/with-kya-os-server.ts"],"names":[],"mappings":"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"}
|
|
@@ -83,6 +83,16 @@ export interface KyaOsDelegationConfig {
|
|
|
83
83
|
* middleware logs a warning at startup; set it for production.
|
|
84
84
|
*/
|
|
85
85
|
trustedRootIssuers?: readonly string[];
|
|
86
|
+
/**
|
|
87
|
+
* Local cost limit: the most credentials this server will verify in one
|
|
88
|
+
* delegation chain, root to leaf inclusive, checked before any of them is
|
|
89
|
+
* verified. Each costs a signature check and possibly a DID resolution. It
|
|
90
|
+
* bounds the server's own work, not how far authority may be delegated.
|
|
91
|
+
* Unset verifies any length; a value that is not a positive integer is
|
|
92
|
+
* refused at startup. It does not bound `resolveDelegationChain` itself, so
|
|
93
|
+
* a resolver that fetches one parent at a time should apply its own limit.
|
|
94
|
+
*/
|
|
95
|
+
maxChainLength?: number;
|
|
86
96
|
/**
|
|
87
97
|
* Holder-of-key enforcement for inbound calls (spec §11.8). A valid delegation
|
|
88
98
|
* is a *bearer* credential; holder binding additionally requires the caller to
|
|
@@ -137,6 +147,20 @@ export interface KyaOsConfig {
|
|
|
137
147
|
* holder binding. Default false, with a startup warning for such a cache.
|
|
138
148
|
*/
|
|
139
149
|
requireAtomicNonce?: boolean;
|
|
150
|
+
/**
|
|
151
|
+
* How long, in milliseconds, a wrapper's result may wait to be sent before
|
|
152
|
+
* its proof is given up (default 300000, five minutes). Proofs are made
|
|
153
|
+
* where the KYA-OS transport sends a result, once: a result delivered later
|
|
154
|
+
* than this, or a second time (an MCP task result fetched again), goes out
|
|
155
|
+
* without a proof and with `proofError`, and the audit trail records
|
|
156
|
+
* `PROOF_EXPIRED`. A result never sent is closed with `PROOF_NOT_SENT` when
|
|
157
|
+
* the window ends. Raise it for task results fetched later; memory stays
|
|
158
|
+
* bounded by the count and size caps on waiting proofs. At most
|
|
159
|
+
* 2147483647 (2^31 - 1, about 24.8 days), the longest timer a JavaScript
|
|
160
|
+
* runtime keeps; a larger value, zero, or a value that is not a finite
|
|
161
|
+
* number is refused.
|
|
162
|
+
*/
|
|
163
|
+
pendingProofTtlMs?: number;
|
|
140
164
|
/**
|
|
141
165
|
* Durable store for approved authorization grants, enabling the no-paste
|
|
142
166
|
* retry: an agent that already obtained a grant can call again — even on a
|
|
@@ -188,6 +212,16 @@ export interface KyaOsConfig {
|
|
|
188
212
|
* outright rather than mis-verifying them. The default stays body-only so
|
|
189
213
|
* existing verifiers keep working; opt in once your client population
|
|
190
214
|
* verifies the envelope profile.
|
|
215
|
+
*
|
|
216
|
+
* Proofs under either profile are made by the KYA-OS transport when it
|
|
217
|
+
* sends a result, after the MCP SDK has finished it: the SDK changes a
|
|
218
|
+
* result after the handler returns (`resultType` on the 2026-07-28
|
|
219
|
+
* revision, a filled-in or appended `content`), and the proof covers what
|
|
220
|
+
* the client receives. `withKyaOs` wraps the transport it is connected
|
|
221
|
+
* through; wrap one yourself with `createKyaOsTransport`. Once a KYA-OS
|
|
222
|
+
* transport has been created for the middleware, every wrapper result must
|
|
223
|
+
* go out through one: while none is open, every wrapper and `proveOutcome`
|
|
224
|
+
* throws on entry.
|
|
191
225
|
*/
|
|
192
226
|
responseProofProfile?: ResponseProofProfile;
|
|
193
227
|
/** Delegation verification overrides */
|
|
@@ -29,6 +29,10 @@ export * from "./with-kya-os.types.js";
|
|
|
29
29
|
* - You need custom request handler patterns
|
|
30
30
|
* - You want per-tool control over proof/delegation wrapping
|
|
31
31
|
*
|
|
32
|
+
* Connect such a server through `createKyaOsTransport`: proofs are made where
|
|
33
|
+
* that transport sends a result, and the wrappers refuse to run while no
|
|
34
|
+
* KYA-OS transport is open.
|
|
35
|
+
*
|
|
32
36
|
* @param config - Agent identity and session configuration
|
|
33
37
|
* @param cryptoProvider - Platform-specific crypto implementation
|
|
34
38
|
* @returns Middleware components for session management and proof generation
|
|
@@ -7,13 +7,14 @@
|
|
|
7
7
|
* `./with-kya-os.ts`; verification plumbing lives in `./with-kya-os.delegation-verify.ts`.
|
|
8
8
|
*/
|
|
9
9
|
import type { KyaOsDelegationGate } from "./with-kya-os.types.js";
|
|
10
|
-
import type { MiddlewareDeps, AttachOutcomeProof } from "./with-kya-os.deps.js";
|
|
10
|
+
import type { MiddlewareDeps, AttachOutcomeProof, RequireProofLayer } from "./with-kya-os.deps.js";
|
|
11
11
|
import type { GrantResolution } from "./with-kya-os.grants.js";
|
|
12
12
|
import { type DelegationVerification } from "./with-kya-os.delegation-verify.js";
|
|
13
13
|
/** Collaborators the delegation gate borrows from its sibling sub-factories. */
|
|
14
14
|
export interface DelegationGateWiring {
|
|
15
15
|
delegationVerification: DelegationVerification;
|
|
16
16
|
attachOutcomeProof: AttachOutcomeProof;
|
|
17
|
+
requireProofLayer: RequireProofLayer;
|
|
17
18
|
resolveExistingGrant: GrantResolution["resolveExistingGrant"];
|
|
18
19
|
bindGrantOnSuccess: GrantResolution["bindGrantOnSuccess"];
|
|
19
20
|
}
|
|
@@ -6,12 +6,12 @@
|
|
|
6
6
|
* `_kyaos*` control namespace and runs the handler. Extracted from
|
|
7
7
|
* `./with-kya-os.ts`; verification plumbing lives in `./with-kya-os.delegation-verify.ts`.
|
|
8
8
|
*/
|
|
9
|
-
import { isHolderBindingApplicable,
|
|
9
|
+
import { isHolderBindingApplicable, assertHolderBinding, toHolderBindingRequest, } from "../delegation/holder-binding.js";
|
|
10
10
|
import { scopeSatisfies } from "../delegation/scope-matcher.js";
|
|
11
11
|
import { getDelegationScopes } from "../delegation/chain-enforcement.js";
|
|
12
12
|
import { logger } from "../logging/index.js";
|
|
13
13
|
import { KYA_OS_ERROR_CODES } from "../errors.js";
|
|
14
|
-
import { sanitizeForMessage } from "./with-kya-os.helpers.js";
|
|
14
|
+
import { sanitizeForMessage, withoutControlArgs } from "./with-kya-os.helpers.js";
|
|
15
15
|
import { canonicalizeJsonBytes } from "../utils/canonical-json.js";
|
|
16
16
|
const MAX_AUDIT_REFERENCE_LENGTH = 256;
|
|
17
17
|
/** Extract only a bounded string from an untrusted credential-shaped value. */
|
|
@@ -51,10 +51,11 @@ function forwardedApprovals(args) {
|
|
|
51
51
|
}
|
|
52
52
|
export function createDelegationGate(deps, wiring) {
|
|
53
53
|
const { identity, holderBindingMode, holderBindingVerifier, audit, cryptoProvider } = deps;
|
|
54
|
-
const { attachOutcomeProof, resolveExistingGrant, bindGrantOnSuccess } = wiring;
|
|
54
|
+
const { attachOutcomeProof, requireProofLayer, resolveExistingGrant, bindGrantOnSuccess } = wiring;
|
|
55
55
|
const { verifyDelegation, buildDelegationErrorResponse, buildNeedsAuthorizationChallenge, } = wiring.delegationVerification;
|
|
56
56
|
function wrapWithDelegation(toolName, config, handler) {
|
|
57
57
|
return async (args, sessionId) => {
|
|
58
|
+
requireProofLayer();
|
|
58
59
|
const delegationArg = args["_kyaos_delegation"];
|
|
59
60
|
if (delegationArg === undefined || delegationArg === null) {
|
|
60
61
|
// No delegation pasted — a durable grant may already authorize this call
|
|
@@ -65,11 +66,7 @@ export function createDelegationGate(deps, wiring) {
|
|
|
65
66
|
const resolvedGrant = await resolveExistingGrant(toolName, args, sessionId, config.scopeId);
|
|
66
67
|
if (resolvedGrant) {
|
|
67
68
|
const existingGrant = resolvedGrant.grant;
|
|
68
|
-
const grantArgs =
|
|
69
|
-
for (const [k, v] of Object.entries(args)) {
|
|
70
|
-
if (!isKyaOsControlArg(k))
|
|
71
|
-
grantArgs[k] = v;
|
|
72
|
-
}
|
|
69
|
+
const grantArgs = withoutControlArgs(args);
|
|
73
70
|
logger.debug(`[kya-os] Grant resolved for "${toolName}" (scope "${config.scopeId}") — no re-paste required`);
|
|
74
71
|
const grantContext = {
|
|
75
72
|
scopeId: config.scopeId,
|
|
@@ -104,11 +101,12 @@ export function createDelegationGate(deps, wiring) {
|
|
|
104
101
|
}
|
|
105
102
|
// No delegation provided — sign & return the needs_authorization
|
|
106
103
|
// challenge. The proof binds a responseHash over the EMITTED challenge
|
|
107
|
-
//
|
|
108
|
-
//
|
|
109
|
-
// URL. Best-effort: attachOutcomeProof
|
|
110
|
-
|
|
111
|
-
|
|
104
|
+
// (incl. the authorizationUrl; the envelope under the envelope profile),
|
|
105
|
+
// so a verifier that recomputes it over what it received detects a
|
|
106
|
+
// tampered/MITM-swapped consent URL. Best-effort: attachOutcomeProof
|
|
107
|
+
// no-ops if no session resolves.
|
|
108
|
+
const { challenge, message } = await buildNeedsAuthorizationChallenge(toolName, config);
|
|
109
|
+
return attachOutcomeProof(challenge, toolName, args, sessionId, message, "needs_authorization");
|
|
112
110
|
}
|
|
113
111
|
// Authenticate the presented delegation (object embedded-proof OR VC-JWT
|
|
114
112
|
// string) and normalize it to a verified credential. verifyDelegation owns
|
|
@@ -231,11 +229,7 @@ export function createDelegationGate(deps, wiring) {
|
|
|
231
229
|
// Strip the reserved _kyaos* control namespace before passing to the
|
|
232
230
|
// handler — same predicate the bound request hash uses, so the handler
|
|
233
231
|
// receives exactly the call the subject signed (no smuggled control arg).
|
|
234
|
-
const cleanArgs =
|
|
235
|
-
for (const [k, v] of Object.entries(args)) {
|
|
236
|
-
if (!isKyaOsControlArg(k))
|
|
237
|
-
cleanArgs[k] = v;
|
|
238
|
-
}
|
|
232
|
+
const cleanArgs = withoutControlArgs(args);
|
|
239
233
|
// Mint a durable grant from this verified delegation so the next call —
|
|
240
234
|
// on any instance — resolves via resolveExistingGrant with no re-paste.
|
|
241
235
|
await bindGrantOnSuccess(vc, delegationArg, isJwt, sessionId, config.scopeId, check.expiresAt);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"with-kya-os.delegation-gate.js","sourceRoot":"","sources":["../../src/middleware/with-kya-os.delegation-gate.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EACL,yBAAyB,EACzB,
|
|
1
|
+
{"version":3,"file":"with-kya-os.delegation-gate.js","sourceRoot":"","sources":["../../src/middleware/with-kya-os.delegation-gate.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,17 +6,14 @@
|
|
|
6
6
|
* adapter (chain-enforcement.ts) once per middleware instance. Extracted from
|
|
7
7
|
* `wrapWithDelegation` so the gate module holds only the request flow.
|
|
8
8
|
*/
|
|
9
|
-
import { type DelegationCredential
|
|
10
|
-
import type { KyaOsToolHandler } from "./with-kya-os.types.js";
|
|
9
|
+
import { type DelegationCredential } from "../types/protocol.js";
|
|
10
|
+
import type { KyaOsChallengeFormatter, KyaOsToolHandler, KyaOsToolResult } from "./with-kya-os.types.js";
|
|
11
11
|
import type { MiddlewareDeps } from "./with-kya-os.deps.js";
|
|
12
12
|
/** Per-tool delegation-gate config shared by the gate + its challenge builder. */
|
|
13
13
|
export interface DelegationGateConfig {
|
|
14
14
|
scopeId: string;
|
|
15
15
|
consentUrl: string;
|
|
16
|
-
formatChallenge?:
|
|
17
|
-
type: "text";
|
|
18
|
-
text: string;
|
|
19
|
-
}>;
|
|
16
|
+
formatChallenge?: KyaOsChallengeFormatter;
|
|
20
17
|
}
|
|
21
18
|
/**
|
|
22
19
|
* Outcome of authenticating a presented delegation. On success the caller gets
|
|
@@ -50,14 +47,12 @@ export interface DelegationVerification {
|
|
|
50
47
|
/**
|
|
51
48
|
* Build the signed-later `needs_authorization` challenge for a call that
|
|
52
49
|
* arrived without a delegation or resolvable grant: a fresh resume token, a
|
|
53
|
-
* 5-minute expiry, and the
|
|
54
|
-
* which falls back to the default JSON challenge if it throws
|
|
50
|
+
* 5-minute expiry, and the result to emit (respecting `config.formatChallenge`,
|
|
51
|
+
* which falls back to the default JSON challenge if it throws or returns
|
|
52
|
+
* neither content nor a challenge result).
|
|
55
53
|
*/
|
|
56
54
|
buildNeedsAuthorizationChallenge(toolName: string, config: DelegationGateConfig): Promise<{
|
|
57
|
-
|
|
58
|
-
type: "text";
|
|
59
|
-
text: string;
|
|
60
|
-
}>;
|
|
55
|
+
challenge: KyaOsToolResult;
|
|
61
56
|
message: string;
|
|
62
57
|
}>;
|
|
63
58
|
}
|
|
@@ -19,6 +19,28 @@ import { createNeedsAuthorizationError, readCredentialProofValue, } from "../typ
|
|
|
19
19
|
import { logger } from "../logging/index.js";
|
|
20
20
|
import { TtlCache } from "../utils/ttl-cache.js";
|
|
21
21
|
import { sanitizeForMessage } from "./with-kya-os.helpers.js";
|
|
22
|
+
import { withoutOutcomeMeta } from "./with-kya-os.session.js";
|
|
23
|
+
const isRecord = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
|
|
24
|
+
/**
|
|
25
|
+
* The challenge result a `formatChallenge` hook returned, in either form: its
|
|
26
|
+
* content alone (an array), or content with `structuredContent`, `isError` and
|
|
27
|
+
* `_meta`. All of it is set before the challenge is signed. The `_meta`
|
|
28
|
+
* members only the middleware may set are dropped, never trusted. Undefined
|
|
29
|
+
* for a value of neither form.
|
|
30
|
+
*/
|
|
31
|
+
function toChallengeResult(formatted) {
|
|
32
|
+
if (Array.isArray(formatted))
|
|
33
|
+
return { content: formatted };
|
|
34
|
+
if (!isRecord(formatted) || !Array.isArray(formatted.content))
|
|
35
|
+
return undefined;
|
|
36
|
+
const { content, structuredContent, isError, _meta } = formatted;
|
|
37
|
+
return withoutOutcomeMeta({
|
|
38
|
+
content,
|
|
39
|
+
...(isRecord(structuredContent) ? { structuredContent } : {}),
|
|
40
|
+
...(typeof isError === "boolean" ? { isError } : {}),
|
|
41
|
+
...(isRecord(_meta) ? { _meta } : {}),
|
|
42
|
+
});
|
|
43
|
+
}
|
|
22
44
|
export function createDelegationVerification(deps) {
|
|
23
45
|
const { identity, cryptoProvider, delegationConfig } = deps;
|
|
24
46
|
const didKeyResolver = createDidKeyResolver();
|
|
@@ -116,6 +138,12 @@ export function createDelegationVerification(deps) {
|
|
|
116
138
|
logger.warn("[kya-os] delegation.trustedRootIssuers is not set, so a delegation from any issuer is " +
|
|
117
139
|
"accepted, including one an agent signs for itself. Set it to the DIDs allowed to grant authority.");
|
|
118
140
|
}
|
|
141
|
+
// Refused at startup: a bad value would otherwise boot cleanly and then deny
|
|
142
|
+
// every delegated call, echoing the config detail back to the caller.
|
|
143
|
+
const maxChainLength = delegationConfig?.maxChainLength;
|
|
144
|
+
if (maxChainLength !== undefined && (!Number.isInteger(maxChainLength) || maxChainLength < 1)) {
|
|
145
|
+
throw new RangeError(`[kya-os] delegation.maxChainLength must be a positive integer (got ${String(maxChainLength)})`);
|
|
146
|
+
}
|
|
119
147
|
// Root credentials whose claimed issuerDid is not their signer are accepted
|
|
120
148
|
// for compatibility but reported: each distinct message at most once an hour,
|
|
121
149
|
// with the oldest evicted first so the set stays bounded.
|
|
@@ -136,6 +164,7 @@ export function createDelegationVerification(deps) {
|
|
|
136
164
|
statusListConfigured: !!delegationConfig?.statusListResolver,
|
|
137
165
|
revocationChecker: delegationConfig?.revocationChecker,
|
|
138
166
|
...(trustedRootIssuers !== undefined ? { trustedRootIssuers } : {}),
|
|
167
|
+
...(maxChainLength !== undefined ? { maxChainLength } : {}),
|
|
139
168
|
}, options);
|
|
140
169
|
if (result.valid)
|
|
141
170
|
reportChainWarnings(result.warnings);
|
|
@@ -240,25 +269,31 @@ export function createDelegationVerification(deps) {
|
|
|
240
269
|
scopes: [config.scopeId],
|
|
241
270
|
});
|
|
242
271
|
// config.formatChallenge lets a server render the challenge (e.g. a markdown
|
|
243
|
-
// link for LLM clients
|
|
244
|
-
//
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
272
|
+
// link for LLM clients, or an error result with structuredContent) BEFORE
|
|
273
|
+
// it is signed, so the proof binds exactly what the client receives. A
|
|
274
|
+
// throwing hook, or one returning neither form, gets the default challenge.
|
|
275
|
+
const defaultChallenge = () => ({
|
|
276
|
+
content: [{ type: "text", text: JSON.stringify(authError) }],
|
|
277
|
+
});
|
|
278
|
+
let challenge = defaultChallenge();
|
|
249
279
|
if (config.formatChallenge) {
|
|
250
280
|
try {
|
|
251
|
-
|
|
281
|
+
const formatted = toChallengeResult(config.formatChallenge(authError));
|
|
282
|
+
if (formatted) {
|
|
283
|
+
challenge = formatted;
|
|
284
|
+
}
|
|
285
|
+
else {
|
|
286
|
+
logger.error("[kya-os] formatChallenge returned neither content nor a challenge result; using the default challenge", { tool: toolName });
|
|
287
|
+
}
|
|
252
288
|
}
|
|
253
289
|
catch (error) {
|
|
254
290
|
logger.error("[kya-os] formatChallenge threw; using the default challenge", {
|
|
255
291
|
tool: toolName,
|
|
256
292
|
error: error instanceof Error ? error.message : String(error),
|
|
257
293
|
});
|
|
258
|
-
challengeContent = defaultChallengeContent;
|
|
259
294
|
}
|
|
260
295
|
}
|
|
261
|
-
return {
|
|
296
|
+
return { challenge, message: authError.message };
|
|
262
297
|
}
|
|
263
298
|
return {
|
|
264
299
|
verifyDelegation,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"with-kya-os.delegation-verify.js","sourceRoot":"","sources":["../../src/middleware/with-kya-os.delegation-verify.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,mCAAmC,CAAC;AACzE,OAAO,EAAE,oBAAoB,EAAE,MAAM,mCAAmC,CAAC;AACzE,OAAO,EACL,wBAAwB,GACzB,MAAM,wCAAwC,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EACL,4BAA4B,GAG7B,MAAM,8BAA8B,CAAC;AACtC,OAAO,EACL,uBAAuB,IAAI,2BAA2B,GAEvD,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AACrE,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACtE,OAAO,EAAE,sBAAsB,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAC3E,OAAO,EACL,6BAA6B,EAC7B,wBAAwB,
|
|
1
|
+
{"version":3,"file":"with-kya-os.delegation-verify.js","sourceRoot":"","sources":["../../src/middleware/with-kya-os.delegation-verify.ts"],"names":[],"mappings":"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"}
|