@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,578 +0,0 @@
1
- /**
2
- * Proof Submission Response Validation Tests
3
- *
4
- * These tests verify that the proof submission response format matches
5
- * the schema defined in @kya-os/contracts, preventing regressions.
6
- *
7
- * CRITICAL: These tests ensure API parity between MCP-I and AgentShield/Bouncer.
8
- */
9
-
10
- import { describe, it, expect, vi, beforeEach } from "vitest";
11
- import { AccessControlApiService } from "../access-control.service";
12
- import { proofSubmissionResponseSchema } from "@kya-os/contracts/agentshield-api";
13
- import type { ProofSubmissionRequest } from "@kya-os/contracts/agentshield-api";
14
-
15
- describe("Proof Submission Response Validation", () => {
16
- let service: AccessControlApiService;
17
- let mockFetch: ReturnType<typeof vi.fn>;
18
-
19
- beforeEach(() => {
20
- mockFetch = vi.fn();
21
- service = new AccessControlApiService({
22
- baseUrl: "https://kya.vouched.id",
23
- apiKey: "test-api-key",
24
- fetchProvider: {
25
- fetch: mockFetch,
26
- },
27
- logger: vi.fn(),
28
- });
29
- });
30
-
31
- describe("Wrapped Response Format (AgentShield API)", () => {
32
- it("should validate wrapped response with success field in data", async () => {
33
- const request: ProofSubmissionRequest = {
34
- session_id: "test-session",
35
- proofs: [
36
- {
37
- jws: "test.jws.signature",
38
- meta: {
39
- did: "did:key:test",
40
- kid: "did:key:test#key-1",
41
- ts: Date.now(),
42
- nonce: "test-nonce",
43
- audience: "https://kya.vouched.id",
44
- sessionId: "test-session",
45
- requestHash: "sha256:" + "a".repeat(64),
46
- responseHash: "sha256:" + "b".repeat(64),
47
- scopeId: "test:execute",
48
- },
49
- },
50
- ],
51
- };
52
-
53
- // Simulate AgentShield API wrapped response
54
- const wrappedResponse = {
55
- success: true,
56
- data: {
57
- accepted: 1,
58
- rejected: 0,
59
- outcomes: {
60
- success: 1,
61
- failed: 0,
62
- blocked: 0,
63
- error: 0,
64
- },
65
- },
66
- metadata: {
67
- requestId: "test-request-id",
68
- timestamp: new Date().toISOString(),
69
- },
70
- };
71
-
72
- mockFetch.mockResolvedValueOnce({
73
- ok: true,
74
- status: 200,
75
- text: async () => JSON.stringify(wrappedResponse),
76
- headers: new Headers(),
77
- });
78
-
79
- const result = await service.submitProofs(request);
80
-
81
- expect(result).toMatchObject({
82
- success: true,
83
- accepted: 1,
84
- rejected: 0,
85
- outcomes: {
86
- success: 1,
87
- failed: 0,
88
- blocked: 0,
89
- error: 0,
90
- },
91
- });
92
- });
93
-
94
- it("should validate wrapped response with errors array", async () => {
95
- const request: ProofSubmissionRequest = {
96
- session_id: "test-session",
97
- proofs: [
98
- {
99
- jws: "test.jws.signature",
100
- meta: {
101
- did: "did:key:test",
102
- kid: "did:key:test#key-1",
103
- ts: Date.now(),
104
- nonce: "test-nonce",
105
- audience: "https://kya.vouched.id",
106
- sessionId: "test-session",
107
- requestHash: "sha256:" + "a".repeat(64),
108
- responseHash: "sha256:" + "b".repeat(64),
109
- scopeId: "test:execute",
110
- },
111
- },
112
- ],
113
- };
114
-
115
- const wrappedResponse = {
116
- success: true,
117
- data: {
118
- accepted: 0,
119
- rejected: 1,
120
- outcomes: {
121
- success: 0,
122
- failed: 1,
123
- blocked: 0,
124
- error: 0,
125
- },
126
- errors: [
127
- {
128
- proof_index: 0,
129
- error: {
130
- code: "validation_error",
131
- message: "Proof validation failed",
132
- details: { reason: "invalid_signature" },
133
- },
134
- },
135
- ],
136
- },
137
- metadata: {
138
- requestId: "test-request-id",
139
- timestamp: new Date().toISOString(),
140
- },
141
- };
142
-
143
- mockFetch.mockResolvedValueOnce({
144
- ok: true,
145
- status: 200,
146
- text: async () => JSON.stringify(wrappedResponse),
147
- headers: new Headers(),
148
- });
149
-
150
- const result = await service.submitProofs(request);
151
-
152
- expect(result).toMatchObject({
153
- success: true,
154
- accepted: 0,
155
- rejected: 1,
156
- errors: [
157
- {
158
- proof_index: 0,
159
- error: {
160
- code: "validation_error",
161
- message: "Proof validation failed",
162
- details: { reason: "invalid_signature" },
163
- },
164
- },
165
- ],
166
- });
167
- });
168
-
169
- it("should validate wrapped response without outcomes (optional field)", async () => {
170
- const request: ProofSubmissionRequest = {
171
- session_id: "test-session",
172
- proofs: [
173
- {
174
- jws: "test.jws.signature",
175
- meta: {
176
- did: "did:key:test",
177
- kid: "did:key:test#key-1",
178
- ts: Date.now(),
179
- nonce: "test-nonce",
180
- audience: "https://kya.vouched.id",
181
- sessionId: "test-session",
182
- requestHash: "sha256:" + "a".repeat(64),
183
- responseHash: "sha256:" + "b".repeat(64),
184
- scopeId: "test:execute",
185
- },
186
- },
187
- ],
188
- };
189
-
190
- // Response without outcomes (should be valid per schema)
191
- const wrappedResponse = {
192
- success: true,
193
- data: {
194
- accepted: 1,
195
- rejected: 0,
196
- // outcomes omitted - should still validate
197
- },
198
- metadata: {
199
- requestId: "test-request-id",
200
- timestamp: new Date().toISOString(),
201
- },
202
- };
203
-
204
- mockFetch.mockResolvedValueOnce({
205
- ok: true,
206
- status: 200,
207
- text: async () => JSON.stringify(wrappedResponse),
208
- headers: new Headers(),
209
- });
210
-
211
- const result = await service.submitProofs(request);
212
-
213
- expect(result).toMatchObject({
214
- success: true,
215
- accepted: 1,
216
- rejected: 0,
217
- });
218
- // outcomes should be undefined or present, but not required
219
- expect(result.outcomes).toBeUndefined();
220
- });
221
-
222
- it("should throw validation error if data object missing success field", async () => {
223
- const request: ProofSubmissionRequest = {
224
- session_id: "test-session",
225
- proofs: [
226
- {
227
- jws: "test.jws.signature",
228
- meta: {
229
- did: "did:key:test",
230
- kid: "did:key:test#key-1",
231
- ts: Date.now(),
232
- nonce: "test-nonce",
233
- audience: "https://kya.vouched.id",
234
- sessionId: "test-session",
235
- requestHash: "sha256:" + "a".repeat(64),
236
- responseHash: "sha256:" + "b".repeat(64),
237
- scopeId: "test:execute",
238
- },
239
- },
240
- ],
241
- };
242
-
243
- // Response where data object doesn't have success (should be added by service)
244
- const wrappedResponse = {
245
- success: true,
246
- data: {
247
- // Missing success field - service should add it
248
- accepted: 1,
249
- rejected: 0,
250
- outcomes: {
251
- success: 1,
252
- failed: 0,
253
- blocked: 0,
254
- error: 0,
255
- },
256
- },
257
- metadata: {
258
- requestId: "test-request-id",
259
- timestamp: new Date().toISOString(),
260
- },
261
- };
262
-
263
- mockFetch.mockResolvedValueOnce({
264
- ok: true,
265
- status: 200,
266
- text: async () => JSON.stringify(wrappedResponse),
267
- headers: new Headers(),
268
- });
269
-
270
- // Should succeed because service adds success field
271
- const result = await service.submitProofs(request);
272
- expect(result.success).toBe(true);
273
- });
274
-
275
- it("should validate schema directly matches AgentShield response format", () => {
276
- // This test ensures the schema matches what AgentShield actually returns
277
- const agentShieldResponseData = {
278
- success: true,
279
- accepted: 1,
280
- rejected: 0,
281
- outcomes: {
282
- success: 1,
283
- failed: 0,
284
- blocked: 0,
285
- error: 0,
286
- },
287
- };
288
-
289
- const validation = proofSubmissionResponseSchema.safeParse(
290
- agentShieldResponseData
291
- );
292
- expect(validation.success).toBe(true);
293
- if (validation.success) {
294
- expect(validation.data).toMatchObject(agentShieldResponseData);
295
- }
296
- });
297
-
298
- it("should validate schema with errors array matches AgentShield format", () => {
299
- const agentShieldResponseData = {
300
- success: true,
301
- accepted: 0,
302
- rejected: 1,
303
- outcomes: {
304
- success: 0,
305
- failed: 1,
306
- blocked: 0,
307
- error: 0,
308
- },
309
- errors: [
310
- {
311
- proof_index: 0,
312
- error: {
313
- code: "validation_error",
314
- message: "Proof validation failed",
315
- details: { reason: "invalid_signature" },
316
- },
317
- },
318
- ],
319
- };
320
-
321
- const validation = proofSubmissionResponseSchema.safeParse(
322
- agentShieldResponseData
323
- );
324
- expect(validation.success).toBe(true);
325
- if (validation.success) {
326
- expect(validation.data.errors).toHaveLength(1);
327
- expect(validation.data.errors![0].proof_index).toBe(0);
328
- expect(validation.data.errors![0].error.code).toBe("validation_error");
329
- }
330
- });
331
- });
332
-
333
- describe("Regression Prevention", () => {
334
- it("should prevent regression: missing success field in data", () => {
335
- // This test ensures we catch if AgentShield changes response format
336
- const responseWithoutSuccess = {
337
- accepted: 1,
338
- rejected: 0,
339
- outcomes: {
340
- success: 1,
341
- failed: 0,
342
- blocked: 0,
343
- error: 0,
344
- },
345
- };
346
-
347
- const validation = proofSubmissionResponseSchema.safeParse(
348
- responseWithoutSuccess
349
- );
350
- expect(validation.success).toBe(false);
351
- if (!validation.success) {
352
- expect(
353
- validation.error.errors.some((e) => e.path.includes("success"))
354
- ).toBe(true);
355
- }
356
- });
357
-
358
- it("should prevent regression: wrong type for accepted/rejected", () => {
359
- const invalidResponse = {
360
- success: true,
361
- accepted: "1", // Should be number
362
- rejected: "0", // Should be number
363
- outcomes: {
364
- success: 1,
365
- failed: 0,
366
- blocked: 0,
367
- error: 0,
368
- },
369
- };
370
-
371
- const validation =
372
- proofSubmissionResponseSchema.safeParse(invalidResponse);
373
- expect(validation.success).toBe(false);
374
- });
375
-
376
- it("should prevent regression: missing required fields", () => {
377
- const incompleteResponse = {
378
- success: true,
379
- // Missing accepted
380
- rejected: 0,
381
- outcomes: {
382
- success: 1,
383
- failed: 0,
384
- blocked: 0,
385
- error: 0,
386
- },
387
- };
388
-
389
- const validation =
390
- proofSubmissionResponseSchema.safeParse(incompleteResponse);
391
- expect(validation.success).toBe(false);
392
- if (!validation.success) {
393
- expect(
394
- validation.error.errors.some((e) => e.path.includes("accepted"))
395
- ).toBe(true);
396
- }
397
- });
398
- });
399
-
400
- describe("JSON Deep Clone Fix (Cloudflare Workers Edge Case)", () => {
401
- it("should correctly extract data from wrapped response after JSON deep clone", async () => {
402
- const request: ProofSubmissionRequest = {
403
- session_id: "test-session",
404
- proofs: [
405
- {
406
- jws: "test.jws.signature",
407
- meta: {
408
- did: "did:key:test",
409
- kid: "did:key:test#key-1",
410
- ts: Date.now(),
411
- nonce: "test-nonce",
412
- audience: "https://kya.vouched.id",
413
- sessionId: "test-session",
414
- requestHash: "sha256:" + "a".repeat(64),
415
- responseHash: "sha256:" + "b".repeat(64),
416
- scopeId: "test:execute",
417
- },
418
- },
419
- ],
420
- };
421
-
422
- // Simulate the exact response format from AgentShield API
423
- // This matches the format seen in production logs
424
- const wrappedResponse = {
425
- success: true,
426
- data: {
427
- accepted: 1,
428
- rejected: 0,
429
- outcomes: {
430
- success: 1,
431
- },
432
- errors: [],
433
- },
434
- metadata: {
435
- requestId: "fc1fa88f-9b22-4161-b4fd-17d8215098ee",
436
- timestamp: "2025-11-24T21:36:33.029Z",
437
- },
438
- };
439
-
440
- mockFetch.mockResolvedValueOnce({
441
- ok: true,
442
- status: 200,
443
- text: async () => JSON.stringify(wrappedResponse),
444
- headers: new Headers(),
445
- });
446
-
447
- const result = await service.submitProofs(request);
448
-
449
- // Verify all fields are correctly extracted
450
- expect(result.success).toBe(true);
451
- expect(result.accepted).toBe(1);
452
- expect(result.rejected).toBe(0);
453
- expect(result.outcomes).toEqual({ success: 1 });
454
- expect(result.errors).toEqual([]);
455
- });
456
-
457
- it("should handle response where data fields are numeric values (not undefined)", async () => {
458
- const request: ProofSubmissionRequest = {
459
- session_id: "test-session",
460
- proofs: [
461
- {
462
- jws: "test.jws.signature",
463
- meta: {
464
- did: "did:key:test",
465
- kid: "did:key:test#key-1",
466
- ts: Date.now(),
467
- nonce: "test-nonce",
468
- audience: "https://kya.vouched.id",
469
- sessionId: "test-session",
470
- requestHash: "sha256:" + "a".repeat(64),
471
- responseHash: "sha256:" + "b".repeat(64),
472
- scopeId: "test:execute",
473
- },
474
- },
475
- ],
476
- };
477
-
478
- // Test with zero values (edge case for falsy check)
479
- const wrappedResponse = {
480
- success: true,
481
- data: {
482
- accepted: 0,
483
- rejected: 0,
484
- outcomes: {},
485
- errors: [],
486
- },
487
- metadata: {
488
- requestId: "test-id",
489
- timestamp: new Date().toISOString(),
490
- },
491
- };
492
-
493
- mockFetch.mockResolvedValueOnce({
494
- ok: true,
495
- status: 200,
496
- text: async () => JSON.stringify(wrappedResponse),
497
- headers: new Headers(),
498
- });
499
-
500
- const result = await service.submitProofs(request);
501
-
502
- // Verify zero values are correctly extracted (not treated as undefined)
503
- expect(result.success).toBe(true);
504
- expect(result.accepted).toBe(0);
505
- expect(result.rejected).toBe(0);
506
- });
507
-
508
- it("should handle response with nested outcomes object", async () => {
509
- const request: ProofSubmissionRequest = {
510
- session_id: "test-session",
511
- proofs: [
512
- {
513
- jws: "test.jws.signature",
514
- meta: {
515
- did: "did:key:test",
516
- kid: "did:key:test#key-1",
517
- ts: Date.now(),
518
- nonce: "test-nonce",
519
- audience: "https://kya.vouched.id",
520
- sessionId: "test-session",
521
- requestHash: "sha256:" + "a".repeat(64),
522
- responseHash: "sha256:" + "b".repeat(64),
523
- scopeId: "test:execute",
524
- },
525
- },
526
- ],
527
- };
528
-
529
- // Test with various outcome types
530
- const wrappedResponse = {
531
- success: true,
532
- data: {
533
- accepted: 3,
534
- rejected: 2,
535
- outcomes: {
536
- success: 1,
537
- failed: 1,
538
- blocked: 1,
539
- error: 2,
540
- },
541
- errors: [
542
- {
543
- proof_index: 0,
544
- error: {
545
- code: "validation_error",
546
- message: "Invalid signature",
547
- },
548
- },
549
- ],
550
- },
551
- metadata: {
552
- requestId: "test-id",
553
- timestamp: new Date().toISOString(),
554
- },
555
- };
556
-
557
- mockFetch.mockResolvedValueOnce({
558
- ok: true,
559
- status: 200,
560
- text: async () => JSON.stringify(wrappedResponse),
561
- headers: new Headers(),
562
- });
563
-
564
- const result = await service.submitProofs(request);
565
-
566
- expect(result.accepted).toBe(3);
567
- expect(result.rejected).toBe(2);
568
- expect(result.outcomes).toEqual({
569
- success: 1,
570
- failed: 1,
571
- blocked: 1,
572
- error: 2,
573
- });
574
- expect(result.errors).toHaveLength(1);
575
- expect(result.errors![0].proof_index).toBe(0);
576
- });
577
- });
578
- });