@kya-os/mcp-i-core 1.3.13 → 1.3.15

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.
Files changed (255) hide show
  1. package/dist/config/remote-config.js +9 -12
  2. package/dist/runtime/base.d.ts +2 -1
  3. package/dist/runtime/base.js +34 -6
  4. package/dist/services/access-control.service.js +5 -0
  5. package/dist/services/tool-protection.service.js +17 -8
  6. package/package.json +2 -2
  7. package/.turbo/turbo-build.log +0 -4
  8. package/.turbo/turbo-test$colon$coverage.log +0 -4586
  9. package/.turbo/turbo-test.log +0 -4631
  10. package/COMPLIANCE_IMPROVEMENT_REPORT.md +0 -483
  11. package/Composer 3.md +0 -615
  12. package/GPT-5.md +0 -1169
  13. package/OPUS-plan.md +0 -352
  14. package/PHASE_3_AND_4.1_SUMMARY.md +0 -585
  15. package/PHASE_3_SUMMARY.md +0 -317
  16. package/PHASE_4.1.3_SUMMARY.md +0 -428
  17. package/PHASE_4.1_COMPLETE.md +0 -525
  18. package/PHASE_4_USER_DID_IDENTITY_LINKING_PLAN.md +0 -1240
  19. package/SCHEMA_COMPLIANCE_REPORT.md +0 -275
  20. package/TEST_PLAN.md +0 -571
  21. package/coverage/coverage-final.json +0 -60
  22. package/dist/cache/oauth-config-cache.d.ts.map +0 -1
  23. package/dist/cache/oauth-config-cache.js.map +0 -1
  24. package/dist/cache/tool-protection-cache.d.ts.map +0 -1
  25. package/dist/cache/tool-protection-cache.js.map +0 -1
  26. package/dist/compliance/index.d.ts.map +0 -1
  27. package/dist/compliance/index.js.map +0 -1
  28. package/dist/compliance/schema-registry.d.ts.map +0 -1
  29. package/dist/compliance/schema-registry.js.map +0 -1
  30. package/dist/compliance/schema-verifier.d.ts.map +0 -1
  31. package/dist/compliance/schema-verifier.js.map +0 -1
  32. package/dist/config/remote-config.d.ts.map +0 -1
  33. package/dist/config/remote-config.js.map +0 -1
  34. package/dist/config.d.ts.map +0 -1
  35. package/dist/config.js.map +0 -1
  36. package/dist/delegation/audience-validator.d.ts.map +0 -1
  37. package/dist/delegation/audience-validator.js.map +0 -1
  38. package/dist/delegation/bitstring.d.ts.map +0 -1
  39. package/dist/delegation/bitstring.js.map +0 -1
  40. package/dist/delegation/cascading-revocation.d.ts.map +0 -1
  41. package/dist/delegation/cascading-revocation.js.map +0 -1
  42. package/dist/delegation/delegation-graph.d.ts.map +0 -1
  43. package/dist/delegation/delegation-graph.js.map +0 -1
  44. package/dist/delegation/did-key-resolver.d.ts.map +0 -1
  45. package/dist/delegation/did-key-resolver.js.map +0 -1
  46. package/dist/delegation/index.d.ts.map +0 -1
  47. package/dist/delegation/index.js.map +0 -1
  48. package/dist/delegation/statuslist-manager.d.ts.map +0 -1
  49. package/dist/delegation/statuslist-manager.js.map +0 -1
  50. package/dist/delegation/storage/index.d.ts.map +0 -1
  51. package/dist/delegation/storage/index.js.map +0 -1
  52. package/dist/delegation/storage/memory-graph-storage.d.ts.map +0 -1
  53. package/dist/delegation/storage/memory-graph-storage.js.map +0 -1
  54. package/dist/delegation/storage/memory-statuslist-storage.d.ts.map +0 -1
  55. package/dist/delegation/storage/memory-statuslist-storage.js.map +0 -1
  56. package/dist/delegation/utils.d.ts.map +0 -1
  57. package/dist/delegation/utils.js.map +0 -1
  58. package/dist/delegation/vc-issuer.d.ts.map +0 -1
  59. package/dist/delegation/vc-issuer.js.map +0 -1
  60. package/dist/delegation/vc-verifier.d.ts.map +0 -1
  61. package/dist/delegation/vc-verifier.js.map +0 -1
  62. package/dist/identity/idp-token-resolver.d.ts.map +0 -1
  63. package/dist/identity/idp-token-resolver.js.map +0 -1
  64. package/dist/identity/idp-token-storage.interface.d.ts.map +0 -1
  65. package/dist/identity/idp-token-storage.interface.js.map +0 -1
  66. package/dist/identity/user-did-manager.d.ts.map +0 -1
  67. package/dist/identity/user-did-manager.js.map +0 -1
  68. package/dist/index.d.ts.map +0 -1
  69. package/dist/index.js.map +0 -1
  70. package/dist/providers/base.d.ts.map +0 -1
  71. package/dist/providers/base.js.map +0 -1
  72. package/dist/providers/memory.d.ts.map +0 -1
  73. package/dist/providers/memory.js.map +0 -1
  74. package/dist/runtime/audit-logger.d.ts.map +0 -1
  75. package/dist/runtime/audit-logger.js.map +0 -1
  76. package/dist/runtime/base.d.ts.map +0 -1
  77. package/dist/runtime/base.js.map +0 -1
  78. package/dist/services/access-control.service.d.ts.map +0 -1
  79. package/dist/services/access-control.service.js.map +0 -1
  80. package/dist/services/authorization/authorization-registry.d.ts.map +0 -1
  81. package/dist/services/authorization/authorization-registry.js.map +0 -1
  82. package/dist/services/authorization/types.d.ts.map +0 -1
  83. package/dist/services/authorization/types.js.map +0 -1
  84. package/dist/services/batch-delegation.service.d.ts.map +0 -1
  85. package/dist/services/batch-delegation.service.js.map +0 -1
  86. package/dist/services/crypto.service.d.ts.map +0 -1
  87. package/dist/services/crypto.service.js.map +0 -1
  88. package/dist/services/errors.d.ts.map +0 -1
  89. package/dist/services/errors.js.map +0 -1
  90. package/dist/services/index.d.ts.map +0 -1
  91. package/dist/services/index.js.map +0 -1
  92. package/dist/services/oauth-config.service.d.ts.map +0 -1
  93. package/dist/services/oauth-config.service.js.map +0 -1
  94. package/dist/services/oauth-provider-registry.d.ts.map +0 -1
  95. package/dist/services/oauth-provider-registry.js.map +0 -1
  96. package/dist/services/oauth-service.d.ts.map +0 -1
  97. package/dist/services/oauth-service.js.map +0 -1
  98. package/dist/services/oauth-token-retrieval.service.d.ts.map +0 -1
  99. package/dist/services/oauth-token-retrieval.service.js.map +0 -1
  100. package/dist/services/proof-verifier.d.ts.map +0 -1
  101. package/dist/services/proof-verifier.js.map +0 -1
  102. package/dist/services/provider-resolver.d.ts.map +0 -1
  103. package/dist/services/provider-resolver.js.map +0 -1
  104. package/dist/services/provider-validator.d.ts.map +0 -1
  105. package/dist/services/provider-validator.js.map +0 -1
  106. package/dist/services/session-registration.service.d.ts.map +0 -1
  107. package/dist/services/session-registration.service.js.map +0 -1
  108. package/dist/services/storage.service.d.ts.map +0 -1
  109. package/dist/services/storage.service.js.map +0 -1
  110. package/dist/services/tool-context-builder.d.ts.map +0 -1
  111. package/dist/services/tool-context-builder.js.map +0 -1
  112. package/dist/services/tool-protection.service.d.ts.map +0 -1
  113. package/dist/services/tool-protection.service.js.map +0 -1
  114. package/dist/types/oauth-required-error.d.ts.map +0 -1
  115. package/dist/types/oauth-required-error.js.map +0 -1
  116. package/dist/types/tool-protection.d.ts.map +0 -1
  117. package/dist/types/tool-protection.js.map +0 -1
  118. package/dist/utils/base58.d.ts.map +0 -1
  119. package/dist/utils/base58.js.map +0 -1
  120. package/dist/utils/base64.d.ts.map +0 -1
  121. package/dist/utils/base64.js.map +0 -1
  122. package/dist/utils/cors.d.ts.map +0 -1
  123. package/dist/utils/cors.js.map +0 -1
  124. package/dist/utils/did-helpers.d.ts.map +0 -1
  125. package/dist/utils/did-helpers.js.map +0 -1
  126. package/dist/utils/index.d.ts.map +0 -1
  127. package/dist/utils/index.js.map +0 -1
  128. package/dist/utils/storage-keys.d.ts.map +0 -1
  129. package/dist/utils/storage-keys.js.map +0 -1
  130. package/docs/API_REFERENCE.md +0 -1362
  131. package/docs/COMPLIANCE_MATRIX.md +0 -691
  132. package/docs/STATUSLIST2021_GUIDE.md +0 -696
  133. package/docs/W3C_VC_DELEGATION_GUIDE.md +0 -710
  134. package/src/__tests__/cache/tool-protection-cache.test.ts +0 -640
  135. package/src/__tests__/config/provider-runtime-config.test.ts +0 -309
  136. package/src/__tests__/delegation-e2e.test.ts +0 -690
  137. package/src/__tests__/identity/user-did-manager.test.ts +0 -232
  138. package/src/__tests__/index.test.ts +0 -56
  139. package/src/__tests__/integration/full-flow.test.ts +0 -789
  140. package/src/__tests__/integration.test.ts +0 -281
  141. package/src/__tests__/providers/base.test.ts +0 -173
  142. package/src/__tests__/providers/memory.test.ts +0 -319
  143. package/src/__tests__/regression/phase2-regression.test.ts +0 -429
  144. package/src/__tests__/runtime/audit-logger.test.ts +0 -154
  145. package/src/__tests__/runtime/base-extensions.test.ts +0 -595
  146. package/src/__tests__/runtime/base.test.ts +0 -869
  147. package/src/__tests__/runtime/delegation-flow.test.ts +0 -164
  148. package/src/__tests__/runtime/proof-client-did.test.ts +0 -376
  149. package/src/__tests__/runtime/route-interception.test.ts +0 -686
  150. package/src/__tests__/runtime/tool-protection-enforcement.test.ts +0 -908
  151. package/src/__tests__/services/agentshield-integration.test.ts +0 -791
  152. package/src/__tests__/services/cache-busting.test.ts +0 -125
  153. package/src/__tests__/services/oauth-service-pkce.test.ts +0 -556
  154. package/src/__tests__/services/provider-resolver-edge-cases.test.ts +0 -591
  155. package/src/__tests__/services/tool-protection-merged-config.test.ts +0 -485
  156. package/src/__tests__/services/tool-protection-oauth-provider.test.ts +0 -480
  157. package/src/__tests__/services/tool-protection.service.test.ts +0 -1373
  158. package/src/__tests__/utils/mock-providers.ts +0 -340
  159. package/src/cache/oauth-config-cache.d.ts +0 -69
  160. package/src/cache/oauth-config-cache.d.ts.map +0 -1
  161. package/src/cache/oauth-config-cache.js.map +0 -1
  162. package/src/cache/oauth-config-cache.ts +0 -123
  163. package/src/cache/tool-protection-cache.ts +0 -171
  164. package/src/compliance/EXAMPLE.md +0 -412
  165. package/src/compliance/__tests__/schema-verifier.test.ts +0 -797
  166. package/src/compliance/index.ts +0 -8
  167. package/src/compliance/schema-registry.ts +0 -460
  168. package/src/compliance/schema-verifier.ts +0 -708
  169. package/src/config/__tests__/merged-config.spec.ts +0 -445
  170. package/src/config/__tests__/remote-config.spec.ts +0 -268
  171. package/src/config/remote-config.ts +0 -264
  172. package/src/config.ts +0 -312
  173. package/src/delegation/__tests__/audience-validator.test.ts +0 -112
  174. package/src/delegation/__tests__/bitstring.test.ts +0 -346
  175. package/src/delegation/__tests__/cascading-revocation.test.ts +0 -628
  176. package/src/delegation/__tests__/delegation-graph.test.ts +0 -584
  177. package/src/delegation/__tests__/did-key-resolver.test.ts +0 -265
  178. package/src/delegation/__tests__/utils.test.ts +0 -152
  179. package/src/delegation/__tests__/vc-issuer.test.ts +0 -442
  180. package/src/delegation/__tests__/vc-verifier.test.ts +0 -922
  181. package/src/delegation/audience-validator.ts +0 -52
  182. package/src/delegation/bitstring.ts +0 -278
  183. package/src/delegation/cascading-revocation.ts +0 -370
  184. package/src/delegation/delegation-graph.ts +0 -299
  185. package/src/delegation/did-key-resolver.ts +0 -179
  186. package/src/delegation/index.ts +0 -14
  187. package/src/delegation/statuslist-manager.ts +0 -353
  188. package/src/delegation/storage/__tests__/memory-graph-storage.test.ts +0 -366
  189. package/src/delegation/storage/__tests__/memory-statuslist-storage.test.ts +0 -228
  190. package/src/delegation/storage/index.ts +0 -9
  191. package/src/delegation/storage/memory-graph-storage.ts +0 -178
  192. package/src/delegation/storage/memory-statuslist-storage.ts +0 -77
  193. package/src/delegation/utils.ts +0 -221
  194. package/src/delegation/vc-issuer.ts +0 -232
  195. package/src/delegation/vc-verifier.ts +0 -568
  196. package/src/identity/idp-token-resolver.ts +0 -181
  197. package/src/identity/idp-token-storage.interface.ts +0 -94
  198. package/src/identity/user-did-manager.ts +0 -526
  199. package/src/index.ts +0 -310
  200. package/src/providers/base.d.ts +0 -91
  201. package/src/providers/base.d.ts.map +0 -1
  202. package/src/providers/base.js.map +0 -1
  203. package/src/providers/base.ts +0 -96
  204. package/src/providers/memory.ts +0 -142
  205. package/src/runtime/audit-logger.ts +0 -39
  206. package/src/runtime/base.ts +0 -1392
  207. package/src/services/__tests__/access-control.integration.test.ts +0 -443
  208. package/src/services/__tests__/access-control.proof-response-validation.test.ts +0 -578
  209. package/src/services/__tests__/access-control.service.test.ts +0 -970
  210. package/src/services/__tests__/batch-delegation.service.test.ts +0 -351
  211. package/src/services/__tests__/crypto.service.test.ts +0 -531
  212. package/src/services/__tests__/oauth-provider-registry.test.ts +0 -142
  213. package/src/services/__tests__/proof-verifier.integration.test.ts +0 -485
  214. package/src/services/__tests__/proof-verifier.test.ts +0 -489
  215. package/src/services/__tests__/provider-resolution.integration.test.ts +0 -202
  216. package/src/services/__tests__/provider-resolver.test.ts +0 -213
  217. package/src/services/__tests__/storage.service.test.ts +0 -358
  218. package/src/services/access-control.service.ts +0 -990
  219. package/src/services/authorization/authorization-registry.ts +0 -66
  220. package/src/services/authorization/types.ts +0 -71
  221. package/src/services/batch-delegation.service.ts +0 -137
  222. package/src/services/crypto.service.ts +0 -302
  223. package/src/services/errors.ts +0 -76
  224. package/src/services/index.ts +0 -18
  225. package/src/services/oauth-config.service.d.ts +0 -53
  226. package/src/services/oauth-config.service.d.ts.map +0 -1
  227. package/src/services/oauth-config.service.js.map +0 -1
  228. package/src/services/oauth-config.service.ts +0 -192
  229. package/src/services/oauth-provider-registry.d.ts +0 -57
  230. package/src/services/oauth-provider-registry.d.ts.map +0 -1
  231. package/src/services/oauth-provider-registry.js.map +0 -1
  232. package/src/services/oauth-provider-registry.ts +0 -141
  233. package/src/services/oauth-service.ts +0 -544
  234. package/src/services/oauth-token-retrieval.service.ts +0 -245
  235. package/src/services/proof-verifier.ts +0 -478
  236. package/src/services/provider-resolver.d.ts +0 -48
  237. package/src/services/provider-resolver.d.ts.map +0 -1
  238. package/src/services/provider-resolver.js.map +0 -1
  239. package/src/services/provider-resolver.ts +0 -146
  240. package/src/services/provider-validator.ts +0 -170
  241. package/src/services/session-registration.service.ts +0 -251
  242. package/src/services/storage.service.ts +0 -566
  243. package/src/services/tool-context-builder.ts +0 -237
  244. package/src/services/tool-protection.service.ts +0 -1070
  245. package/src/types/oauth-required-error.ts +0 -63
  246. package/src/types/tool-protection.ts +0 -155
  247. package/src/utils/__tests__/did-helpers.test.ts +0 -156
  248. package/src/utils/base58.ts +0 -109
  249. package/src/utils/base64.ts +0 -148
  250. package/src/utils/cors.ts +0 -83
  251. package/src/utils/did-helpers.ts +0 -210
  252. package/src/utils/index.ts +0 -8
  253. package/src/utils/storage-keys.ts +0 -278
  254. package/tsconfig.json +0 -21
  255. package/vitest.config.ts +0 -56
@@ -1,443 +0,0 @@
1
- /**
2
- * Integration Tests for AccessControlApiService and ProofVerifier
3
- *
4
- * End-to-end integration tests covering:
5
- * - Delegation verification flow with AccessControlApiService
6
- * - Proof submission flow with AccessControlApiService
7
- * - Proof verification with ProofVerifier
8
- * - Runtime integration with service injection
9
- */
10
-
11
- import { describe, it, expect, beforeEach, vi } from "vitest";
12
- import { AccessControlApiService } from "../access-control.service.js";
13
- import { ProofVerifier } from "../proof-verifier.js";
14
- import { MCPIRuntimeBase } from "../../runtime/base.js";
15
- import {
16
- createMockProviders,
17
- MockFetchProvider,
18
- } from "../../__tests__/utils/mock-providers.js";
19
- import type { ProviderRuntimeConfig } from "../../config.js";
20
- import type { DetachedProof } from "@kya-os/contracts/proof";
21
- import type {
22
- VerifyDelegationRequest,
23
- ProofSubmissionRequest,
24
- ProofSubmissionResponse,
25
- } from "@kya-os/contracts/agentshield-api";
26
- import { AgentShieldAPIError } from "@kya-os/contracts/agentshield-api";
27
-
28
- describe("AccessControlApiService Integration", () => {
29
- let accessControlService: AccessControlApiService;
30
- let proofVerifier: ProofVerifier;
31
- let runtime: MCPIRuntimeBase;
32
- let mockFetchProvider: MockFetchProvider;
33
- let mockProviders: ReturnType<typeof createMockProviders>;
34
-
35
- beforeEach(() => {
36
- mockProviders = createMockProviders();
37
- mockFetchProvider = mockProviders.fetchProvider as MockFetchProvider;
38
-
39
- // Reset fetch mock before each test
40
- vi.clearAllMocks();
41
- mockFetchProvider.fetch.mockClear();
42
-
43
- accessControlService = new AccessControlApiService({
44
- baseUrl: "https://api.example.com",
45
- apiKey: "test-api-key",
46
- fetchProvider: mockFetchProvider,
47
- logger: vi.fn(),
48
- });
49
-
50
- proofVerifier = new ProofVerifier({
51
- cryptoProvider: mockProviders.cryptoProvider,
52
- clockProvider: mockProviders.clockProvider,
53
- nonceCacheProvider: mockProviders.nonceCacheProvider,
54
- fetchProvider: mockFetchProvider,
55
- timestampSkewSeconds: 120,
56
- });
57
-
58
- const config: ProviderRuntimeConfig = {
59
- ...mockProviders,
60
- environment: "development",
61
- session: {
62
- timestampSkewSeconds: 120,
63
- ttlMinutes: 30,
64
- },
65
- };
66
-
67
- runtime = new MCPIRuntimeBase(config);
68
- (runtime as any).proofVerifier = proofVerifier;
69
- (runtime as any).accessControlService = accessControlService;
70
- });
71
-
72
- describe("Delegation Verification Flow", () => {
73
- it("should verify delegation end-to-end", async () => {
74
- const request: VerifyDelegationRequest = {
75
- agent_did: "did:key:z123",
76
- scopes: ["scope1", "scope2"],
77
- };
78
-
79
- const mockResponse = {
80
- success: true,
81
- data: {
82
- valid: true,
83
- delegation_id: "123e4567-e89b-12d3-a456-426614174000", // Valid UUID format
84
- credential: {
85
- agent_did: "did:key:z123",
86
- scopes: ["scope1", "scope2"],
87
- issued_at: Math.floor(Date.now() / 1000), // Unix timestamp (positive integer)
88
- created_at: Math.floor(Date.now() / 1000), // Unix timestamp (positive integer)
89
- },
90
- },
91
- metadata: {
92
- requestId: "test-request-id",
93
- timestamp: new Date().toISOString(),
94
- },
95
- };
96
-
97
- mockFetchProvider.fetch.mockResolvedValue(
98
- new Response(JSON.stringify(mockResponse), {
99
- status: 200,
100
- headers: { "Content-Type": "application/json" },
101
- })
102
- );
103
-
104
- const result = await accessControlService.verifyDelegation(request);
105
-
106
- expect(result.data.valid).toBe(true);
107
- expect(result.data.delegation_id).toBe(
108
- "123e4567-e89b-12d3-a456-426614174000"
109
- );
110
- expect(result.data.credential?.scopes).toEqual(["scope1", "scope2"]);
111
- });
112
-
113
- it("should handle delegation verification failure", async () => {
114
- const request: VerifyDelegationRequest = {
115
- agent_did: "did:key:z123",
116
- scopes: ["scope1"],
117
- };
118
-
119
- const mockResponse = {
120
- success: true,
121
- data: {
122
- valid: false,
123
- reason: "No delegation found for agent",
124
- },
125
- metadata: {
126
- requestId: "test-request-id",
127
- timestamp: new Date().toISOString(),
128
- },
129
- };
130
-
131
- mockFetchProvider.fetch.mockResolvedValue(
132
- new Response(JSON.stringify(mockResponse), {
133
- status: 200,
134
- headers: { "Content-Type": "application/json" },
135
- })
136
- );
137
-
138
- const result = await accessControlService.verifyDelegation(request);
139
-
140
- expect(result.data.valid).toBe(false);
141
- expect(result.data.reason).toBe("No delegation found for agent");
142
- });
143
- });
144
-
145
- describe("Proof Submission Flow", () => {
146
- it("should submit proof end-to-end", async () => {
147
- const proof: DetachedProof = {
148
- jws: "header.payload.signature",
149
- meta: {
150
- did: "did:key:z123",
151
- kid: "did:key:z123#key-1",
152
- ts: Math.floor(Date.now() / 1000), // Unix timestamp in seconds
153
- nonce: "nonce-123",
154
- audience: "mcp-client",
155
- sessionId: "session-123",
156
- requestHash: "sha256:" + "a".repeat(64),
157
- responseHash: "sha256:" + "b".repeat(64),
158
- },
159
- };
160
-
161
- const request = {
162
- session_id: "550e8400-e29b-41d4-a716-446655440000", // Valid UUID
163
- delegation_id: "123e4567-e89b-12d3-a456-426614174000", // Valid UUID format
164
- proofs: [proof],
165
- context: {
166
- toolCalls: [
167
- {
168
- tool: "testTool",
169
- args: { param: "value" },
170
- scopeId: "testTool:execute",
171
- },
172
- ],
173
- },
174
- } as ProofSubmissionRequest;
175
-
176
- const mockResponse = {
177
- success: true,
178
- accepted: 1,
179
- rejected: 0,
180
- outcomes: {
181
- success: 1,
182
- failed: 0,
183
- blocked: 0,
184
- error: 0,
185
- },
186
- };
187
-
188
- mockFetchProvider.fetch.mockResolvedValue(
189
- new Response(JSON.stringify(mockResponse), {
190
- status: 200,
191
- headers: { "Content-Type": "application/json" },
192
- })
193
- );
194
-
195
- const result = await accessControlService.submitProofs(request);
196
-
197
- // Type assertion needed due to TypeScript type resolution issues with outdated node_modules types
198
- // The actual runtime type has accepted/rejected/outcomes, but node_modules has old types
199
- const typedResult = result as unknown as {
200
- success: boolean;
201
- accepted: number;
202
- rejected: number;
203
- outcomes: Record<string, number>;
204
- errors?: Array<{
205
- proof_index: number;
206
- error: { code: string; message: string };
207
- }>;
208
- };
209
- expect(typedResult.accepted).toBe(1);
210
- expect(typedResult.rejected).toBe(0);
211
- expect(typedResult.outcomes.success).toBe(1);
212
- });
213
-
214
- it("should handle proof submission with errors", async () => {
215
- const proof: DetachedProof = {
216
- jws: "invalid.jws.signature",
217
- meta: {
218
- did: "did:key:z123",
219
- kid: "did:key:z123#key-1",
220
- ts: Math.floor(Date.now() / 1000), // Unix timestamp in seconds
221
- nonce: "nonce-123",
222
- audience: "mcp-client",
223
- sessionId: "session-123",
224
- requestHash: "sha256:" + "a".repeat(64),
225
- responseHash: "sha256:" + "b".repeat(64),
226
- },
227
- };
228
-
229
- const request: ProofSubmissionRequest = {
230
- session_id: "550e8400-e29b-41d4-a716-446655440000", // Valid UUID
231
- delegation_id: null, // Explicitly set to null for optional field
232
- proofs: [proof],
233
- };
234
-
235
- const mockResponse = {
236
- success: true,
237
- accepted: 0,
238
- rejected: 1,
239
- outcomes: {
240
- success: 0,
241
- failed: 1,
242
- blocked: 0,
243
- error: 0,
244
- },
245
- errors: [
246
- {
247
- proof_index: 0,
248
- error: {
249
- code: "invalid_signature",
250
- message: "Invalid JWS signature",
251
- },
252
- },
253
- ],
254
- };
255
-
256
- mockFetchProvider.fetch.mockResolvedValue(
257
- new Response(JSON.stringify(mockResponse), {
258
- status: 200,
259
- headers: { "Content-Type": "application/json" },
260
- })
261
- );
262
-
263
- const result = await accessControlService.submitProofs(request);
264
-
265
- // Type assertion needed due to TypeScript type resolution issues with outdated node_modules types
266
- // The actual runtime type has accepted/rejected/outcomes, but node_modules has old types
267
- const typedResult = result as unknown as {
268
- success: boolean;
269
- accepted: number;
270
- rejected: number;
271
- outcomes: Record<string, number>;
272
- errors?: Array<{
273
- proof_index: number;
274
- error: { code: string; message: string };
275
- }>;
276
- };
277
- expect(typedResult.accepted).toBe(0);
278
- expect(typedResult.rejected).toBe(1);
279
- expect(typedResult.errors).toBeDefined();
280
- expect(typedResult.errors?.length).toBe(1);
281
- });
282
- });
283
-
284
- describe("Proof Verification Flow", () => {
285
- it("should verify proof using ProofVerifier", async () => {
286
- // Set up DID document for resolution
287
- const didDoc = {
288
- id: "did:key:z123",
289
- verificationMethod: [
290
- {
291
- id: "did:key:z123#key-1",
292
- type: "JsonWebKey2020",
293
- publicKeyJwk: {
294
- kty: "OKP",
295
- crv: "Ed25519",
296
- x: "VCpo2LMLhn6iWku8MKvSLg2ZAoC-nlOyPVQaO3FxVeQ",
297
- },
298
- },
299
- ],
300
- };
301
-
302
- mockFetchProvider.setDIDDocument("did:key:z123", didDoc);
303
-
304
- const proof: DetachedProof = {
305
- jws: "header.payload.signature",
306
- meta: {
307
- did: "did:key:z123",
308
- kid: "did:key:z123#key-1",
309
- ts: Math.floor(Date.now() / 1000), // Unix timestamp in seconds
310
- nonce: "nonce-123",
311
- audience: "mcp-client",
312
- sessionId: "session-123",
313
- requestHash: "sha256:" + "a".repeat(64),
314
- responseHash: "sha256:" + "b".repeat(64),
315
- },
316
- };
317
-
318
- // Note: This test would require actual cryptographic verification
319
- // For now, we test the flow structure
320
- const publicKeyJwk = didDoc.verificationMethod[0].publicKeyJwk as {
321
- kty: "OKP";
322
- crv: "Ed25519";
323
- x: string;
324
- };
325
-
326
- // Mock nonce cache to return false (nonce not seen)
327
- vi.spyOn(mockProviders.nonceCacheProvider, "has").mockResolvedValue(
328
- false
329
- );
330
-
331
- const result = await proofVerifier.verifyProof(proof, publicKeyJwk);
332
-
333
- // Result will depend on actual signature verification
334
- expect(result).toBeDefined();
335
- expect("valid" in result).toBe(true);
336
- });
337
- });
338
-
339
- describe("Runtime Integration", () => {
340
- it("should use AccessControlApiService from runtime", async () => {
341
- const request: VerifyDelegationRequest = {
342
- agent_did: "did:key:z123",
343
- scopes: ["scope1"],
344
- };
345
-
346
- const mockResponse = {
347
- success: true,
348
- data: { valid: true },
349
- metadata: {
350
- requestId: "test-request-id",
351
- timestamp: new Date().toISOString(),
352
- },
353
- };
354
-
355
- mockFetchProvider.fetch.mockResolvedValue(
356
- new Response(JSON.stringify(mockResponse), {
357
- status: 200,
358
- headers: { "Content-Type": "application/json" },
359
- })
360
- );
361
-
362
- const runtimeService = (runtime as any)
363
- .accessControlService as AccessControlApiService;
364
-
365
- expect(runtimeService).toBeDefined();
366
- const result = await runtimeService.verifyDelegation(request);
367
- expect(result.data.valid).toBe(true);
368
- });
369
-
370
- it("should use ProofVerifier from runtime", async () => {
371
- const runtimeVerifier = (runtime as any).proofVerifier as ProofVerifier;
372
- expect(runtimeVerifier).toBeDefined();
373
-
374
- // Verify it's the same instance
375
- expect(runtimeVerifier).toBe(proofVerifier);
376
- });
377
- });
378
-
379
- describe("Error Handling and Retry", () => {
380
- it("should retry on transient errors", async () => {
381
- const request: VerifyDelegationRequest = {
382
- agent_did: "did:key:z123",
383
- scopes: ["scope1"],
384
- };
385
-
386
- const mockResponse = {
387
- success: true,
388
- data: { valid: true },
389
- metadata: {
390
- requestId: "test-request-id",
391
- timestamp: new Date().toISOString(),
392
- },
393
- };
394
-
395
- // First call fails with 500, second succeeds
396
- mockFetchProvider.fetch
397
- .mockResolvedValueOnce(
398
- new Response("Internal Server Error", { status: 500 })
399
- )
400
- .mockResolvedValueOnce(
401
- new Response(JSON.stringify(mockResponse), {
402
- status: 200,
403
- headers: { "Content-Type": "application/json" },
404
- })
405
- );
406
-
407
- const result = await accessControlService.verifyDelegation(request);
408
-
409
- expect(result.data.valid).toBe(true);
410
- expect(mockFetchProvider.fetch).toHaveBeenCalledTimes(2);
411
- });
412
-
413
- it("should not retry on client errors", async () => {
414
- const request: VerifyDelegationRequest = {
415
- agent_did: "did:key:z123",
416
- scopes: ["scope1"],
417
- };
418
-
419
- mockFetchProvider.fetch.mockResolvedValue(
420
- new Response(
421
- JSON.stringify({
422
- success: false,
423
- error: {
424
- code: "validation_error",
425
- message: "Invalid request",
426
- },
427
- }),
428
- {
429
- status: 400,
430
- headers: { "Content-Type": "application/json" },
431
- }
432
- )
433
- );
434
-
435
- await expect(
436
- accessControlService.verifyDelegation(request)
437
- ).rejects.toThrow(AgentShieldAPIError);
438
-
439
- // Should not retry
440
- expect(mockFetchProvider.fetch).toHaveBeenCalledTimes(1);
441
- });
442
- });
443
- });