@vorionsys/basis 1.0.1

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 (174) hide show
  1. package/.env.example +22 -0
  2. package/AMOY-MIGRATION.md +188 -0
  3. package/DEPLOY-AMOY.md +368 -0
  4. package/DEPLOY-NOW.md +216 -0
  5. package/DEPLOYMENT.md +239 -0
  6. package/GET-WALLET.md +286 -0
  7. package/QUICK-WALLET-SETUP.md +268 -0
  8. package/README.md +195 -0
  9. package/artifacts/@openzeppelin/contracts/access/AccessControl.sol/AccessControl.dbg.json +4 -0
  10. package/artifacts/@openzeppelin/contracts/access/AccessControl.sol/AccessControl.json +236 -0
  11. package/artifacts/@openzeppelin/contracts/access/IAccessControl.sol/IAccessControl.dbg.json +4 -0
  12. package/artifacts/@openzeppelin/contracts/access/IAccessControl.sol/IAccessControl.json +204 -0
  13. package/artifacts/@openzeppelin/contracts/interfaces/IERC4906.sol/IERC4906.dbg.json +4 -0
  14. package/artifacts/@openzeppelin/contracts/interfaces/IERC4906.sol/IERC4906.json +328 -0
  15. package/artifacts/@openzeppelin/contracts/interfaces/draft-IERC6093.sol/IERC1155Errors.dbg.json +4 -0
  16. package/artifacts/@openzeppelin/contracts/interfaces/draft-IERC6093.sol/IERC1155Errors.json +113 -0
  17. package/artifacts/@openzeppelin/contracts/interfaces/draft-IERC6093.sol/IERC20Errors.dbg.json +4 -0
  18. package/artifacts/@openzeppelin/contracts/interfaces/draft-IERC6093.sol/IERC20Errors.json +97 -0
  19. package/artifacts/@openzeppelin/contracts/interfaces/draft-IERC6093.sol/IERC721Errors.dbg.json +4 -0
  20. package/artifacts/@openzeppelin/contracts/interfaces/draft-IERC6093.sol/IERC721Errors.json +114 -0
  21. package/artifacts/@openzeppelin/contracts/token/ERC721/ERC721.sol/ERC721.dbg.json +4 -0
  22. package/artifacts/@openzeppelin/contracts/token/ERC721/ERC721.sol/ERC721.json +444 -0
  23. package/artifacts/@openzeppelin/contracts/token/ERC721/IERC721.sol/IERC721.dbg.json +4 -0
  24. package/artifacts/@openzeppelin/contracts/token/ERC721/IERC721.sol/IERC721.json +296 -0
  25. package/artifacts/@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol/IERC721Receiver.dbg.json +4 -0
  26. package/artifacts/@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol/IERC721Receiver.json +45 -0
  27. package/artifacts/@openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol/ERC721Enumerable.dbg.json +4 -0
  28. package/artifacts/@openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol/ERC721Enumerable.json +521 -0
  29. package/artifacts/@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol/ERC721URIStorage.dbg.json +4 -0
  30. package/artifacts/@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol/ERC721URIStorage.json +476 -0
  31. package/artifacts/@openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol/IERC721Enumerable.dbg.json +4 -0
  32. package/artifacts/@openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol/IERC721Enumerable.json +352 -0
  33. package/artifacts/@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol/IERC721Metadata.dbg.json +4 -0
  34. package/artifacts/@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol/IERC721Metadata.json +341 -0
  35. package/artifacts/@openzeppelin/contracts/token/ERC721/utils/ERC721Utils.sol/ERC721Utils.dbg.json +4 -0
  36. package/artifacts/@openzeppelin/contracts/token/ERC721/utils/ERC721Utils.sol/ERC721Utils.json +10 -0
  37. package/artifacts/@openzeppelin/contracts/utils/Context.sol/Context.dbg.json +4 -0
  38. package/artifacts/@openzeppelin/contracts/utils/Context.sol/Context.json +10 -0
  39. package/artifacts/@openzeppelin/contracts/utils/Panic.sol/Panic.dbg.json +4 -0
  40. package/artifacts/@openzeppelin/contracts/utils/Panic.sol/Panic.json +10 -0
  41. package/artifacts/@openzeppelin/contracts/utils/Strings.sol/Strings.dbg.json +4 -0
  42. package/artifacts/@openzeppelin/contracts/utils/Strings.sol/Strings.json +37 -0
  43. package/artifacts/@openzeppelin/contracts/utils/introspection/ERC165.sol/ERC165.dbg.json +4 -0
  44. package/artifacts/@openzeppelin/contracts/utils/introspection/ERC165.sol/ERC165.json +30 -0
  45. package/artifacts/@openzeppelin/contracts/utils/introspection/IERC165.sol/IERC165.dbg.json +4 -0
  46. package/artifacts/@openzeppelin/contracts/utils/introspection/IERC165.sol/IERC165.json +30 -0
  47. package/artifacts/@openzeppelin/contracts/utils/math/Math.sol/Math.dbg.json +4 -0
  48. package/artifacts/@openzeppelin/contracts/utils/math/Math.sol/Math.json +10 -0
  49. package/artifacts/@openzeppelin/contracts/utils/math/SafeCast.sol/SafeCast.dbg.json +4 -0
  50. package/artifacts/@openzeppelin/contracts/utils/math/SafeCast.sol/SafeCast.json +65 -0
  51. package/artifacts/@openzeppelin/contracts/utils/math/SignedMath.sol/SignedMath.dbg.json +4 -0
  52. package/artifacts/@openzeppelin/contracts/utils/math/SignedMath.sol/SignedMath.json +10 -0
  53. package/artifacts/build-info/357d1bba4062d461f497f221490811a3.json +1 -0
  54. package/artifacts/contracts/AgentCard.sol/AgentCard.dbg.json +4 -0
  55. package/artifacts/contracts/AgentCard.sol/AgentCard.json +1430 -0
  56. package/build_errors.txt +0 -0
  57. package/build_output.txt +0 -0
  58. package/cache/solidity-files-cache.json +885 -0
  59. package/contracts/AgentCard.sol +478 -0
  60. package/contracts/deploy/01-deploy-agentcard.ts +66 -0
  61. package/dist/index.d.ts.map +1 -0
  62. package/dist/index.js +12 -0
  63. package/dist/kya/accountability.d.ts.map +1 -0
  64. package/dist/kya/accountability.js +100 -0
  65. package/dist/kya/authorization.d.ts.map +1 -0
  66. package/dist/kya/authorization.js +258 -0
  67. package/dist/kya/behavior.d.ts.map +1 -0
  68. package/dist/kya/behavior.js +142 -0
  69. package/dist/kya/identity.d.ts.map +1 -0
  70. package/dist/kya/identity.js +187 -0
  71. package/dist/kya/index.d.ts.map +1 -0
  72. package/dist/kya/index.js +99 -0
  73. package/dist/kya/types.d.ts.map +1 -0
  74. package/dist/kya/types.js +5 -0
  75. package/dist/trust-1000-agents.test.d.ts.map +1 -0
  76. package/dist/trust-1000-agents.test.js +608 -0
  77. package/dist/trust-capabilities.d.ts.map +1 -0
  78. package/dist/trust-capabilities.js +478 -0
  79. package/dist/trust-factors.d.ts.map +1 -0
  80. package/dist/trust-factors.js +588 -0
  81. package/dist/trust-factors.test.d.ts.map +1 -0
  82. package/dist/trust-factors.test.js +179 -0
  83. package/dist/validation-gate.d.ts.map +1 -0
  84. package/dist/validation-gate.js +468 -0
  85. package/dist/validation-gate.test.d.ts.map +1 -0
  86. package/dist/validation-gate.test.js +419 -0
  87. package/hardhat.config.ts +55 -0
  88. package/package.json +57 -0
  89. package/scripts/certify-agent.ts +91 -0
  90. package/scripts/deploy-agentcard.ts +63 -0
  91. package/scripts/mint-agentcard.ts +87 -0
  92. package/specs/adversarial-sandbox-test-suite.md +1055 -0
  93. package/specs/kya-framework.md +910 -0
  94. package/specs/trust-factors-v2.md +437 -0
  95. package/src/index.ts +14 -0
  96. package/src/kya/accountability.ts +132 -0
  97. package/src/kya/authorization.ts +325 -0
  98. package/src/kya/behavior.ts +169 -0
  99. package/src/kya/identity.ts +224 -0
  100. package/src/kya/index.ts +125 -0
  101. package/src/kya/types.ts +242 -0
  102. package/src/trust-1000-agents.test.ts +745 -0
  103. package/src/trust-capabilities.ts +517 -0
  104. package/src/trust-factors.test.ts +241 -0
  105. package/src/trust-factors.ts +666 -0
  106. package/src/validation-gate.test.ts +531 -0
  107. package/src/validation-gate.ts +665 -0
  108. package/test-kya-simple.ts +258 -0
  109. package/test-kya.ts +245 -0
  110. package/tsconfig.json +14 -0
  111. package/typechain-types/@openzeppelin/contracts/access/AccessControl.ts +324 -0
  112. package/typechain-types/@openzeppelin/contracts/access/IAccessControl.ts +292 -0
  113. package/typechain-types/@openzeppelin/contracts/access/index.ts +5 -0
  114. package/typechain-types/@openzeppelin/contracts/index.ts +11 -0
  115. package/typechain-types/@openzeppelin/contracts/interfaces/IERC4906.ts +462 -0
  116. package/typechain-types/@openzeppelin/contracts/interfaces/draft-IERC6093.sol/IERC1155Errors.ts +69 -0
  117. package/typechain-types/@openzeppelin/contracts/interfaces/draft-IERC6093.sol/IERC20Errors.ts +69 -0
  118. package/typechain-types/@openzeppelin/contracts/interfaces/draft-IERC6093.sol/IERC721Errors.ts +69 -0
  119. package/typechain-types/@openzeppelin/contracts/interfaces/draft-IERC6093.sol/index.ts +6 -0
  120. package/typechain-types/@openzeppelin/contracts/interfaces/index.ts +6 -0
  121. package/typechain-types/@openzeppelin/contracts/token/ERC721/ERC721.ts +420 -0
  122. package/typechain-types/@openzeppelin/contracts/token/ERC721/IERC721.ts +393 -0
  123. package/typechain-types/@openzeppelin/contracts/token/ERC721/IERC721Receiver.ts +110 -0
  124. package/typechain-types/@openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.ts +470 -0
  125. package/typechain-types/@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.ts +489 -0
  126. package/typechain-types/@openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.ts +443 -0
  127. package/typechain-types/@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.ts +420 -0
  128. package/typechain-types/@openzeppelin/contracts/token/ERC721/extensions/index.ts +7 -0
  129. package/typechain-types/@openzeppelin/contracts/token/ERC721/index.ts +8 -0
  130. package/typechain-types/@openzeppelin/contracts/token/index.ts +5 -0
  131. package/typechain-types/@openzeppelin/contracts/utils/Strings.ts +69 -0
  132. package/typechain-types/@openzeppelin/contracts/utils/index.ts +8 -0
  133. package/typechain-types/@openzeppelin/contracts/utils/introspection/ERC165.ts +94 -0
  134. package/typechain-types/@openzeppelin/contracts/utils/introspection/IERC165.ts +94 -0
  135. package/typechain-types/@openzeppelin/contracts/utils/introspection/index.ts +5 -0
  136. package/typechain-types/@openzeppelin/contracts/utils/math/SafeCast.ts +69 -0
  137. package/typechain-types/@openzeppelin/contracts/utils/math/index.ts +4 -0
  138. package/typechain-types/@openzeppelin/index.ts +5 -0
  139. package/typechain-types/common.ts +131 -0
  140. package/typechain-types/contracts/AgentCard.ts +1415 -0
  141. package/typechain-types/contracts/index.ts +4 -0
  142. package/typechain-types/factories/@openzeppelin/contracts/access/AccessControl__factory.ts +250 -0
  143. package/typechain-types/factories/@openzeppelin/contracts/access/IAccessControl__factory.ts +218 -0
  144. package/typechain-types/factories/@openzeppelin/contracts/access/index.ts +5 -0
  145. package/typechain-types/factories/@openzeppelin/contracts/index.ts +7 -0
  146. package/typechain-types/factories/@openzeppelin/contracts/interfaces/IERC4906__factory.ts +339 -0
  147. package/typechain-types/factories/@openzeppelin/contracts/interfaces/draft-IERC6093.sol/IERC1155Errors__factory.ts +127 -0
  148. package/typechain-types/factories/@openzeppelin/contracts/interfaces/draft-IERC6093.sol/IERC20Errors__factory.ts +111 -0
  149. package/typechain-types/factories/@openzeppelin/contracts/interfaces/draft-IERC6093.sol/IERC721Errors__factory.ts +128 -0
  150. package/typechain-types/factories/@openzeppelin/contracts/interfaces/draft-IERC6093.sol/index.ts +6 -0
  151. package/typechain-types/factories/@openzeppelin/contracts/interfaces/index.ts +5 -0
  152. package/typechain-types/factories/@openzeppelin/contracts/token/ERC721/ERC721__factory.ts +455 -0
  153. package/typechain-types/factories/@openzeppelin/contracts/token/ERC721/IERC721Receiver__factory.ts +59 -0
  154. package/typechain-types/factories/@openzeppelin/contracts/token/ERC721/IERC721__factory.ts +307 -0
  155. package/typechain-types/factories/@openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable__factory.ts +535 -0
  156. package/typechain-types/factories/@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage__factory.ts +490 -0
  157. package/typechain-types/factories/@openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable__factory.ts +366 -0
  158. package/typechain-types/factories/@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata__factory.ts +355 -0
  159. package/typechain-types/factories/@openzeppelin/contracts/token/ERC721/extensions/index.ts +7 -0
  160. package/typechain-types/factories/@openzeppelin/contracts/token/ERC721/index.ts +7 -0
  161. package/typechain-types/factories/@openzeppelin/contracts/token/index.ts +4 -0
  162. package/typechain-types/factories/@openzeppelin/contracts/utils/Strings__factory.ts +90 -0
  163. package/typechain-types/factories/@openzeppelin/contracts/utils/index.ts +6 -0
  164. package/typechain-types/factories/@openzeppelin/contracts/utils/introspection/ERC165__factory.ts +41 -0
  165. package/typechain-types/factories/@openzeppelin/contracts/utils/introspection/IERC165__factory.ts +41 -0
  166. package/typechain-types/factories/@openzeppelin/contracts/utils/introspection/index.ts +5 -0
  167. package/typechain-types/factories/@openzeppelin/contracts/utils/math/SafeCast__factory.ts +118 -0
  168. package/typechain-types/factories/@openzeppelin/contracts/utils/math/index.ts +4 -0
  169. package/typechain-types/factories/@openzeppelin/index.ts +4 -0
  170. package/typechain-types/factories/contracts/AgentCard__factory.ts +1480 -0
  171. package/typechain-types/factories/contracts/index.ts +4 -0
  172. package/typechain-types/factories/index.ts +5 -0
  173. package/typechain-types/index.ts +44 -0
  174. package/vitest.config.ts +8 -0
@@ -0,0 +1,258 @@
1
+ /**
2
+ * KYA Authorization Manager
3
+ * Capability-based access control + policy enforcement
4
+ */
5
+ export class AuthorizationManager {
6
+ config;
7
+ policyBundles;
8
+ capabilities;
9
+ constructor(config) {
10
+ this.config = config;
11
+ this.policyBundles = new Map();
12
+ this.capabilities = new Map();
13
+ // Load policy bundles
14
+ this.loadPolicyBundles();
15
+ }
16
+ /**
17
+ * Authorize agent action
18
+ */
19
+ async authorize(request) {
20
+ // 1. Get agent capabilities
21
+ const agentCapabilities = this.capabilities.get(request.agentDID) || [];
22
+ // 2. Find matching capability
23
+ const matchingCap = agentCapabilities.find(token => token.capabilities.some((cap) => this.matchesCapability(cap, request.action, request.resource)));
24
+ if (!matchingCap) {
25
+ return {
26
+ allowed: false,
27
+ reason: 'No matching capability',
28
+ trustImpact: -10,
29
+ };
30
+ }
31
+ // 3. Check capability expiry
32
+ const now = new Date();
33
+ const notBefore = new Date(matchingCap.notBefore);
34
+ const notAfter = new Date(matchingCap.notAfter);
35
+ if (now < notBefore || now > notAfter) {
36
+ return {
37
+ allowed: false,
38
+ reason: 'Capability expired or not yet valid',
39
+ trustImpact: -5,
40
+ };
41
+ }
42
+ // 4. Evaluate conditions
43
+ const capability = matchingCap.capabilities.find((cap) => this.matchesCapability(cap, request.action, request.resource));
44
+ if (capability.conditions) {
45
+ const conditionsValid = await this.evaluateConditions(capability.conditions, request);
46
+ if (!conditionsValid) {
47
+ return {
48
+ allowed: false,
49
+ reason: 'Capability conditions not met',
50
+ trustImpact: -5,
51
+ };
52
+ }
53
+ }
54
+ // 5. Check policy constraints
55
+ const policyViolations = await this.checkPolicyConstraints(request);
56
+ if (policyViolations.length > 0) {
57
+ return {
58
+ allowed: false,
59
+ reason: `Policy violations: ${policyViolations.join(', ')}`,
60
+ trustImpact: -20,
61
+ };
62
+ }
63
+ // 6. ALLOW
64
+ return {
65
+ allowed: true,
66
+ reason: 'Authorized',
67
+ conditions: capability.conditions,
68
+ trustImpact: 1,
69
+ };
70
+ }
71
+ /**
72
+ * Grant capability to agent
73
+ */
74
+ async grantCapability(agentDID, capabilityToken) {
75
+ const existing = this.capabilities.get(agentDID) || [];
76
+ existing.push(capabilityToken);
77
+ this.capabilities.set(agentDID, existing);
78
+ }
79
+ /**
80
+ * Revoke capability from agent
81
+ */
82
+ async revokeCapability(agentDID, capabilityId) {
83
+ const existing = this.capabilities.get(agentDID) || [];
84
+ const filtered = existing.filter(cap => cap.id !== capabilityId);
85
+ this.capabilities.set(agentDID, filtered);
86
+ }
87
+ // ============================================================================
88
+ // Private Methods
89
+ // ============================================================================
90
+ /**
91
+ * Check if capability matches action + resource
92
+ */
93
+ matchesCapability(capability, action, resource) {
94
+ // Exact match
95
+ if (capability.action === action && capability.resource === resource) {
96
+ return true;
97
+ }
98
+ // Wildcard match
99
+ const actionMatch = this.matchesPattern(capability.action, action);
100
+ const resourceMatch = this.matchesPattern(capability.resource, resource);
101
+ return actionMatch && resourceMatch;
102
+ }
103
+ /**
104
+ * Pattern matching with wildcards
105
+ */
106
+ matchesPattern(pattern, value) {
107
+ if (pattern === '*')
108
+ return true;
109
+ if (pattern === value)
110
+ return true;
111
+ // Convert glob pattern to regex
112
+ const regexPattern = pattern
113
+ .replace(/\./g, '\\.')
114
+ .replace(/\*/g, '.*');
115
+ const regex = new RegExp(`^${regexPattern}$`);
116
+ return regex.test(value);
117
+ }
118
+ /**
119
+ * Evaluate capability conditions
120
+ */
121
+ async evaluateConditions(conditions, request) {
122
+ // Example condition checks
123
+ if (conditions.maxFileSize && request.resource.startsWith('/')) {
124
+ // Would check actual file size
125
+ return true;
126
+ }
127
+ if (conditions.rateLimit) {
128
+ // Would check rate limiting
129
+ return true;
130
+ }
131
+ if (conditions.methods && Array.isArray(conditions.methods)) {
132
+ // Would check HTTP method
133
+ return true;
134
+ }
135
+ return true;
136
+ }
137
+ /**
138
+ * Check policy constraints (MUST NOT do)
139
+ */
140
+ async checkPolicyConstraints(request) {
141
+ const violations = [];
142
+ // Get applicable policy bundle
143
+ const policyBundle = this.policyBundles.get(this.config.defaultJurisdiction);
144
+ if (!policyBundle) {
145
+ return violations;
146
+ }
147
+ // Check each constraint
148
+ for (const constraint of policyBundle.constraints) {
149
+ const violated = await this.evaluateConstraint(constraint.rule, request);
150
+ if (violated) {
151
+ violations.push(constraint.description);
152
+ // Apply enforcement action
153
+ if (constraint.enforcement === 'block') {
154
+ // Already blocked by adding to violations
155
+ }
156
+ else if (constraint.enforcement === 'warn') {
157
+ console.warn(`Policy warning: ${constraint.description}`);
158
+ }
159
+ else if (constraint.enforcement === 'log') {
160
+ console.log(`Policy logged: ${constraint.description}`);
161
+ }
162
+ }
163
+ }
164
+ return violations;
165
+ }
166
+ /**
167
+ * Evaluate constraint rule (simplified)
168
+ */
169
+ async evaluateConstraint(rule, request) {
170
+ // Would use CEL (Common Expression Language) or JSON Logic
171
+ // For now, simple keyword matching
172
+ if (rule.includes('no_credential_access') && request.resource.includes('credential')) {
173
+ return true;
174
+ }
175
+ if (rule.includes('no_external_code') && request.action.includes('code.execute')) {
176
+ return true;
177
+ }
178
+ return false;
179
+ }
180
+ /**
181
+ * Load policy bundles from configuration
182
+ */
183
+ loadPolicyBundles() {
184
+ // Would load from files/database
185
+ // For now, create a default policy bundle
186
+ const defaultBundle = {
187
+ id: 'vorion-default-v1',
188
+ version: '1.0.0',
189
+ jurisdiction: 'Global',
190
+ constraints: [
191
+ {
192
+ id: 'no-credential-access',
193
+ description: 'Agents cannot access credential files',
194
+ rule: 'no_credential_access',
195
+ severity: 'critical',
196
+ enforcement: 'block',
197
+ },
198
+ {
199
+ id: 'no-external-code',
200
+ description: 'Agents cannot execute external code',
201
+ rule: 'no_external_code',
202
+ severity: 'high',
203
+ enforcement: 'block',
204
+ },
205
+ ],
206
+ obligations: [],
207
+ permissions: [],
208
+ };
209
+ this.policyBundles.set('Global', defaultBundle);
210
+ }
211
+ }
212
+ // ============================================================================
213
+ // Example Usage
214
+ // ============================================================================
215
+ /*
216
+ import { AuthorizationManager } from './authorization';
217
+
218
+ async function example() {
219
+ const authManager = new AuthorizationManager({
220
+ policyBundlesPath: './policies',
221
+ defaultJurisdiction: 'Global',
222
+ });
223
+
224
+ // Grant capability to agent
225
+ await authManager.grantCapability('did:vorion:agent:123', {
226
+ id: 'cap_001',
227
+ issuer: 'did:vorion:org:agentanchor',
228
+ subject: 'did:vorion:agent:123',
229
+ capabilities: [
230
+ {
231
+ action: 'file.write',
232
+ resource: '/data/user_documents/*',
233
+ conditions: {
234
+ maxFileSize: 10485760,
235
+ allowedExtensions: ['.txt', '.md', '.json'],
236
+ },
237
+ },
238
+ ],
239
+ notBefore: new Date().toISOString(),
240
+ notAfter: new Date(Date.now() + 30 * 24 * 60 * 60 * 1000).toISOString(),
241
+ signature: '...',
242
+ });
243
+
244
+ // Check authorization
245
+ const decision = await authManager.authorize({
246
+ agentDID: 'did:vorion:agent:123',
247
+ action: 'file.write',
248
+ resource: '/data/user_documents/report.txt',
249
+ context: {
250
+ timestamp: Date.now(),
251
+ },
252
+ });
253
+
254
+ console.log('Authorized:', decision.allowed);
255
+ console.log('Reason:', decision.reason);
256
+ }
257
+ */
258
+ //# sourceMappingURL=authorization.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"behavior.d.ts","sourceRoot":"","sources":["../../src/kya/behavior.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAE3E,qBAAa,eAAe;IAId,OAAO,CAAC,MAAM;IAH1B,OAAO,CAAC,QAAQ,CAA+B;IAC/C,OAAO,CAAC,WAAW,CAAsB;gBAErB,MAAM,EAAE,cAAc;IAK1C;;OAEG;IACG,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IA4EhE;;OAEG;IACG,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IA0BpE;;OAEG;IACG,4BAA4B,CAChC,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,YAAY,EAAE,GACxB,OAAO,CAAC,MAAM,CAAC;IAgClB;;OAEG;IACG,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAGvD"}
@@ -0,0 +1,142 @@
1
+ /**
2
+ * KYA Behavior Monitor
3
+ * Real-time anomaly detection + trust scoring
4
+ */
5
+ export class BehaviorMonitor {
6
+ config;
7
+ profiles;
8
+ trustScores;
9
+ constructor(config) {
10
+ this.config = config;
11
+ this.profiles = new Map();
12
+ this.trustScores = new Map();
13
+ }
14
+ /**
15
+ * Detect anomalies in agent behavior
16
+ */
17
+ async detectAnomalies(agentDID) {
18
+ const profile = await this.getBehaviorProfile(agentDID);
19
+ const alerts = [];
20
+ // 1. Rate spike detection
21
+ const zScore = (profile.recentWindow.actionsInLastHour - profile.baseline.actionsPerHour.mean) /
22
+ profile.baseline.actionsPerHour.stddev;
23
+ if (zScore > 3) {
24
+ alerts.push({
25
+ severity: 'high',
26
+ type: 'rate_spike',
27
+ description: `Action rate is ${zScore.toFixed(1)} standard deviations above baseline`,
28
+ evidence: {
29
+ baseline: profile.baseline.actionsPerHour.mean,
30
+ current: profile.recentWindow.actionsInLastHour,
31
+ },
32
+ recommendedAction: 'throttle',
33
+ trustImpact: -50,
34
+ });
35
+ }
36
+ // 2. Success rate drop
37
+ const successDrop = profile.baseline.successRate.mean - profile.recentWindow.successRateLastHour;
38
+ if (successDrop > 0.2) {
39
+ alerts.push({
40
+ severity: 'medium',
41
+ type: 'success_rate_drop',
42
+ description: `Success rate dropped ${(successDrop * 100).toFixed(1)}%`,
43
+ evidence: {
44
+ baseline: profile.baseline.successRate.mean,
45
+ current: profile.recentWindow.successRateLastHour,
46
+ },
47
+ recommendedAction: 'warn',
48
+ trustImpact: -20,
49
+ });
50
+ }
51
+ // 3. New capability usage
52
+ if (profile.recentWindow.newActionsInLastHour.length > 3) {
53
+ alerts.push({
54
+ severity: 'low',
55
+ type: 'new_capabilities',
56
+ description: `Agent using ${profile.recentWindow.newActionsInLastHour.length} new capabilities`,
57
+ evidence: {
58
+ newActions: profile.recentWindow.newActionsInLastHour,
59
+ },
60
+ recommendedAction: 'log',
61
+ trustImpact: -5,
62
+ });
63
+ }
64
+ // 4. Suspicious resource access
65
+ const suspiciousResources = profile.recentWindow.newResourcesInLastHour.filter((r) => r.includes('.env') || r.includes('credentials') || r.includes('secret'));
66
+ if (suspiciousResources.length > 0) {
67
+ alerts.push({
68
+ severity: 'critical',
69
+ type: 'suspicious_resource_access',
70
+ description: 'Agent accessing sensitive resources',
71
+ evidence: {
72
+ resources: suspiciousResources,
73
+ },
74
+ recommendedAction: 'suspend',
75
+ trustImpact: -150,
76
+ });
77
+ }
78
+ return alerts;
79
+ }
80
+ /**
81
+ * Get or create behavior profile for agent
82
+ */
83
+ async getBehaviorProfile(agentDID) {
84
+ if (this.profiles.has(agentDID)) {
85
+ return this.profiles.get(agentDID);
86
+ }
87
+ // Create initial profile
88
+ const profile = {
89
+ agentDID,
90
+ baseline: {
91
+ actionsPerHour: { mean: 10, stddev: 3 },
92
+ successRate: { mean: 0.95, stddev: 0.05 },
93
+ topActions: [],
94
+ topResources: [],
95
+ },
96
+ recentWindow: {
97
+ actionsInLastHour: 0,
98
+ successRateLastHour: 1.0,
99
+ newActionsInLastHour: [],
100
+ newResourcesInLastHour: [],
101
+ },
102
+ };
103
+ this.profiles.set(agentDID, profile);
104
+ return profile;
105
+ }
106
+ /**
107
+ * Update trust score from behavior
108
+ */
109
+ async updateTrustScoreFromBehavior(agentDID, anomalies) {
110
+ const currentScore = this.trustScores.get(agentDID) || 500; // Default: T3
111
+ // Apply trust impact from anomalies
112
+ const totalImpact = anomalies.reduce((sum, alert) => sum + alert.trustImpact, 0);
113
+ // Update trust score
114
+ const newScore = Math.max(0, Math.min(1000, currentScore + totalImpact));
115
+ this.trustScores.set(agentDID, newScore);
116
+ // Take recommended actions
117
+ for (const alert of anomalies) {
118
+ switch (alert.recommendedAction) {
119
+ case 'suspend':
120
+ console.warn(`SUSPEND agent ${agentDID}:`, alert.description);
121
+ break;
122
+ case 'throttle':
123
+ console.warn(`THROTTLE agent ${agentDID}:`, alert.description);
124
+ break;
125
+ case 'warn':
126
+ console.warn(`WARNING for agent ${agentDID}:`, alert.description);
127
+ break;
128
+ case 'log':
129
+ console.log(`LOG for agent ${agentDID}:`, alert.description);
130
+ break;
131
+ }
132
+ }
133
+ return newScore;
134
+ }
135
+ /**
136
+ * Get current trust score
137
+ */
138
+ async getTrustScore(agentDID) {
139
+ return this.trustScores.get(agentDID) || 500;
140
+ }
141
+ }
142
+ //# sourceMappingURL=behavior.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"identity.d.ts","sourceRoot":"","sources":["../../src/kya/identity.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EACL,WAAW,EACX,iBAAiB,EACjB,aAAa,EAEd,MAAM,YAAY,CAAC;AAEpB,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAW;IAC3B,OAAO,CAAC,KAAK,CAA2B;gBAE5B,MAAM,EAAE,iBAAiB;IAYrC;;OAEG;IACG,MAAM,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC;IAmCpD;;OAEG;IACG,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAqBnD;;;OAGG;YACW,gBAAgB;IAgD9B;;OAEG;IACH,iBAAiB,IAAI,MAAM;IAM3B;;OAEG;IACG,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC;IAc/E,OAAO,CAAC,UAAU;IAQlB,OAAO,CAAC,UAAU;IAMlB,OAAO,CAAC,gBAAgB;CAQzB"}
@@ -0,0 +1,187 @@
1
+ /**
2
+ * KYA Identity Verification
3
+ * W3C DID resolution + Ed25519 signature verification
4
+ */
5
+ import * as ed from '@noble/ed25519';
6
+ import { Resolver } from 'did-resolver';
7
+ export class IdentityVerifier {
8
+ resolver;
9
+ cache;
10
+ constructor(config) {
11
+ // Initialize DID resolver (would integrate with did-resolver library)
12
+ this.resolver = new Resolver({
13
+ // Custom resolver for did:vorion:
14
+ vorion: async (did) => {
15
+ return this.resolveVorionDID(did);
16
+ },
17
+ });
18
+ this.cache = new Map();
19
+ }
20
+ /**
21
+ * Verify agent identity using DID + signature
22
+ */
23
+ async verify(proof) {
24
+ try {
25
+ // 1. Resolve DID document
26
+ const didDoc = await this.resolveDID(proof.did);
27
+ // 2. Extract verification method
28
+ const verificationMethod = didDoc.verificationMethod?.find((vm) => vm.type === 'Ed25519VerificationKey2020');
29
+ if (!verificationMethod) {
30
+ throw new Error('No Ed25519 verification method found');
31
+ }
32
+ // 3. Verify signature
33
+ const message = `${proof.challenge}:${proof.timestamp}`;
34
+ const messageBytes = new TextEncoder().encode(message);
35
+ const signatureBytes = this.hexToBytes(proof.signature);
36
+ const publicKeyBytes = this.multibaseToBytes(verificationMethod.publicKeyMultibase);
37
+ const isValid = await ed.verify(signatureBytes, messageBytes, publicKeyBytes);
38
+ // 4. Check timestamp freshness (prevent replay attacks)
39
+ const age = Date.now() - proof.timestamp;
40
+ if (age > 60000) { // 1 minute max
41
+ throw new Error('Proof too old (replay attack prevention)');
42
+ }
43
+ return isValid;
44
+ }
45
+ catch (error) {
46
+ console.error('Identity verification failed:', error);
47
+ return false;
48
+ }
49
+ }
50
+ /**
51
+ * Resolve DID to DID Document
52
+ */
53
+ async resolveDID(did) {
54
+ // Check cache first
55
+ if (this.cache.has(did)) {
56
+ return this.cache.get(did);
57
+ }
58
+ // Resolve from network
59
+ const result = await this.resolver.resolve(did);
60
+ if (!result.didDocument) {
61
+ throw new Error(`Failed to resolve DID: ${did}`);
62
+ }
63
+ const didDoc = result.didDocument;
64
+ // Cache for future lookups
65
+ this.cache.set(did, didDoc);
66
+ return didDoc;
67
+ }
68
+ /**
69
+ * Custom Vorion DID resolver
70
+ * Format: did:vorion:<method>:<identifier>
71
+ */
72
+ async resolveVorionDID(did) {
73
+ // Parse DID
74
+ const parts = did.split(':');
75
+ if (parts.length < 4) {
76
+ throw new Error('Invalid Vorion DID format');
77
+ }
78
+ const method = parts[2]; // e.g., 'ed25519'
79
+ const identifier = parts[3]; // e.g., '5Z8K3q2YvU8pVzNxF9sT7bQw6JhR1XmDcL4nVk'
80
+ // Fetch from Vorion DID registry (would be actual API call)
81
+ // For now, return mock structure
82
+ return {
83
+ didDocument: {
84
+ '@context': [
85
+ 'https://www.w3.org/ns/did/v1',
86
+ 'https://vorion.org/ns/kya/v1',
87
+ ],
88
+ id: did,
89
+ controller: did,
90
+ verificationMethod: [
91
+ {
92
+ id: `${did}#keys-1`,
93
+ type: 'Ed25519VerificationKey2020',
94
+ controller: did,
95
+ publicKeyMultibase: `z${identifier}`,
96
+ },
97
+ ],
98
+ authentication: [`${did}#keys-1`],
99
+ assertionMethod: [`${did}#keys-1`],
100
+ service: [
101
+ {
102
+ id: `${did}#agentcard`,
103
+ type: 'AgentCard',
104
+ serviceEndpoint: `https://agentanchorai.com/cards/${identifier}`,
105
+ },
106
+ ],
107
+ kya: {
108
+ trustScore: 0,
109
+ tier: 'T0',
110
+ certified: false,
111
+ capabilities: [],
112
+ restrictions: [],
113
+ },
114
+ },
115
+ };
116
+ }
117
+ /**
118
+ * Generate challenge for identity proof
119
+ */
120
+ generateChallenge() {
121
+ const bytes = new Uint8Array(32);
122
+ crypto.getRandomValues(bytes);
123
+ return this.bytesToHex(bytes);
124
+ }
125
+ /**
126
+ * Sign challenge with private key (for agents to use)
127
+ */
128
+ async signChallenge(challenge, privateKey) {
129
+ const timestamp = Date.now();
130
+ const message = `${challenge}:${timestamp}`;
131
+ const messageBytes = new TextEncoder().encode(message);
132
+ const signature = await ed.sign(messageBytes, privateKey);
133
+ return this.bytesToHex(signature);
134
+ }
135
+ // ============================================================================
136
+ // Utility Methods
137
+ // ============================================================================
138
+ hexToBytes(hex) {
139
+ const bytes = new Uint8Array(hex.length / 2);
140
+ for (let i = 0; i < hex.length; i += 2) {
141
+ bytes[i / 2] = parseInt(hex.substr(i, 2), 16);
142
+ }
143
+ return bytes;
144
+ }
145
+ bytesToHex(bytes) {
146
+ return Array.from(bytes)
147
+ .map(b => b.toString(16).padStart(2, '0'))
148
+ .join('');
149
+ }
150
+ multibaseToBytes(multibase) {
151
+ // Remove 'z' prefix (base58btc encoding)
152
+ const base58 = multibase.substring(1);
153
+ // Decode base58 (simplified, would use actual base58 library)
154
+ // For now, assume hex encoding
155
+ return this.hexToBytes(base58);
156
+ }
157
+ }
158
+ // ============================================================================
159
+ // Example Usage
160
+ // ============================================================================
161
+ /*
162
+ import { IdentityVerifier } from './identity';
163
+
164
+ async function example() {
165
+ const verifier = new IdentityVerifier({
166
+ networks: ['vorion', 'ethereum'],
167
+ cacheEnabled: true,
168
+ });
169
+
170
+ // Agent generates proof
171
+ const challenge = verifier.generateChallenge();
172
+ const privateKey = ed.utils.randomPrivateKey();
173
+ const signature = await verifier.signChallenge(challenge, privateKey);
174
+
175
+ // Verify identity
176
+ const isValid = await verifier.verify({
177
+ did: 'did:vorion:ed25519:5Z8K3q2YvU8pVzNxF9sT7bQw6JhR1XmDcL4nVk',
178
+ timestamp: Date.now(),
179
+ challenge,
180
+ signature,
181
+ publicKey: ed.utils.bytesToHex(await ed.getPublicKey(privateKey)),
182
+ });
183
+
184
+ console.log('Identity valid:', isValid);
185
+ }
186
+ */
187
+ //# sourceMappingURL=identity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/kya/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,cAAc,eAAe,CAAC;AAC9B,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,eAAe,CAAC;AAC9B,cAAc,YAAY,CAAC;AAE3B,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,SAAS,EAAgB,MAAM,YAAY,CAAC;AAErD;;GAEG;AACH,qBAAa,GAAG;IACP,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,aAAa,EAAE,oBAAoB,CAAC;IACpC,cAAc,EAAE,mBAAmB,CAAC;IACpC,QAAQ,EAAE,eAAe,CAAC;gBAErB,MAAM,EAAE,SAAS;IAO7B;;;;;;OAMG;IACG,WAAW,CAAC,MAAM,EAAE;QACxB,QAAQ,EAAE,MAAM,CAAC;QACjB,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,EAAE,MAAM,CAAC;QACjB,KAAK,EAAE;YACL,SAAS,EAAE,MAAM,CAAC;YAClB,SAAS,EAAE,MAAM,CAAC;YAClB,SAAS,EAAE,MAAM,CAAC;SACnB,CAAC;KACH,GAAG,OAAO,CAAC;QACV,OAAO,EAAE,OAAO,CAAC;QACjB,MAAM,EAAE,MAAM,CAAC;QACf,UAAU,EAAE,MAAM,CAAC;QACnB,SAAS,EAAE,MAAM,EAAE,CAAC;KACrB,CAAC;IAiEF,OAAO,CAAC,UAAU;CAGnB"}
@@ -0,0 +1,99 @@
1
+ /**
2
+ * KYA (Know Your Agent) Framework SDK
3
+ *
4
+ * TypeScript SDK for KYA framework integration
5
+ * Part of BASIS (Blockchain Agent Standard for Identity and Security)
6
+ */
7
+ export * from './identity.js';
8
+ export * from './authorization.js';
9
+ export * from './accountability.js';
10
+ export * from './behavior.js';
11
+ export * from './types.js';
12
+ import { IdentityVerifier } from './identity.js';
13
+ import { AuthorizationManager } from './authorization.js';
14
+ import { AccountabilityChain } from './accountability.js';
15
+ import { BehaviorMonitor } from './behavior.js';
16
+ /**
17
+ * Main KYA Framework SDK
18
+ */
19
+ export class KYA {
20
+ identity;
21
+ authorization;
22
+ accountability;
23
+ behavior;
24
+ constructor(config) {
25
+ this.identity = new IdentityVerifier(config.didResolver);
26
+ this.authorization = new AuthorizationManager(config.policyEngine);
27
+ this.accountability = new AccountabilityChain(config.database);
28
+ this.behavior = new BehaviorMonitor(config.database);
29
+ }
30
+ /**
31
+ * Complete agent verification flow
32
+ * 1. Verify identity (DID + signature)
33
+ * 2. Check authorization (capabilities + policies)
34
+ * 3. Log to accountability chain
35
+ * 4. Monitor behavior for anomalies
36
+ */
37
+ async verifyAgent(params) {
38
+ // 1. Identity verification
39
+ const identityValid = await this.identity.verify({
40
+ did: params.agentDID,
41
+ challenge: params.proof.challenge,
42
+ signature: params.proof.signature,
43
+ timestamp: params.proof.timestamp,
44
+ publicKey: '', // Will be resolved from DID
45
+ });
46
+ if (!identityValid) {
47
+ return {
48
+ allowed: false,
49
+ reason: 'Identity verification failed',
50
+ trustScore: 0,
51
+ anomalies: [],
52
+ };
53
+ }
54
+ // 2. Authorization check
55
+ const authDecision = await this.authorization.authorize({
56
+ agentDID: params.agentDID,
57
+ action: params.action,
58
+ resource: params.resource,
59
+ context: {
60
+ timestamp: Date.now(),
61
+ },
62
+ });
63
+ if (!authDecision.allowed) {
64
+ return {
65
+ allowed: false,
66
+ reason: authDecision.reason,
67
+ trustScore: 0,
68
+ anomalies: [],
69
+ };
70
+ }
71
+ // 3. Behavior monitoring (detect anomalies)
72
+ const anomalies = await this.behavior.detectAnomalies(params.agentDID);
73
+ // 4. Log to accountability chain
74
+ await this.accountability.append({
75
+ id: this.generateId(),
76
+ timestamp: Date.now(),
77
+ agentDID: params.agentDID,
78
+ action: params.action,
79
+ resource: params.resource,
80
+ outcome: 'success',
81
+ evidence: {
82
+ intentHash: '',
83
+ authorizationDecision: authDecision,
84
+ },
85
+ signature: params.proof.signature,
86
+ chainLink: { prevHash: null },
87
+ });
88
+ return {
89
+ allowed: true,
90
+ reason: 'Verified and authorized',
91
+ trustScore: await this.behavior.getTrustScore(params.agentDID),
92
+ anomalies: anomalies.map((a) => a.type),
93
+ };
94
+ }
95
+ generateId() {
96
+ return `kya_${Date.now()}_${Math.random().toString(36).substring(2, 15)}`;
97
+ }
98
+ }
99
+ //# sourceMappingURL=index.js.map