@vess-id/vess 0.2.0-alpha.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 (280) hide show
  1. package/LICENSE +64 -0
  2. package/README.md +223 -0
  3. package/bin/vess.js +2 -0
  4. package/dist/__mocks__/@napi-rs/keyring.d.ts +9 -0
  5. package/dist/__mocks__/@napi-rs/keyring.d.ts.map +1 -0
  6. package/dist/__mocks__/@napi-rs/keyring.js +33 -0
  7. package/dist/__mocks__/@napi-rs/keyring.js.map +1 -0
  8. package/dist/__mocks__/node-mac-auth.d.ts +8 -0
  9. package/dist/__mocks__/node-mac-auth.d.ts.map +1 -0
  10. package/dist/__mocks__/node-mac-auth.js +29 -0
  11. package/dist/__mocks__/node-mac-auth.js.map +1 -0
  12. package/dist/adapter/mcp/http-transport.d.ts +34 -0
  13. package/dist/adapter/mcp/http-transport.d.ts.map +1 -0
  14. package/dist/adapter/mcp/http-transport.js +158 -0
  15. package/dist/adapter/mcp/http-transport.js.map +1 -0
  16. package/dist/adapter/mcp/mcp-adapter.d.ts +37 -0
  17. package/dist/adapter/mcp/mcp-adapter.d.ts.map +1 -0
  18. package/dist/adapter/mcp/mcp-adapter.js +48 -0
  19. package/dist/adapter/mcp/mcp-adapter.js.map +1 -0
  20. package/dist/adapter/mcp/mcp-server.factory.d.ts +35 -0
  21. package/dist/adapter/mcp/mcp-server.factory.d.ts.map +1 -0
  22. package/dist/adapter/mcp/mcp-server.factory.js +114 -0
  23. package/dist/adapter/mcp/mcp-server.factory.js.map +1 -0
  24. package/dist/adapter/mcp/stdio-transport.d.ts +7 -0
  25. package/dist/adapter/mcp/stdio-transport.d.ts.map +1 -0
  26. package/dist/adapter/mcp/stdio-transport.js +13 -0
  27. package/dist/adapter/mcp/stdio-transport.js.map +1 -0
  28. package/dist/adapter/mcp/transport.d.ts +10 -0
  29. package/dist/adapter/mcp/transport.d.ts.map +1 -0
  30. package/dist/adapter/mcp/transport.js +14 -0
  31. package/dist/adapter/mcp/transport.js.map +1 -0
  32. package/dist/approval/approval-token.d.ts +23 -0
  33. package/dist/approval/approval-token.d.ts.map +1 -0
  34. package/dist/approval/approval-token.js +81 -0
  35. package/dist/approval/approval-token.js.map +1 -0
  36. package/dist/audit/audit-dto-mapper.d.ts +29 -0
  37. package/dist/audit/audit-dto-mapper.d.ts.map +1 -0
  38. package/dist/audit/audit-dto-mapper.js +61 -0
  39. package/dist/audit/audit-dto-mapper.js.map +1 -0
  40. package/dist/audit/audit-logger.d.ts +35 -0
  41. package/dist/audit/audit-logger.d.ts.map +1 -0
  42. package/dist/audit/audit-logger.js +67 -0
  43. package/dist/audit/audit-logger.js.map +1 -0
  44. package/dist/audit/audit-sync.d.ts +12 -0
  45. package/dist/audit/audit-sync.d.ts.map +1 -0
  46. package/dist/audit/audit-sync.js +65 -0
  47. package/dist/audit/audit-sync.js.map +1 -0
  48. package/dist/auth/user-authenticator.d.ts +51 -0
  49. package/dist/auth/user-authenticator.d.ts.map +1 -0
  50. package/dist/auth/user-authenticator.js +155 -0
  51. package/dist/auth/user-authenticator.js.map +1 -0
  52. package/dist/cli/cli-db.d.ts +12 -0
  53. package/dist/cli/cli-db.d.ts.map +1 -0
  54. package/dist/cli/cli-db.js +20 -0
  55. package/dist/cli/cli-db.js.map +1 -0
  56. package/dist/cli/cli-utils.d.ts +14 -0
  57. package/dist/cli/cli-utils.d.ts.map +1 -0
  58. package/dist/cli/cli-utils.js +57 -0
  59. package/dist/cli/cli-utils.js.map +1 -0
  60. package/dist/cli/daemon-utils.d.ts +30 -0
  61. package/dist/cli/daemon-utils.d.ts.map +1 -0
  62. package/dist/cli/daemon-utils.js +131 -0
  63. package/dist/cli/daemon-utils.js.map +1 -0
  64. package/dist/cli/daemon.d.ts +13 -0
  65. package/dist/cli/daemon.d.ts.map +1 -0
  66. package/dist/cli/daemon.js +207 -0
  67. package/dist/cli/daemon.js.map +1 -0
  68. package/dist/cli/doctor.d.ts +2 -0
  69. package/dist/cli/doctor.d.ts.map +1 -0
  70. package/dist/cli/doctor.js +135 -0
  71. package/dist/cli/doctor.js.map +1 -0
  72. package/dist/cli/env-delete.d.ts +6 -0
  73. package/dist/cli/env-delete.d.ts.map +1 -0
  74. package/dist/cli/env-delete.js +80 -0
  75. package/dist/cli/env-delete.js.map +1 -0
  76. package/dist/cli/env-list.d.ts +5 -0
  77. package/dist/cli/env-list.d.ts.map +1 -0
  78. package/dist/cli/env-list.js +42 -0
  79. package/dist/cli/env-list.js.map +1 -0
  80. package/dist/cli/env-post-integration.d.ts +21 -0
  81. package/dist/cli/env-post-integration.d.ts.map +1 -0
  82. package/dist/cli/env-post-integration.js +300 -0
  83. package/dist/cli/env-post-integration.js.map +1 -0
  84. package/dist/cli/env-restore.d.ts +15 -0
  85. package/dist/cli/env-restore.d.ts.map +1 -0
  86. package/dist/cli/env-restore.js +130 -0
  87. package/dist/cli/env-restore.js.map +1 -0
  88. package/dist/cli/env.d.ts +14 -0
  89. package/dist/cli/env.d.ts.map +1 -0
  90. package/dist/cli/env.js +182 -0
  91. package/dist/cli/env.js.map +1 -0
  92. package/dist/cli/error-handlers.d.ts +13 -0
  93. package/dist/cli/error-handlers.d.ts.map +1 -0
  94. package/dist/cli/error-handlers.js +32 -0
  95. package/dist/cli/error-handlers.js.map +1 -0
  96. package/dist/cli/hook-check-env.d.ts +12 -0
  97. package/dist/cli/hook-check-env.d.ts.map +1 -0
  98. package/dist/cli/hook-check-env.js +117 -0
  99. package/dist/cli/hook-check-env.js.map +1 -0
  100. package/dist/cli/index.d.ts +2 -0
  101. package/dist/cli/index.d.ts.map +1 -0
  102. package/dist/cli/index.js +294 -0
  103. package/dist/cli/index.js.map +1 -0
  104. package/dist/cli/init-guard.d.ts +13 -0
  105. package/dist/cli/init-guard.d.ts.map +1 -0
  106. package/dist/cli/init-guard.js +62 -0
  107. package/dist/cli/init-guard.js.map +1 -0
  108. package/dist/cli/init.d.ts +19 -0
  109. package/dist/cli/init.d.ts.map +1 -0
  110. package/dist/cli/init.js +440 -0
  111. package/dist/cli/init.js.map +1 -0
  112. package/dist/cli/install.d.ts +14 -0
  113. package/dist/cli/install.d.ts.map +1 -0
  114. package/dist/cli/install.js +186 -0
  115. package/dist/cli/install.js.map +1 -0
  116. package/dist/cli/login.d.ts +6 -0
  117. package/dist/cli/login.d.ts.map +1 -0
  118. package/dist/cli/login.js +76 -0
  119. package/dist/cli/login.js.map +1 -0
  120. package/dist/cli/logs.d.ts +32 -0
  121. package/dist/cli/logs.d.ts.map +1 -0
  122. package/dist/cli/logs.js +147 -0
  123. package/dist/cli/logs.js.map +1 -0
  124. package/dist/cli/project.d.ts +8 -0
  125. package/dist/cli/project.d.ts.map +1 -0
  126. package/dist/cli/project.js +102 -0
  127. package/dist/cli/project.js.map +1 -0
  128. package/dist/cli/reset.d.ts +8 -0
  129. package/dist/cli/reset.d.ts.map +1 -0
  130. package/dist/cli/reset.js +137 -0
  131. package/dist/cli/reset.js.map +1 -0
  132. package/dist/cli/run.d.ts +22 -0
  133. package/dist/cli/run.d.ts.map +1 -0
  134. package/dist/cli/run.js +103 -0
  135. package/dist/cli/run.js.map +1 -0
  136. package/dist/cli/start.d.ts +2 -0
  137. package/dist/cli/start.d.ts.map +1 -0
  138. package/dist/cli/start.js +29 -0
  139. package/dist/cli/start.js.map +1 -0
  140. package/dist/cli/status.d.ts +12 -0
  141. package/dist/cli/status.d.ts.map +1 -0
  142. package/dist/cli/status.js +131 -0
  143. package/dist/cli/status.js.map +1 -0
  144. package/dist/cli/uninstall.d.ts +8 -0
  145. package/dist/cli/uninstall.d.ts.map +1 -0
  146. package/dist/cli/uninstall.js +111 -0
  147. package/dist/cli/uninstall.js.map +1 -0
  148. package/dist/config/config.d.ts +10 -0
  149. package/dist/config/config.d.ts.map +1 -0
  150. package/dist/config/config.js +64 -0
  151. package/dist/config/config.js.map +1 -0
  152. package/dist/config/constants.d.ts +3 -0
  153. package/dist/config/constants.d.ts.map +1 -0
  154. package/dist/config/constants.js +6 -0
  155. package/dist/config/constants.js.map +1 -0
  156. package/dist/config/paths.d.ts +9 -0
  157. package/dist/config/paths.d.ts.map +1 -0
  158. package/dist/config/paths.js +58 -0
  159. package/dist/config/paths.js.map +1 -0
  160. package/dist/core/execution-engine.d.ts +119 -0
  161. package/dist/core/execution-engine.d.ts.map +1 -0
  162. package/dist/core/execution-engine.js +1291 -0
  163. package/dist/core/execution-engine.js.map +1 -0
  164. package/dist/core/runtime.d.ts +43 -0
  165. package/dist/core/runtime.d.ts.map +1 -0
  166. package/dist/core/runtime.js +143 -0
  167. package/dist/core/runtime.js.map +1 -0
  168. package/dist/core/sync-scheduler.d.ts +42 -0
  169. package/dist/core/sync-scheduler.d.ts.map +1 -0
  170. package/dist/core/sync-scheduler.js +131 -0
  171. package/dist/core/sync-scheduler.js.map +1 -0
  172. package/dist/core/types.d.ts +77 -0
  173. package/dist/core/types.d.ts.map +1 -0
  174. package/dist/core/types.js +7 -0
  175. package/dist/core/types.js.map +1 -0
  176. package/dist/daemon/service-manager.d.ts +68 -0
  177. package/dist/daemon/service-manager.d.ts.map +1 -0
  178. package/dist/daemon/service-manager.js +303 -0
  179. package/dist/daemon/service-manager.js.map +1 -0
  180. package/dist/env/env-classifier.d.ts +14 -0
  181. package/dist/env/env-classifier.d.ts.map +1 -0
  182. package/dist/env/env-classifier.js +94 -0
  183. package/dist/env/env-classifier.js.map +1 -0
  184. package/dist/env/env-parser.d.ts +13 -0
  185. package/dist/env/env-parser.d.ts.map +1 -0
  186. package/dist/env/env-parser.js +33 -0
  187. package/dist/env/env-parser.js.map +1 -0
  188. package/dist/env/env-profile-store.d.ts +15 -0
  189. package/dist/env/env-profile-store.d.ts.map +1 -0
  190. package/dist/env/env-profile-store.js +35 -0
  191. package/dist/env/env-profile-store.js.map +1 -0
  192. package/dist/env/env-reference.d.ts +10 -0
  193. package/dist/env/env-reference.d.ts.map +1 -0
  194. package/dist/env/env-reference.js +33 -0
  195. package/dist/env/env-reference.js.map +1 -0
  196. package/dist/env/env-resolver.d.ts +18 -0
  197. package/dist/env/env-resolver.d.ts.map +1 -0
  198. package/dist/env/env-resolver.js +48 -0
  199. package/dist/env/env-resolver.js.map +1 -0
  200. package/dist/env/fs-utils.d.ts +9 -0
  201. package/dist/env/fs-utils.d.ts.map +1 -0
  202. package/dist/env/fs-utils.js +59 -0
  203. package/dist/env/fs-utils.js.map +1 -0
  204. package/dist/env/secret-backend.d.ts +15 -0
  205. package/dist/env/secret-backend.d.ts.map +1 -0
  206. package/dist/env/secret-backend.js +24 -0
  207. package/dist/env/secret-backend.js.map +1 -0
  208. package/dist/executor/executor-registry.d.ts +22 -0
  209. package/dist/executor/executor-registry.d.ts.map +1 -0
  210. package/dist/executor/executor-registry.js +42 -0
  211. package/dist/executor/executor-registry.js.map +1 -0
  212. package/dist/executor/process-launcher.d.ts +26 -0
  213. package/dist/executor/process-launcher.d.ts.map +1 -0
  214. package/dist/executor/process-launcher.js +98 -0
  215. package/dist/executor/process-launcher.js.map +1 -0
  216. package/dist/executor/secret-file.d.ts +28 -0
  217. package/dist/executor/secret-file.d.ts.map +1 -0
  218. package/dist/executor/secret-file.js +127 -0
  219. package/dist/executor/secret-file.js.map +1 -0
  220. package/dist/gateway/auth.d.ts +26 -0
  221. package/dist/gateway/auth.d.ts.map +1 -0
  222. package/dist/gateway/auth.js +66 -0
  223. package/dist/gateway/auth.js.map +1 -0
  224. package/dist/gateway/gateway-client.d.ts +298 -0
  225. package/dist/gateway/gateway-client.d.ts.map +1 -0
  226. package/dist/gateway/gateway-client.js +501 -0
  227. package/dist/gateway/gateway-client.js.map +1 -0
  228. package/dist/identity/agent-identity.d.ts +29 -0
  229. package/dist/identity/agent-identity.d.ts.map +1 -0
  230. package/dist/identity/agent-identity.js +54 -0
  231. package/dist/identity/agent-identity.js.map +1 -0
  232. package/dist/identity/did-manager.d.ts +17 -0
  233. package/dist/identity/did-manager.d.ts.map +1 -0
  234. package/dist/identity/did-manager.js +29 -0
  235. package/dist/identity/did-manager.js.map +1 -0
  236. package/dist/identity/key-manager.d.ts +18 -0
  237. package/dist/identity/key-manager.d.ts.map +1 -0
  238. package/dist/identity/key-manager.js +101 -0
  239. package/dist/identity/key-manager.js.map +1 -0
  240. package/dist/identity/session-key.d.ts +13 -0
  241. package/dist/identity/session-key.d.ts.map +1 -0
  242. package/dist/identity/session-key.js +17 -0
  243. package/dist/identity/session-key.js.map +1 -0
  244. package/dist/policy/policy-evaluator.d.ts +63 -0
  245. package/dist/policy/policy-evaluator.d.ts.map +1 -0
  246. package/dist/policy/policy-evaluator.js +266 -0
  247. package/dist/policy/policy-evaluator.js.map +1 -0
  248. package/dist/policy/policy-loader.d.ts +10 -0
  249. package/dist/policy/policy-loader.d.ts.map +1 -0
  250. package/dist/policy/policy-loader.js +71 -0
  251. package/dist/policy/policy-loader.js.map +1 -0
  252. package/dist/policy/types.d.ts +21 -0
  253. package/dist/policy/types.d.ts.map +1 -0
  254. package/dist/policy/types.js +3 -0
  255. package/dist/policy/types.js.map +1 -0
  256. package/dist/utils/credential-errors.d.ts +3 -0
  257. package/dist/utils/credential-errors.d.ts.map +1 -0
  258. package/dist/utils/credential-errors.js +23 -0
  259. package/dist/utils/credential-errors.js.map +1 -0
  260. package/dist/utils/resource-canonicalizer.d.ts +19 -0
  261. package/dist/utils/resource-canonicalizer.d.ts.map +1 -0
  262. package/dist/utils/resource-canonicalizer.js +100 -0
  263. package/dist/utils/resource-canonicalizer.js.map +1 -0
  264. package/dist/utils/vc-utils.d.ts +23 -0
  265. package/dist/utils/vc-utils.d.ts.map +1 -0
  266. package/dist/utils/vc-utils.js +53 -0
  267. package/dist/utils/vc-utils.js.map +1 -0
  268. package/dist/wallet/sqlite.d.ts +4 -0
  269. package/dist/wallet/sqlite.d.ts.map +1 -0
  270. package/dist/wallet/sqlite.js +158 -0
  271. package/dist/wallet/sqlite.js.map +1 -0
  272. package/dist/wallet/vp-builder.d.ts +18 -0
  273. package/dist/wallet/vp-builder.d.ts.map +1 -0
  274. package/dist/wallet/vp-builder.js +46 -0
  275. package/dist/wallet/vp-builder.js.map +1 -0
  276. package/dist/wallet/wallet.d.ts +58 -0
  277. package/dist/wallet/wallet.d.ts.map +1 -0
  278. package/dist/wallet/wallet.js +170 -0
  279. package/dist/wallet/wallet.js.map +1 -0
  280. package/package.json +80 -0
@@ -0,0 +1,21 @@
1
+ import { PermissionRule } from '@vess-id/ai-identity';
2
+ export type PolicySource = 'org' | 'user' | 'system';
3
+ /**
4
+ * Local policy rule — extends PermissionRule with deny support.
5
+ * SDK PermissionRule is 'allow'-only because VCs only express positive permissions.
6
+ * Local policy needs 'deny' to block actions before they reach the Gateway.
7
+ */
8
+ export interface LocalPolicyRule extends Omit<PermissionRule, 'effect'> {
9
+ effect: 'allow' | 'deny';
10
+ source?: PolicySource;
11
+ }
12
+ export interface LocalPolicy {
13
+ v: string;
14
+ rules: LocalPolicyRule[];
15
+ }
16
+ export interface PolicyEvaluationResult {
17
+ allowed: boolean;
18
+ reason?: string;
19
+ matchedRule?: LocalPolicyRule;
20
+ }
21
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/policy/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAsB,MAAM,sBAAsB,CAAA;AAEzE,MAAM,MAAM,YAAY,GAAG,KAAK,GAAG,MAAM,GAAG,QAAQ,CAAA;AAEpD;;;;GAIG;AACH,MAAM,WAAW,eAAgB,SAAQ,IAAI,CAAC,cAAc,EAAE,QAAQ,CAAC;IACrE,MAAM,EAAE,OAAO,GAAG,MAAM,CAAA;IACxB,MAAM,CAAC,EAAE,YAAY,CAAA;CACtB;AAED,MAAM,WAAW,WAAW;IAC1B,CAAC,EAAE,MAAM,CAAA;IACT,KAAK,EAAE,eAAe,EAAE,CAAA;CACzB;AAED,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,OAAO,CAAA;IAChB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,WAAW,CAAC,EAAE,eAAe,CAAA;CAC9B"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/policy/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,3 @@
1
+ /** Check if an error message indicates an invalid credential (expired, revoked, etc.) */
2
+ export declare function isCredentialInvalidError(message?: string): boolean;
3
+ //# sourceMappingURL=credential-errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credential-errors.d.ts","sourceRoot":"","sources":["../../src/utils/credential-errors.ts"],"names":[],"mappings":"AAcA,yFAAyF;AACzF,wBAAgB,wBAAwB,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAGlE"}
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isCredentialInvalidError = isCredentialInvalidError;
4
+ /**
5
+ * Patterns that indicate a credential/VP is invalid (expired, revoked, malformed).
6
+ * Shared between gateway-client (HTTP response detection) and execution-engine (error classification).
7
+ */
8
+ const CREDENTIAL_ERROR_PATTERNS = [
9
+ /VP verification failed/i,
10
+ /SD-JWT.*verification failed/i,
11
+ /JWT is expired/i,
12
+ /VC has expired/i,
13
+ /credential is not valid/i,
14
+ /credential.*expired/i,
15
+ /Authentication failed/i,
16
+ ];
17
+ /** Check if an error message indicates an invalid credential (expired, revoked, etc.) */
18
+ function isCredentialInvalidError(message) {
19
+ if (!message)
20
+ return false;
21
+ return CREDENTIAL_ERROR_PATTERNS.some(pattern => pattern.test(message));
22
+ }
23
+ //# sourceMappingURL=credential-errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credential-errors.js","sourceRoot":"","sources":["../../src/utils/credential-errors.ts"],"names":[],"mappings":";;AAeA,4DAGC;AAlBD;;;GAGG;AACH,MAAM,yBAAyB,GAAa;IAC1C,yBAAyB;IACzB,8BAA8B;IAC9B,iBAAiB;IACjB,iBAAiB;IACjB,0BAA0B;IAC1B,sBAAsB;IACtB,wBAAwB;CACzB,CAAA;AAED,yFAAyF;AACzF,SAAgB,wBAAwB,CAAC,OAAgB;IACvD,IAAI,CAAC,OAAO;QAAE,OAAO,KAAK,CAAA;IAC1B,OAAO,yBAAyB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAA;AACzE,CAAC"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Canonicalize a file path for resource identity (spec §8.3).
3
+ *
4
+ * Steps:
5
+ * 1. Expand ~ to home directory
6
+ * 2. Convert to absolute path
7
+ * 3. Normalize . and ..
8
+ * 4. Resolve symlinks (realpath) if file exists
9
+ * 5. Normalize case (macOS is case-insensitive)
10
+ */
11
+ export declare function canonicalizePath(filePath: string): string;
12
+ /**
13
+ * Compute a fingerprint for a resource (spec §8.3).
14
+ *
15
+ * Fingerprint = sha256(canonical_path + device_id + inode)
16
+ * device_id = Root DID (cryptographically bound to device)
17
+ */
18
+ export declare function computeFingerprint(canonicalPath: string, deviceId: string): string;
19
+ //# sourceMappingURL=resource-canonicalizer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resource-canonicalizer.d.ts","sourceRoot":"","sources":["../../src/utils/resource-canonicalizer.ts"],"names":[],"mappings":"AAKA;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAiCzD;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAChC,aAAa,EAAE,MAAM,EACrB,QAAQ,EAAE,MAAM,GACf,MAAM,CAYR"}
@@ -0,0 +1,100 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.canonicalizePath = canonicalizePath;
37
+ exports.computeFingerprint = computeFingerprint;
38
+ const path = __importStar(require("path"));
39
+ const os = __importStar(require("os"));
40
+ const fs = __importStar(require("fs"));
41
+ const crypto_1 = require("crypto");
42
+ /**
43
+ * Canonicalize a file path for resource identity (spec §8.3).
44
+ *
45
+ * Steps:
46
+ * 1. Expand ~ to home directory
47
+ * 2. Convert to absolute path
48
+ * 3. Normalize . and ..
49
+ * 4. Resolve symlinks (realpath) if file exists
50
+ * 5. Normalize case (macOS is case-insensitive)
51
+ */
52
+ function canonicalizePath(filePath) {
53
+ let resolved = filePath;
54
+ // 1. Expand ~
55
+ if (resolved.startsWith('~/') || resolved === '~') {
56
+ resolved = path.join(os.homedir(), resolved.slice(1));
57
+ }
58
+ // 2. Convert to absolute
59
+ if (!path.isAbsolute(resolved)) {
60
+ resolved = path.resolve(resolved);
61
+ }
62
+ // 3. Normalize . and ..
63
+ resolved = path.normalize(resolved);
64
+ // 4. Resolve symlinks if file exists
65
+ try {
66
+ resolved = fs.realpathSync(resolved);
67
+ }
68
+ catch {
69
+ // File doesn't exist yet, use normalized path
70
+ }
71
+ // 5. Case normalization (macOS is case-insensitive)
72
+ // NOTE: Fingerprints generated on macOS (lowercased) will differ from Linux
73
+ // (case-preserved) for the same file. This is by design since fingerprints
74
+ // are device-bound (via Root DID), but cross-platform migration would
75
+ // require re-canonicalization.
76
+ if (process.platform === 'darwin') {
77
+ resolved = resolved.toLowerCase();
78
+ }
79
+ return resolved;
80
+ }
81
+ /**
82
+ * Compute a fingerprint for a resource (spec §8.3).
83
+ *
84
+ * Fingerprint = sha256(canonical_path + device_id + inode)
85
+ * device_id = Root DID (cryptographically bound to device)
86
+ */
87
+ function computeFingerprint(canonicalPath, deviceId) {
88
+ let inode = '';
89
+ try {
90
+ const stat = fs.statSync(canonicalPath);
91
+ inode = String(stat.ino);
92
+ }
93
+ catch {
94
+ // File doesn't exist, omit inode
95
+ }
96
+ const data = `${canonicalPath}:${deviceId}:${inode}`;
97
+ const hash = (0, crypto_1.createHash)('sha256').update(data).digest('hex');
98
+ return `sha256:${hash}`;
99
+ }
100
+ //# sourceMappingURL=resource-canonicalizer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resource-canonicalizer.js","sourceRoot":"","sources":["../../src/utils/resource-canonicalizer.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAeA,4CAiCC;AAQD,gDAeC;AAvED,2CAA4B;AAC5B,uCAAwB;AACxB,uCAAwB;AACxB,mCAAmC;AAEnC;;;;;;;;;GASG;AACH,SAAgB,gBAAgB,CAAC,QAAgB;IAC/C,IAAI,QAAQ,GAAG,QAAQ,CAAA;IAEvB,cAAc;IACd,IAAI,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,QAAQ,KAAK,GAAG,EAAE,CAAC;QAClD,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;IACvD,CAAC;IAED,yBAAyB;IACzB,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC/B,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;IACnC,CAAC;IAED,wBAAwB;IACxB,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAA;IAEnC,qCAAqC;IACrC,IAAI,CAAC;QACH,QAAQ,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAA;IACtC,CAAC;IAAC,MAAM,CAAC;QACP,8CAA8C;IAChD,CAAC;IAED,oDAAoD;IACpD,4EAA4E;IAC5E,2EAA2E;IAC3E,sEAAsE;IACtE,+BAA+B;IAC/B,IAAI,OAAO,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAClC,QAAQ,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAA;IACnC,CAAC;IAED,OAAO,QAAQ,CAAA;AACjB,CAAC;AAED;;;;;GAKG;AACH,SAAgB,kBAAkB,CAChC,aAAqB,EACrB,QAAgB;IAEhB,IAAI,KAAK,GAAG,EAAE,CAAA;IACd,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAA;QACvC,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IAC1B,CAAC;IAAC,MAAM,CAAC;QACP,iCAAiC;IACnC,CAAC;IAED,MAAM,IAAI,GAAG,GAAG,aAAa,IAAI,QAAQ,IAAI,KAAK,EAAE,CAAA;IACpD,MAAM,IAAI,GAAG,IAAA,mBAAU,EAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;IAC5D,OAAO,UAAU,IAAI,EAAE,CAAA;AACzB,CAAC"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Shared VC utility functions for agentd.
3
+ *
4
+ * NOTE: These functions decode the JWT payload WITHOUT verifying the signature.
5
+ * This is intentional — the Gateway is the authoritative verifier. These local
6
+ * checks are optimizations to avoid sending obviously-expired VCs over the network.
7
+ */
8
+ /**
9
+ * Extract jti (JWT ID) from an SD-JWT VC credential string.
10
+ *
11
+ * @param credentialJwt - The full SD-JWT credential string
12
+ * @returns The jti string, or null if extraction fails
13
+ */
14
+ export declare function extractJtiFromVC(credentialJwt: string): string | null;
15
+ /**
16
+ * Extract exp (expiration time) from an SD-JWT VC credential string.
17
+ *
18
+ * @param credentialJwt - The full SD-JWT credential string
19
+ * @returns The exp as seconds since epoch, or null if extraction fails.
20
+ * Returns null for non-finite or non-positive values.
21
+ */
22
+ export declare function extractExpFromVC(credentialJwt: string): number | null;
23
+ //# sourceMappingURL=vc-utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vc-utils.d.ts","sourceRoot":"","sources":["../../src/utils/vc-utils.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAqBH;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAGrE;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAMrE"}
@@ -0,0 +1,53 @@
1
+ "use strict";
2
+ /**
3
+ * Shared VC utility functions for agentd.
4
+ *
5
+ * NOTE: These functions decode the JWT payload WITHOUT verifying the signature.
6
+ * This is intentional — the Gateway is the authoritative verifier. These local
7
+ * checks are optimizations to avoid sending obviously-expired VCs over the network.
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.extractJtiFromVC = extractJtiFromVC;
11
+ exports.extractExpFromVC = extractExpFromVC;
12
+ /**
13
+ * Parse the payload of an SD-JWT VC credential string without signature verification.
14
+ * Shared helper to avoid duplicating base64url decode logic.
15
+ */
16
+ function parseVCPayload(credentialJwt) {
17
+ try {
18
+ // SD-JWT format: <issuer-jwt>~<disclosure1>~<disclosure2>~...
19
+ const issuerJwt = credentialJwt.split('~')[0];
20
+ const parts = issuerJwt.split('.');
21
+ if (parts.length < 2)
22
+ return null;
23
+ return JSON.parse(Buffer.from(parts[1], 'base64url').toString('utf-8'));
24
+ }
25
+ catch {
26
+ return null;
27
+ }
28
+ }
29
+ /**
30
+ * Extract jti (JWT ID) from an SD-JWT VC credential string.
31
+ *
32
+ * @param credentialJwt - The full SD-JWT credential string
33
+ * @returns The jti string, or null if extraction fails
34
+ */
35
+ function extractJtiFromVC(credentialJwt) {
36
+ const payload = parseVCPayload(credentialJwt);
37
+ return typeof payload?.jti === 'string' ? payload.jti : null;
38
+ }
39
+ /**
40
+ * Extract exp (expiration time) from an SD-JWT VC credential string.
41
+ *
42
+ * @param credentialJwt - The full SD-JWT credential string
43
+ * @returns The exp as seconds since epoch, or null if extraction fails.
44
+ * Returns null for non-finite or non-positive values.
45
+ */
46
+ function extractExpFromVC(credentialJwt) {
47
+ const payload = parseVCPayload(credentialJwt);
48
+ if (typeof payload?.exp === 'number' && Number.isFinite(payload.exp) && payload.exp > 0) {
49
+ return payload.exp;
50
+ }
51
+ return null;
52
+ }
53
+ //# sourceMappingURL=vc-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vc-utils.js","sourceRoot":"","sources":["../../src/utils/vc-utils.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;AA2BH,4CAGC;AASD,4CAMC;AA3CD;;;GAGG;AACH,SAAS,cAAc,CAAC,aAAqB;IAC3C,IAAI,CAAC;QACH,8DAA8D;QAC9D,MAAM,SAAS,GAAG,aAAa,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;QAC7C,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;QAClC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,IAAI,CAAA;QAEjC,OAAO,IAAI,CAAC,KAAK,CACf,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CACrD,CAAA;IACH,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAA;IACb,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,SAAgB,gBAAgB,CAAC,aAAqB;IACpD,MAAM,OAAO,GAAG,cAAc,CAAC,aAAa,CAAC,CAAA;IAC7C,OAAO,OAAO,OAAO,EAAE,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAA;AAC9D,CAAC;AAED;;;;;;GAMG;AACH,SAAgB,gBAAgB,CAAC,aAAqB;IACpD,MAAM,OAAO,GAAG,cAAc,CAAC,aAAa,CAAC,CAAA;IAC7C,IAAI,OAAO,OAAO,EAAE,GAAG,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,GAAG,GAAG,CAAC,EAAE,CAAC;QACxF,OAAO,OAAO,CAAC,GAAG,CAAA;IACpB,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC"}
@@ -0,0 +1,4 @@
1
+ import Database from 'better-sqlite3';
2
+ export declare function openDatabase(dbPath: string): Database.Database;
3
+ export declare function initSchema(db: Database.Database): void;
4
+ //# sourceMappingURL=sqlite.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqlite.d.ts","sourceRoot":"","sources":["../../src/wallet/sqlite.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAA;AAGrC,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,QAAQ,CAAC,QAAQ,CAO9D;AAED,wBAAgB,UAAU,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,IAAI,CA2GtD"}
@@ -0,0 +1,158 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.openDatabase = openDatabase;
40
+ exports.initSchema = initSchema;
41
+ const better_sqlite3_1 = __importDefault(require("better-sqlite3"));
42
+ const fs = __importStar(require("fs"));
43
+ function openDatabase(dbPath) {
44
+ const existed = fs.existsSync(dbPath);
45
+ const db = new better_sqlite3_1.default(dbPath);
46
+ if (!existed && fs.existsSync(dbPath)) {
47
+ fs.chmodSync(dbPath, 0o600);
48
+ }
49
+ return db;
50
+ }
51
+ function initSchema(db) {
52
+ db.exec(`
53
+ CREATE TABLE IF NOT EXISTS projects (
54
+ id TEXT PRIMARY KEY,
55
+ name TEXT NOT NULL,
56
+ is_default INTEGER DEFAULT 0,
57
+ user_role TEXT,
58
+ synced_at INTEGER
59
+ );
60
+
61
+ CREATE TABLE IF NOT EXISTS keys (
62
+ id TEXT PRIMARY KEY,
63
+ did TEXT NOT NULL UNIQUE,
64
+ key_type TEXT NOT NULL,
65
+ public_key TEXT NOT NULL,
66
+ keychain_ref TEXT NOT NULL,
67
+ storage_type TEXT NOT NULL DEFAULT 'keychain',
68
+ parent_did TEXT,
69
+ project_id TEXT,
70
+ client_name TEXT,
71
+ status TEXT DEFAULT 'active',
72
+ created_at INTEGER NOT NULL,
73
+ rotated_at INTEGER,
74
+ FOREIGN KEY (project_id) REFERENCES projects(id)
75
+ );
76
+
77
+ CREATE TABLE IF NOT EXISTS credentials (
78
+ id TEXT PRIMARY KEY,
79
+ holder_did TEXT NOT NULL,
80
+ project_id TEXT NOT NULL,
81
+ credential_jwt TEXT NOT NULL,
82
+ actions TEXT NOT NULL,
83
+ provider TEXT NOT NULL,
84
+ resources TEXT,
85
+ normalized_resource_key TEXT,
86
+ resource_fingerprint TEXT,
87
+ delegated_from TEXT,
88
+ status TEXT DEFAULT 'active',
89
+ expires_at INTEGER,
90
+ created_at INTEGER,
91
+ metadata TEXT,
92
+ FOREIGN KEY (project_id) REFERENCES projects(id)
93
+ );
94
+
95
+ CREATE INDEX IF NOT EXISTS idx_credentials_status ON credentials(status, provider);
96
+ CREATE INDEX IF NOT EXISTS idx_credentials_normalized_resource ON credentials(normalized_resource_key, status);
97
+
98
+ CREATE TABLE IF NOT EXISTS synced_policies (
99
+ id TEXT PRIMARY KEY,
100
+ project_id TEXT NOT NULL,
101
+ policy_json TEXT NOT NULL,
102
+ synced_at INTEGER NOT NULL,
103
+ FOREIGN KEY (project_id) REFERENCES projects(id)
104
+ );
105
+
106
+ `);
107
+ // Migration: add metadata column to existing databases
108
+ try {
109
+ db.exec('ALTER TABLE credentials ADD COLUMN metadata TEXT');
110
+ }
111
+ catch {
112
+ // Column already exists — safe to ignore
113
+ }
114
+ // Migration: add resources column to existing databases
115
+ try {
116
+ db.exec('ALTER TABLE credentials ADD COLUMN resources TEXT');
117
+ }
118
+ catch {
119
+ // Column already exists — safe to ignore
120
+ }
121
+ db.exec(`
122
+ CREATE TABLE IF NOT EXISTS env_profiles (
123
+ id TEXT PRIMARY KEY,
124
+ profile_name TEXT NOT NULL,
125
+ key_name TEXT NOT NULL,
126
+ backend_type TEXT NOT NULL DEFAULT 'keychain',
127
+ imported_at INTEGER NOT NULL,
128
+ UNIQUE(profile_name, key_name)
129
+ );
130
+
131
+ CREATE TABLE IF NOT EXISTS audit_log (
132
+ id TEXT PRIMARY KEY,
133
+ timestamp INTEGER NOT NULL,
134
+ project_id TEXT,
135
+ root_did TEXT,
136
+ agent_did TEXT,
137
+ presenter_did TEXT,
138
+ action TEXT NOT NULL,
139
+ provider TEXT,
140
+ enforcement_type TEXT,
141
+ decision_source TEXT,
142
+ execution_type TEXT NOT NULL,
143
+ decision TEXT NOT NULL,
144
+ decision_reason TEXT,
145
+ requested_resource TEXT,
146
+ normalized_resource TEXT,
147
+ resource_fingerprint TEXT,
148
+ grant_id TEXT,
149
+ credential_id TEXT,
150
+ approval_mode TEXT,
151
+ approval_nonce TEXT,
152
+ metadata TEXT,
153
+ synced_at INTEGER,
154
+ FOREIGN KEY (project_id) REFERENCES projects(id)
155
+ );
156
+ `);
157
+ }
158
+ //# sourceMappingURL=sqlite.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqlite.js","sourceRoot":"","sources":["../../src/wallet/sqlite.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAGA,oCAOC;AAED,gCA2GC;AAvHD,oEAAqC;AACrC,uCAAwB;AAExB,SAAgB,YAAY,CAAC,MAAc;IACzC,MAAM,OAAO,GAAG,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,CAAA;IACrC,MAAM,EAAE,GAAG,IAAI,wBAAQ,CAAC,MAAM,CAAC,CAAA;IAC/B,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QACtC,EAAE,CAAC,SAAS,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;IAC7B,CAAC;IACD,OAAO,EAAE,CAAA;AACX,CAAC;AAED,SAAgB,UAAU,CAAC,EAAqB;IAC9C,EAAE,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsDP,CAAC,CAAA;IAEF,uDAAuD;IACvD,IAAI,CAAC;QACH,EAAE,CAAC,IAAI,CAAC,kDAAkD,CAAC,CAAA;IAC7D,CAAC;IAAC,MAAM,CAAC;QACP,yCAAyC;IAC3C,CAAC;IAED,wDAAwD;IACxD,IAAI,CAAC;QACH,EAAE,CAAC,IAAI,CAAC,mDAAmD,CAAC,CAAA;IAC9D,CAAC;IAAC,MAAM,CAAC;QACP,yCAAyC;IAC3C,CAAC;IAED,EAAE,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCP,CAAC,CAAA;AACJ,CAAC"}
@@ -0,0 +1,18 @@
1
+ export interface VPBuildOptions {
2
+ credentialJwt: string;
3
+ signerDid: string;
4
+ signerPrivateKeyJwk: string;
5
+ nonce: string;
6
+ domain: string;
7
+ }
8
+ /**
9
+ * Build a Verifiable Presentation (SD-JWT KB-JWT) for local signing.
10
+ *
11
+ * The VP signer is the Agent DID (not Root DID — spec §4.2).
12
+ * Follows the same pattern as remote-mcp's VPCreationService.
13
+ * Accepts injectable signing key for future session key switching.
14
+ */
15
+ export declare class VPBuilder {
16
+ buildVP(options: VPBuildOptions): Promise<string>;
17
+ }
18
+ //# sourceMappingURL=vp-builder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vp-builder.d.ts","sourceRoot":"","sources":["../../src/wallet/vp-builder.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,cAAc;IAC7B,aAAa,EAAE,MAAM,CAAA;IACrB,SAAS,EAAE,MAAM,CAAA;IACjB,mBAAmB,EAAE,MAAM,CAAA;IAC3B,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;CACf;AAED;;;;;;GAMG;AACH,qBAAa,SAAS;IACd,OAAO,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC;CAwCxD"}
@@ -0,0 +1,46 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.VPBuilder = void 0;
4
+ const sd_jwt_vc_1 = require("@sd-jwt/sd-jwt-vc");
5
+ const crypto_nodejs_1 = require("@sd-jwt/crypto-nodejs");
6
+ /**
7
+ * Build a Verifiable Presentation (SD-JWT KB-JWT) for local signing.
8
+ *
9
+ * The VP signer is the Agent DID (not Root DID — spec §4.2).
10
+ * Follows the same pattern as remote-mcp's VPCreationService.
11
+ * Accepts injectable signing key for future session key switching.
12
+ */
13
+ class VPBuilder {
14
+ async buildVP(options) {
15
+ const privateKey = JSON.parse(options.signerPrivateKeyJwk);
16
+ const signer = await crypto_nodejs_1.ES256.getSigner(privateKey);
17
+ const { d, key_ops, ...publicKeyJwk } = privateKey;
18
+ const verifier = await crypto_nodejs_1.ES256.getVerifier(publicKeyJwk);
19
+ const sdJwtInstance = new sd_jwt_vc_1.SDJwtVcInstance({
20
+ signer,
21
+ verifier,
22
+ signAlg: crypto_nodejs_1.ES256.alg,
23
+ hasher: crypto_nodejs_1.digest,
24
+ hashAlg: 'sha-256',
25
+ saltGenerator: crypto_nodejs_1.generateSalt,
26
+ kbSigner: signer,
27
+ kbSignAlg: crypto_nodejs_1.ES256.alg,
28
+ });
29
+ const decodedVC = await sdJwtInstance.decode(options.credentialJwt);
30
+ const presentableKeys = await decodedVC.presentableKeys(crypto_nodejs_1.digest);
31
+ const presentationFrame = {};
32
+ for (const key of presentableKeys) {
33
+ presentationFrame[key] = true;
34
+ }
35
+ const kbJwtPayload = {
36
+ iss: options.signerDid,
37
+ aud: options.domain,
38
+ nonce: options.nonce,
39
+ iat: Math.floor(Date.now() / 1000),
40
+ };
41
+ const presentation = await sdJwtInstance.present(options.credentialJwt, presentationFrame, { kb: { payload: kbJwtPayload } });
42
+ return presentation;
43
+ }
44
+ }
45
+ exports.VPBuilder = VPBuilder;
46
+ //# sourceMappingURL=vp-builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vp-builder.js","sourceRoot":"","sources":["../../src/wallet/vp-builder.ts"],"names":[],"mappings":";;;AAAA,iDAAmD;AACnD,yDAAmE;AAUnE;;;;;;GAMG;AACH,MAAa,SAAS;IACpB,KAAK,CAAC,OAAO,CAAC,OAAuB;QACnC,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAA;QAC1D,MAAM,MAAM,GAAG,MAAM,qBAAK,CAAC,SAAS,CAAC,UAAU,CAAC,CAAA;QAChD,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,GAAG,YAAY,EAAE,GAAG,UAAqC,CAAA;QAC7E,MAAM,QAAQ,GAAG,MAAM,qBAAK,CAAC,WAAW,CAAC,YAAY,CAAC,CAAA;QAEtD,MAAM,aAAa,GAAG,IAAI,2BAAe,CAAC;YACxC,MAAM;YACN,QAAQ;YACR,OAAO,EAAE,qBAAK,CAAC,GAAG;YAClB,MAAM,EAAE,sBAAM;YACd,OAAO,EAAE,SAAS;YAClB,aAAa,EAAE,4BAAY;YAC3B,QAAQ,EAAE,MAAM;YAChB,SAAS,EAAE,qBAAK,CAAC,GAAG;SACrB,CAAC,CAAA;QAEF,MAAM,SAAS,GAAG,MAAM,aAAa,CAAC,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,CAAA;QACnE,MAAM,eAAe,GAAG,MAAM,SAAS,CAAC,eAAe,CAAC,sBAAM,CAAC,CAAA;QAE/D,MAAM,iBAAiB,GAA4B,EAAE,CAAA;QACrD,KAAK,MAAM,GAAG,IAAI,eAAe,EAAE,CAAC;YAClC,iBAAiB,CAAC,GAAG,CAAC,GAAG,IAAI,CAAA;QAC/B,CAAC;QAED,MAAM,YAAY,GAAG;YACnB,GAAG,EAAE,OAAO,CAAC,SAAS;YACtB,GAAG,EAAE,OAAO,CAAC,MAAM;YACnB,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;SACnC,CAAA;QAED,MAAM,YAAY,GAAG,MAAM,aAAa,CAAC,OAAO,CAC9C,OAAO,CAAC,aAAa,EACrB,iBAAiB,EACjB,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,YAAY,EAAE,EAAE,CAClC,CAAA;QAED,OAAO,YAAY,CAAA;IACrB,CAAC;CACF;AAzCD,8BAyCC"}
@@ -0,0 +1,58 @@
1
+ import Database from 'better-sqlite3';
2
+ import { ResourceConstraint } from '../gateway/gateway-client';
3
+ export interface CredentialEntry {
4
+ id?: string;
5
+ holderDid: string;
6
+ projectId: string;
7
+ credentialJwt: string;
8
+ actions: string[];
9
+ provider: string;
10
+ normalizedResourceKey?: string;
11
+ resourceFingerprint?: string;
12
+ delegatedFrom?: string;
13
+ status?: 'active' | 'revoked' | 'expired';
14
+ expiresAt?: number;
15
+ /**
16
+ * Structured resource constraints from the VC grant (e.g., Slack channel, GitHub repo).
17
+ * Stored as a denormalized cache for local resource-scoped credential lookup.
18
+ * Unlike credential_jwt (which requires SD-JWT decoding), this enables direct DB queries
19
+ * to find credentials by resource scope.
20
+ */
21
+ resources?: ResourceConstraint[];
22
+ metadata?: Record<string, unknown>;
23
+ }
24
+ export interface StoredCredential extends CredentialEntry {
25
+ id: string;
26
+ status: 'active' | 'revoked' | 'expired';
27
+ createdAt: number;
28
+ }
29
+ /**
30
+ * Validate and sanitize resources from gateway response at runtime.
31
+ * Strips unknown fields to prevent prototype pollution or type confusion.
32
+ */
33
+ export declare function validateResources(raw: unknown): ResourceConstraint[] | undefined;
34
+ export declare class Wallet {
35
+ private readonly db;
36
+ constructor(db: Database.Database);
37
+ storeCredential(entry: CredentialEntry): StoredCredential;
38
+ /**
39
+ * Find a credential by holder DID, action, and project.
40
+ * Uses json_each for action matching in JSON array.
41
+ * Excludes expired and revoked credentials.
42
+ */
43
+ findCredential(holderDid: string, action: string, projectId: string, resourceId?: string): StoredCredential | null;
44
+ /**
45
+ * Find a credential that is NOT scoped to any specific resource.
46
+ * Returns credentials where resources is NULL or an empty array '[]'.
47
+ */
48
+ findUnscopedCredential(holderDid: string, action: string, projectId: string): StoredCredential | null;
49
+ /**
50
+ * Find a credential by normalized resource key.
51
+ */
52
+ findCredentialByResource(normalizedKey: string, holderDid: string, projectId: string): StoredCredential | null;
53
+ revokeCredential(id: string): void;
54
+ getExpiredCredentials(): StoredCredential[];
55
+ getActiveCredentials(): StoredCredential[];
56
+ private rowToCredential;
57
+ }
58
+ //# sourceMappingURL=wallet.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wallet.d.ts","sourceRoot":"","sources":["../../src/wallet/wallet.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAA;AAErC,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAA;AAE9D,MAAM,WAAW,eAAe;IAC9B,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;IACjB,aAAa,EAAE,MAAM,CAAA;IACrB,OAAO,EAAE,MAAM,EAAE,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAA;IAChB,qBAAqB,CAAC,EAAE,MAAM,CAAA;IAC9B,mBAAmB,CAAC,EAAE,MAAM,CAAA;IAC5B,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,MAAM,CAAC,EAAE,QAAQ,GAAG,SAAS,GAAG,SAAS,CAAA;IACzC,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB;;;;;OAKG;IACH,SAAS,CAAC,EAAE,kBAAkB,EAAE,CAAA;IAChC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CACnC;AAED,MAAM,WAAW,gBAAiB,SAAQ,eAAe;IACvD,EAAE,EAAE,MAAM,CAAA;IACV,MAAM,EAAE,QAAQ,GAAG,SAAS,GAAG,SAAS,CAAA;IACxC,SAAS,EAAE,MAAM,CAAA;CAClB;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,GAAG,EAAE,OAAO,GACX,kBAAkB,EAAE,GAAG,SAAS,CAelC;AAED,qBAAa,MAAM;IACL,OAAO,CAAC,QAAQ,CAAC,EAAE;gBAAF,EAAE,EAAE,QAAQ,CAAC,QAAQ;IAElD,eAAe,CAAC,KAAK,EAAE,eAAe,GAAG,gBAAgB;IAqDzD;;;;OAIG;IACH,cAAc,CACZ,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,UAAU,CAAC,EAAE,MAAM,GAClB,gBAAgB,GAAG,IAAI;IAoC1B;;;OAGG;IACH,sBAAsB,CACpB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,GAChB,gBAAgB,GAAG,IAAI;IAgB1B;;OAEG;IACH,wBAAwB,CACtB,aAAa,EAAE,MAAM,EACrB,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,GAChB,gBAAgB,GAAG,IAAI;IAe1B,gBAAgB,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAIlC,qBAAqB,IAAI,gBAAgB,EAAE;IAS3C,oBAAoB,IAAI,gBAAgB,EAAE;IAS1C,OAAO,CAAC,eAAe;CAkBxB"}