@kya-os/mcp 1.18.0 → 1.21.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 +377 -0
- package/CONFORMANCE.md +10 -4
- package/README.md +58 -1
- package/SPEC.md +37 -3
- package/dist/card/cimd.js +6 -2
- package/dist/card/cimd.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 +21 -10
- package/dist/card/revocation.js +12 -16
- 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/bitstring.d.ts +41 -6
- package/dist/delegation/bitstring.js +36 -21
- package/dist/delegation/bitstring.js.map +1 -1
- package/dist/delegation/index.d.ts +1 -0
- package/dist/delegation/index.js +1 -0
- package/dist/delegation/index.js.map +1 -1
- package/dist/delegation/statuslist-manager.d.ts +20 -4
- package/dist/delegation/statuslist-manager.js +16 -0
- package/dist/delegation/statuslist-manager.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 +2 -1
- package/dist/index.js +2 -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 +14 -3
- package/dist/middleware/with-kya-os-server.js +4 -1
- package/dist/middleware/with-kya-os-server.js.map +1 -1
- package/dist/middleware/with-kya-os.config-types.d.ts +24 -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 +37 -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/dist/utils/statuslist-bits.d.ts +15 -0
- package/dist/utils/statuslist-bits.js +44 -6
- package/dist/utils/statuslist-bits.js.map +1 -1
- package/dist/utils/statuslist-gzip.d.ts +18 -0
- package/dist/utils/statuslist-gzip.js +45 -0
- package/dist/utils/statuslist-gzip.js.map +1 -0
- package/package.json +3 -1
|
@@ -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),
|
|
@@ -80,6 +80,9 @@ export async function withKyaOs(server, options) {
|
|
|
80
80
|
...(options.requireAtomicNonce !== undefined
|
|
81
81
|
? { requireAtomicNonce: options.requireAtomicNonce }
|
|
82
82
|
: {}),
|
|
83
|
+
...(options.pendingProofTtlMs !== undefined
|
|
84
|
+
? { pendingProofTtlMs: options.pendingProofTtlMs }
|
|
85
|
+
: {}),
|
|
83
86
|
...(options.responseProofProfile !== undefined
|
|
84
87
|
? { responseProofProfile: options.responseProofProfile }
|
|
85
88
|
: {}),
|
|
@@ -125,7 +128,7 @@ export async function withKyaOs(server, options) {
|
|
|
125
128
|
// Tool registration order does not matter — proofs are injected at the
|
|
126
129
|
// transport boundary, after McpServer has already dispatched the call.
|
|
127
130
|
if (options.proofAllTools !== false) {
|
|
128
|
-
const exclude =
|
|
131
|
+
const exclude = options.excludeTools ?? [];
|
|
129
132
|
const originalConnect = server.connect.bind(server);
|
|
130
133
|
server.connect = (transport) => originalConnect(createKyaOsTransport(transport, kyaos, exclude));
|
|
131
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,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,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":"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,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AA6ExB;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,MAAsB;IAEtB,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,eAAe,EAAE,CAAC;IAC/C,MAAM,GAAG,GAAG,wBAAwB,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IACxD,OAAO;QACL,GAAG;QACH,GAAG,EAAE,GAAG,GAAG,IAAI,cAAc,CAAC,GAAG,CAAC,EAAE;QACpC,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,SAAS,EAAE,OAAO,CAAC,SAAS;KAC7B,CAAC;AACJ,CAAC;AAeD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,MAAqB,EACrB,OAAyB;IAEzB,yEAAyE;IACzE,2EAA2E;IAC3E,6EAA6E;IAC7E,2EAA2E;IAC3E,wEAAwE;IACxE,MAAM,gBAAgB,GACpB,MAAM,CAAC,WAAW,EAAE,EAAE,IAAI,MAAM,CAAC,MAAM,EAAE,SAAS,KAAK,SAAS,CAAC;IACnE,IAAI,OAAO,CAAC,aAAa,KAAK,KAAK,IAAI,gBAAgB,EAAE,CAAC;QACxD,MAAM,CAAC,IAAI,CACT,iFAAiF;YAC/E,6EAA6E;YAC7E,mEAAmE,CACtE,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GACZ,OAAO,CAAC,QAAQ,IAAI,CAAC,MAAM,gBAAgB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;IAE/D,MAAM,KAAK,GAAG,qBAAqB,CACjC;QACE,QAAQ;QACR,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,WAAW,EAAE,OAAO,CAAC,WAAW,IAAI,IAAI;QACxC,GAAG,CAAC,OAAO,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAChE,GAAG,CAAC,OAAO,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACzE,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACjE,GAAG,CAAC,OAAO,CAAC,kBAAkB,KAAK,SAAS;YAC1C,CAAC,CAAC,EAAE,kBAAkB,EAAE,OAAO,CAAC,kBAAkB,EAAE;YACpD,CAAC,CAAC,EAAE,CAAC;QACP,GAAG,CAAC,OAAO,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/E,GAAG,CAAC,OAAO,CAAC,kBAAkB,KAAK,SAAS;YAC1C,CAAC,CAAC,EAAE,kBAAkB,EAAE,OAAO,CAAC,kBAAkB,EAAE;YACpD,CAAC,CAAC,EAAE,CAAC;QACP,GAAG,CAAC,OAAO,CAAC,iBAAiB,KAAK,SAAS;YACzC,CAAC,CAAC,EAAE,iBAAiB,EAAE,OAAO,CAAC,iBAAiB,EAAE;YAClD,CAAC,CAAC,EAAE,CAAC;QACP,GAAG,CAAC,OAAO,CAAC,oBAAoB,KAAK,SAAS;YAC5C,CAAC,CAAC,EAAE,oBAAoB,EAAE,OAAO,CAAC,oBAAoB,EAAE;YACxD,CAAC,CAAC,EAAE,CAAC;KACR,EACD,OAAO,CAAC,MAAM,CACf,CAAC;IAEF,IAAI,CAAC,OAAO,CAAC,iBAAiB,IAAI,MAAM,CAAC,KAAK,MAAM,EAAE,CAAC;QACrD,4DAA4D;QAC5D,MAAM,CAAC,YAAY,CACjB,QAAQ,EACR;YACE,WAAW,EACT,iFAAiF;YACnF,WAAW,EAAE,EAAE,KAAK,EAAE,iBAAiB,EAAE,YAAY,EAAE,IAAI,EAAE;YAC7D,WAAW,EAAE;gBACX,MAAM,EAAE,CAAC;qBACN,IAAI,CAAC,cAAc,CAAC;qBACpB,QAAQ,CAAC,+BAA+B,CAAC;gBAC5C,KAAK,EAAE,CAAC;qBACL,MAAM,EAAE;qBACR,QAAQ,EAAE;qBACV,QAAQ,CAAC,2CAA2C,CAAC;gBACxD,QAAQ,EAAE,CAAC;qBACR,MAAM,EAAE;qBACR,QAAQ,EAAE;qBACV,QAAQ,CAAC,+BAA+B,CAAC;gBAC5C,SAAS,EAAE,CAAC;qBACT,MAAM,EAAE;qBACR,QAAQ,EAAE;qBACV,QAAQ,CAAC,gCAAgC,CAAC;gBAC7C,QAAQ,EAAE,CAAC;qBACR,MAAM,EAAE;qBACR,QAAQ,EAAE;qBACV,QAAQ,CAAC,wCAAwC,CAAC;aACtD;SACF,EACD,KAAK,EAAE,IAAa,EAAE,EAAE;YACtB,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,WAAW,CACpC,IAA+B,CAChC,CAAC;YACF,OAAO;gBACL,GAAG,MAAM;gBACT,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,CAAC,CAAC;aACtE,CAAC;QACJ,CAAC,CACF,CAAC;IACJ,CAAC;IAED,mEAAmE;IACnE,EAAE;IACF,yEAAyE;IACzE,oEAAoE;IACpE,uEAAuE;IACvE,uEAAuE;IACvE,IAAI,OAAO,CAAC,aAAa,KAAK,KAAK,EAAE,CAAC;QACpC,MAAM,OAAO,GAAG,OAAO,CAAC,YAAY,IAAI,EAAE,CAAC;QAC3C,MAAM,eAAe,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAEpD,MAAM,CAAC,OAAO,GAAG,CAAC,SAAoB,EAAE,EAAE,CACxC,eAAe,CAAC,oBAAoB,CAAC,SAAS,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC;IACrE,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -147,6 +147,20 @@ export interface KyaOsConfig {
|
|
|
147
147
|
* holder binding. Default false, with a startup warning for such a cache.
|
|
148
148
|
*/
|
|
149
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;
|
|
150
164
|
/**
|
|
151
165
|
* Durable store for approved authorization grants, enabling the no-paste
|
|
152
166
|
* retry: an agent that already obtained a grant can call again — even on a
|
|
@@ -198,6 +212,16 @@ export interface KyaOsConfig {
|
|
|
198
212
|
* outright rather than mis-verifying them. The default stays body-only so
|
|
199
213
|
* existing verifiers keep working; opt in once your client population
|
|
200
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.
|
|
201
225
|
*/
|
|
202
226
|
responseProofProfile?: ResponseProofProfile;
|
|
203
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();
|
|
@@ -247,25 +269,31 @@ export function createDelegationVerification(deps) {
|
|
|
247
269
|
scopes: [config.scopeId],
|
|
248
270
|
});
|
|
249
271
|
// config.formatChallenge lets a server render the challenge (e.g. a markdown
|
|
250
|
-
// link for LLM clients
|
|
251
|
-
//
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
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();
|
|
256
279
|
if (config.formatChallenge) {
|
|
257
280
|
try {
|
|
258
|
-
|
|
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
|
+
}
|
|
259
288
|
}
|
|
260
289
|
catch (error) {
|
|
261
290
|
logger.error("[kya-os] formatChallenge threw; using the default challenge", {
|
|
262
291
|
tool: toolName,
|
|
263
292
|
error: error instanceof Error ? error.message : String(error),
|
|
264
293
|
});
|
|
265
|
-
challengeContent = defaultChallengeContent;
|
|
266
294
|
}
|
|
267
295
|
}
|
|
268
|
-
return {
|
|
296
|
+
return { challenge, message: authError.message };
|
|
269
297
|
}
|
|
270
298
|
return {
|
|
271
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":"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,GAEzB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAOjD,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAS9D,MAAM,QAAQ,GAAG,CAAC,KAAc,EAAoC,EAAE,CACpE,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAEvE;;;;;;GAMG;AACH,SAAS,iBAAiB,CAAC,SAAkB;IAC3C,IAAI,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC;QAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC;IAC5D,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC;QAAE,OAAO,SAAS,CAAC;IAChF,MAAM,EAAE,OAAO,EAAE,iBAAiB,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,SAAS,CAAC;IACjE,OAAO,kBAAkB,CAAC;QACxB,OAAO;QACP,GAAG,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,EAAE,iBAAiB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7D,GAAG,CAAC,OAAO,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACpD,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACtC,CAAC,CAAC;AACL,CAAC;AA4CD,MAAM,UAAU,4BAA4B,CAC1C,IAAoB;IAEpB,MAAM,EAAE,QAAQ,EAAE,cAAc,EAAE,gBAAgB,EAAE,GAAG,IAAI,CAAC;IAE5D,MAAM,cAAc,GAAG,oBAAoB,EAAE,CAAC;IAC9C,MAAM,aAAa,GACjB,gBAAgB,EAAE,aAAa;QAC/B,CAAC,OAAO,UAAU,CAAC,KAAK,KAAK,UAAU;YACrC,CAAC,CAAC,IAAI,oBAAoB,EAAE;YAC5B,CAAC,CAAC,SAAS,CAAC,CAAC;IACjB,MAAM,cAAc,GAAG,aAAa;QAClC,CAAC,CAAC,oBAAoB,CAAC,aAAa,CAAC;QACrC,CAAC,CAAC,SAAS,CAAC;IACd,MAAM,sBAAsB,GAAG,wBAAwB,CACrD,gBAAgB,EAAE,YAAY,EAC9B,aAAa,CACd,CAAC;IACF,MAAM,WAAW,GAAgB;QAC/B,KAAK,CAAC,OAAO,CAAC,GAAW;YACvB,MAAM,cAAc,GAAG,gBAAgB,EAAE,WAAW,CAAC;YACrD,IAAI,cAAc,EAAE,CAAC;gBACnB,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;gBACnD,IAAI,QAAQ,EAAE,CAAC;oBACb,OAAO,QAAQ,CAAC;gBAClB,CAAC;YACH,CAAC;YAED,MAAM,MAAM,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;YACjC,MAAM,kBAAkB,GAAG,MAAM,CAAC,CAAC,CAAC,sBAAsB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YAC/E,IAAI,kBAAkB,EAAE,CAAC;gBACvB,IAAI,CAAC;oBACH,MAAM,QAAQ,GAAG,MAAM,kBAAkB,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;oBACvD,IAAI,QAAQ,EAAE,CAAC;wBACb,OAAO,QAAQ,CAAC;oBAClB,CAAC;gBACH,CAAC;gBAAC,MAAM,CAAC;oBACP,OAAO,IAAI,CAAC;gBACd,CAAC;YACH,CAAC;YAED,IAAI,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;gBAC/B,OAAO,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YACrC,CAAC;YAED,IAAI,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;gBAC/B,OAAO,cAAc,EAAE,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC;YAC9C,CAAC;YAED,OAAO,IAAI,CAAC;QACd,CAAC;KACF,CAAC;IAEF,MAAM,iBAAiB,GAAkC,KAAK,EAC5D,EAAwB,EACxB,YAAqB,EACyB,EAAE;QAChD,MAAM,KAAK,GAAG,EAAE,CAAC,KAAK,CAAC;QACvB,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,CAAC;QACnD,CAAC;QAED,MAAM,UAAU,GAAG,wBAAwB,CAAC,KAAgC,CAAC,CAAC;QAC9E,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,6BAA6B,EAAE,CAAC;QACjE,CAAC;QAED,yEAAyE;QACzE,MAAM,QAAQ,GAAG,EAA6B,CAAC;QAC/C,MAAM,cAAc,GAA4B,EAAE,CAAC;QACnD,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC9C,IAAI,CAAC,KAAK,OAAO;gBAAE,cAAc,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QAC3C,CAAC;QACD,MAAM,SAAS,GAAG,gBAAgB,CAAC,cAAc,CAAC,CAAC;QACnD,MAAM,IAAI,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAEjD,8CAA8C;QAC9C,MAAM,QAAQ,GAAG,sBAAsB,CAAC,UAAU,CAAC,CAAC;QAEpD,iEAAiE;QACjE,MAAM,GAAG,GAAG,YAA8B,CAAC;QAC3C,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;YACX,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,4BAA4B,EAAE,CAAC;QAChE,CAAC;QAED,mEAAmE;QACnE,MAAM,WAAW,GAAG,sBAAsB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAClD,MAAM,YAAY,GAAG,aAAa,CAAC,WAAW,CAAC,CAAC;QAEhD,MAAM,KAAK,GAAG,MAAM,cAAc,CAAC,MAAM,CAAC,IAAI,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAC;QACxE,OAAO;YACL,KAAK;YACL,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,+BAA+B;SAC5D,CAAC;IACJ,CAAC,CAAC;IAEF,MAAM,QAAQ,GAAG,IAAI,4BAA4B,CAAC;QAChD,WAAW;QACX,iBAAiB;QACjB,kBAAkB,EAAE,gBAAgB,EAAE,kBAAkB;QACxD,QAAQ,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,KAAK;QACpD,YAAY,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,UAAU;KAC9D,CAAC,CAAC;IAEH,MAAM,4BAA4B,GAAG,CACnC,KAAa,EACb,MAAc,EACyB,EAAE,CAAC,CAAC;QAC3C,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,MAAe;gBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,kBAAkB,CAAC,MAAM,CAAC,EAAE,CAAC;aACpE;SACF;QACD,OAAO,EAAE,IAAI;KACd,CAAC,CAAC;IAEH,MAAM,kBAAkB,GAAG,gBAAgB,EAAE,kBAAkB,CAAC;IAChE,IAAI,kBAAkB,KAAK,SAAS,EAAE,CAAC;QACrC,MAAM,CAAC,IAAI,CACT,wFAAwF;YACtF,mGAAmG,CACtG,CAAC;IACJ,CAAC;IAED,6EAA6E;IAC7E,sEAAsE;IACtE,MAAM,cAAc,GAAG,gBAAgB,EAAE,cAAc,CAAC;IACxD,IAAI,cAAc,KAAK,SAAS,IAAI,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,cAAc,GAAG,CAAC,CAAC,EAAE,CAAC;QAC9F,MAAM,IAAI,UAAU,CAClB,sEAAsE,MAAM,CAAC,cAAc,CAAC,GAAG,CAChG,CAAC;IACJ,CAAC;IAED,4EAA4E;IAC5E,8EAA8E;IAC9E,0DAA0D;IAC1D,MAAM,qBAAqB,GAAG,IAAI,QAAQ,CAAO,EAAE,KAAK,EAAE,EAAE,GAAG,EAAE,GAAG,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,CAAC;IAC7F,MAAM,mBAAmB,GAAG,CAAC,QAAuC,EAAQ,EAAE;QAC5E,KAAK,MAAM,OAAO,IAAI,QAAQ,IAAI,EAAE,EAAE,CAAC;YACrC,IAAI,qBAAqB,CAAC,GAAG,CAAC,OAAO,CAAC;gBAAE,SAAS;YACjD,qBAAqB,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YACzC,MAAM,CAAC,IAAI,CAAC,YAAY,kBAAkB,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACzD,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,uBAAuB,GAAG,KAAK,EACnC,cAAoC,EACpC,OAAqC,EACL,EAAE;QAClC,MAAM,MAAM,GAAG,MAAM,2BAA2B,CAC9C,cAAc,EACd;YACE,SAAS,EAAE,QAAQ,CAAC,GAAG;YACvB,QAAQ;YACR,sBAAsB,EAAE,gBAAgB,EAAE,sBAAsB;YAChE,oBAAoB,EAAE,CAAC,CAAC,gBAAgB,EAAE,kBAAkB;YAC5D,iBAAiB,EAAE,gBAAgB,EAAE,iBAAiB;YACtD,GAAG,CAAC,kBAAkB,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,kBAAkB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACnE,GAAG,CAAC,cAAc,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC5D,EACD,OAAO,CACR,CAAC;QACF,IAAI,MAAM,CAAC,KAAK;YAAE,mBAAmB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACvD,OAAO,MAAM,CAAC;IAChB,CAAC,CAAC;IAEF,KAAK,UAAU,gBAAgB,CAC7B,aAAsB;QAEtB,6EAA6E;QAC7E,8EAA8E;QAC9E,8EAA8E;QAC9E,IAAI,EAAwB,CAAC;QAC7B,IAAI,KAAK,GAAG,KAAK,CAAC;QAClB,IAAI,YAAgC,CAAC;QAErC,IAAI,OAAO,aAAa,KAAK,QAAQ,EAAE,CAAC;YACtC,MAAM,MAAM,GAAG,UAAU,CAAC,aAAa,CAAC,CAAC;YACzC,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC;gBAClC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,uBAAuB,EAAE,CAAC;YAC3D,CAAC;YACD,0EAA0E;YAC1E,2EAA2E;YAC3E,2EAA2E;YAC3E,4DAA4D;YAC5D,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,mBAAmB,CAAC,aAAa,EAAE;gBACjE,UAAU,EAAE,IAAI;aACjB,CAAC,CAAC;YACH,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;gBACpB,OAAO;oBACL,KAAK,EAAE,KAAK;oBACZ,MAAM,EAAE,QAAQ,CAAC,MAAM,IAAI,wCAAwC;oBACnE,EAAE,EAAE,MAAM,CAAC,OAAO,CAAC,EAA0B;iBAC9C,CAAC;YACJ,CAAC;YACD,wEAAwE;YACxE,sEAAsE;YACtE,YAAY,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;YACxF,EAAE,GAAG,MAAM,CAAC,OAAO,CAAC,EAA0B,CAAC;YAC/C,yEAAyE;YACzE,wEAAwE;YACxE,iEAAiE;YACjE,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC;gBACd,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,GAAG,EAAE,aAAa,EAAE,EAAE,CAAC;YACtE,CAAC;YACD,KAAK,GAAG,IAAI,CAAC;QACf,CAAC;aAAM,CAAC;YACN,EAAE,GAAG,aAAqC,CAAC;QAC7C,CAAC;QAED,0EAA0E;QAC1E,8EAA8E;QAC9E,yEAAyE;QACzE,0EAA0E;QAC1E,2EAA2E;QAC3E,4EAA4E;QAC5E,IAAI,KAA4B,CAAC;QACjC,IAAI,CAAC;YACH,KAAK,GAAG,MAAM,uBAAuB,CAAC,EAAE,EAAE,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC,CAAC;QACtE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,KAAK,CAAC,gDAAgD,EAAE;gBAC7D,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;gBAC7D,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS;aACxD,CAAC,CAAC;YACH,KAAK,GAAG;gBACN,KAAK,EAAE,KAAK;gBACZ,MAAM,EAAE,6CAA6C;aACtD,CAAC;QACJ,CAAC;QAED,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;YACjB,OAAO;gBACL,KAAK,EAAE,KAAK;gBACZ,MAAM,EAAE,KAAK,CAAC,MAAM,IAAI,qCAAqC;gBAC7D,EAAE;aACH,CAAC;QACJ,CAAC;QACD,MAAM,SAAS,GAAG,YAAY,KAAK,SAAS;YAC1C,CAAC,CAAC,KAAK,CAAC,SAAS;YACjB,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,KAAK,CAAC,SAAS,IAAI,YAAY,CAAC,CAAC;QAC5D,OAAO;YACL,KAAK,EAAE,IAAI;YACX,EAAE;YACF,KAAK;YACL,GAAG,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAClD,CAAC;IACJ,CAAC;IAED,KAAK,UAAU,gCAAgC,CAC7C,QAAgB,EAChB,MAA4B;QAK5B,MAAM,UAAU,GAAG,MAAM,cAAc,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;QACxD,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC;aAC/B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;aAC3C,IAAI,CAAC,EAAE,CAAC,CAAC;QACZ,MAAM,WAAW,GAAG;YAClB,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;YACf,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;YAChB,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC;YACjB,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC;YACjB,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;SACd,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACZ,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,CAAC;QAEtD,MAAM,SAAS,GAAG,6BAA6B,CAAC;YAC9C,OAAO,EAAE,SAAS,QAAQ,qCAAqC,MAAM,CAAC,OAAO,EAAE;YAC/E,gBAAgB,EAAE,MAAM,CAAC,UAAU;YACnC,WAAW;YACX,SAAS;YACT,MAAM,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC;SACzB,CAAC,CAAC;QAEH,6EAA6E;QAC7E,0EAA0E;QAC1E,uEAAuE;QACvE,4EAA4E;QAC5E,MAAM,gBAAgB,GAAG,GAAoB,EAAE,CAAC,CAAC;YAC/C,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE,CAAC;SAC7D,CAAC,CAAC;QACH,IAAI,SAAS,GAAG,gBAAgB,EAAE,CAAC;QACnC,IAAI,MAAM,CAAC,eAAe,EAAE,CAAC;YAC3B,IAAI,CAAC;gBACH,MAAM,SAAS,GAAG,iBAAiB,CAAC,MAAM,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC,CAAC;gBACvE,IAAI,SAAS,EAAE,CAAC;oBACd,SAAS,GAAG,SAAS,CAAC;gBACxB,CAAC;qBAAM,CAAC;oBACN,MAAM,CAAC,KAAK,CACV,uGAAuG,EACvG,EAAE,IAAI,EAAE,QAAQ,EAAE,CACnB,CAAC;gBACJ,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,CAAC,KAAK,CAAC,6DAA6D,EAAE;oBAC1E,IAAI,EAAE,QAAQ;oBACd,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;iBAC9D,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QACD,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,CAAC,OAAO,EAAE,CAAC;IACnD,CAAC;IAED,OAAO;QACL,gBAAgB;QAChB,4BAA4B;QAC5B,gCAAgC;KACjC,CAAC;AACJ,CAAC"}
|
|
@@ -13,14 +13,25 @@ import type { ProofGenerator, ProofAgentIdentity } from "../proof/generator.js";
|
|
|
13
13
|
import type { ProofVerifier } from "../proof/verifier.js";
|
|
14
14
|
import type { ResponseProofProfile } from "../types/protocol.js";
|
|
15
15
|
import type { McpAuditEventAdapter } from "../audit/adapters/mcp.js";
|
|
16
|
-
import type { KyaOsConfig, KyaOsDelegationConfig,
|
|
16
|
+
import type { KyaOsAuthorizationOutcome, KyaOsConfig, KyaOsDelegationConfig, KyaOsToolResult } from "./with-kya-os.types.js";
|
|
17
17
|
/**
|
|
18
18
|
* Attach a signed proof recording an authorization OUTCOME (denied / step-up /
|
|
19
19
|
* needs-authorization) to a response. Provided by the session/proof sub-factory
|
|
20
|
-
* and consumed by the delegation- and policy-gate sub-factories
|
|
21
|
-
* here as the shared internal contract between
|
|
20
|
+
* and consumed by the delegation- and policy-gate sub-factories and the public
|
|
21
|
+
* `proveOutcome`, so it is typed here as the shared internal contract between
|
|
22
|
+
* them. A `needs_authorization` proof binds the response (its content under
|
|
23
|
+
* the body profile, its envelope under the envelope profile); denial and
|
|
24
|
+
* step-up proofs bind none (SPEC §7.4).
|
|
22
25
|
*/
|
|
23
|
-
export type AttachOutcomeProof = (response:
|
|
26
|
+
export type AttachOutcomeProof = (response: KyaOsToolResult, toolName: string, args: Record<string, unknown>, sessionId: string | undefined, reason: string, outcome?: KyaOsAuthorizationOutcome, paramsOverride?: Record<string, unknown>) => Promise<KyaOsToolResult>;
|
|
27
|
+
/**
|
|
28
|
+
* Refuse, by throwing, a wrapped call whose proof could not be made. A proof
|
|
29
|
+
* is made where the result is sent, so every wrapper calls this on entry,
|
|
30
|
+
* before it records or runs anything, and it throws while no KYA-OS
|
|
31
|
+
* transport is open for the middleware. Provided by the session/proof
|
|
32
|
+
* sub-factory.
|
|
33
|
+
*/
|
|
34
|
+
export type RequireProofLayer = () => void;
|
|
24
35
|
/** The constructed dependencies shared across the middleware sub-factories. */
|
|
25
36
|
export interface MiddlewareDeps {
|
|
26
37
|
/** Proof-generation identity (DID + key material). */
|
|
@@ -5,6 +5,11 @@
|
|
|
5
5
|
* of `./with-kya-os.ts` so the factory module stays focused on wiring. No shared
|
|
6
6
|
* mutable state, no I/O — safe to unit test in isolation.
|
|
7
7
|
*/
|
|
8
|
+
/**
|
|
9
|
+
* `args` without the reserved `_kyaos*` control arguments: the call as its
|
|
10
|
+
* handler sees it, and as a gate's request hash binds it.
|
|
11
|
+
*/
|
|
12
|
+
export declare function withoutControlArgs(args: Record<string, unknown>): Record<string, unknown>;
|
|
8
13
|
/**
|
|
9
14
|
* Strip control characters and cap length on caller-derived values before they
|
|
10
15
|
* are interpolated into client-facing reasons or log lines. A hostile
|
|
@@ -6,6 +6,19 @@
|
|
|
6
6
|
* mutable state, no I/O — safe to unit test in isolation.
|
|
7
7
|
*/
|
|
8
8
|
import { getDelegationScopes } from "../delegation/chain-enforcement.js";
|
|
9
|
+
import { isKyaOsControlArg } from "../proof/covered-request.js";
|
|
10
|
+
/**
|
|
11
|
+
* `args` without the reserved `_kyaos*` control arguments: the call as its
|
|
12
|
+
* handler sees it, and as a gate's request hash binds it.
|
|
13
|
+
*/
|
|
14
|
+
export function withoutControlArgs(args) {
|
|
15
|
+
const clean = {};
|
|
16
|
+
for (const [key, value] of Object.entries(args)) {
|
|
17
|
+
if (!isKyaOsControlArg(key))
|
|
18
|
+
clean[key] = value;
|
|
19
|
+
}
|
|
20
|
+
return clean;
|
|
21
|
+
}
|
|
9
22
|
/**
|
|
10
23
|
* Strip control characters and cap length on caller-derived values before they
|
|
11
24
|
* are interpolated into client-facing reasons or log lines. A hostile
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"with-kya-os.helpers.js","sourceRoot":"","sources":["../../src/middleware/with-kya-os.helpers.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;
|
|
1
|
+
{"version":3,"file":"with-kya-os.helpers.js","sourceRoot":"","sources":["../../src/middleware/with-kya-os.helpers.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AACzE,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAEhE;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAChC,IAA6B;IAE7B,MAAM,KAAK,GAA4B,EAAE,CAAC;IAC1C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QAChD,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC;YAAE,KAAK,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;IAClD,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,kBAAkB,CAAC,KAAc,EAAE,MAAM,GAAG,GAAG;IAC7D,MAAM,CAAC,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC5D,6EAA6E;IAC7E,2EAA2E;IAC3E,wEAAwE;IACxE,IAAI,GAAG,GAAG,EAAE,CAAC;IACb,KAAK,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC;QACnB,MAAM,IAAI,GAAG,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACpC,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;IACxE,CAAC;IACD,OAAO,GAAG,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC;AACrE,CAAC;AAED,6EAA6E;AAC7E,MAAM,UAAU,sBAAsB,CAAC,GAAY;IAKjD,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QACpC,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,eAAe,EAAE,EAAE,EAAE,CAAC;IACtD,CAAC;IACD,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,GAA2B,CAAC;QACvC,MAAM,OAAO,GAAG,EAAE,CAAC,iBAGlB,CAAC;QACF,MAAM,QAAQ,GAAG,OAAO,EAAE,UAAU,EAAE,UAAU,IAAI,OAAO,EAAE,EAAE,IAAI,SAAS,CAAC;QAC7E,MAAM,gBAAgB,GAAG,OAAO,EAAE,UAAU,EAAE,UAAU,CAAC;QACzD,IAAI,eAAe,GAAa,EAAE,CAAC;QACnC,IAAI,CAAC;YACH,eAAe,GAAG,mBAAmB,CAAC,EAAE,CAAC,CAAC;QAC5C,CAAC;QAAC,MAAM,CAAC;YACP,eAAe,GAAG,EAAE,CAAC;QACvB,CAAC;QACD,OAAO;YACL,QAAQ;YACR,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,gBAAgB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACjD,eAAe;SAChB,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,eAAe,EAAE,EAAE,EAAE,CAAC;IACtD,CAAC;AACH,CAAC"}
|