usertrust 1.2.5 → 1.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (106) hide show
  1. package/README.md +9 -9
  2. package/dist/anomaly/detector.d.ts +17 -0
  3. package/dist/anomaly/detector.d.ts.map +1 -0
  4. package/dist/anomaly/detector.js +174 -0
  5. package/dist/anomaly/detector.js.map +1 -0
  6. package/dist/anomaly/index.d.ts +8 -0
  7. package/dist/anomaly/index.d.ts.map +1 -0
  8. package/dist/anomaly/index.js +8 -0
  9. package/dist/anomaly/index.js.map +1 -0
  10. package/dist/anomaly/signals/injection-cascade.d.ts +31 -0
  11. package/dist/anomaly/signals/injection-cascade.d.ts.map +1 -0
  12. package/dist/anomaly/signals/injection-cascade.js +46 -0
  13. package/dist/anomaly/signals/injection-cascade.js.map +1 -0
  14. package/dist/anomaly/signals/spend-velocity.d.ts +41 -0
  15. package/dist/anomaly/signals/spend-velocity.d.ts.map +1 -0
  16. package/dist/anomaly/signals/spend-velocity.js +90 -0
  17. package/dist/anomaly/signals/spend-velocity.js.map +1 -0
  18. package/dist/anomaly/signals/token-rate.d.ts +46 -0
  19. package/dist/anomaly/signals/token-rate.d.ts.map +1 -0
  20. package/dist/anomaly/signals/token-rate.js +90 -0
  21. package/dist/anomaly/signals/token-rate.js.map +1 -0
  22. package/dist/anomaly/types.d.ts +103 -0
  23. package/dist/anomaly/types.d.ts.map +1 -0
  24. package/dist/anomaly/types.js +4 -0
  25. package/dist/anomaly/types.js.map +1 -0
  26. package/dist/audit/chain.d.ts +9 -0
  27. package/dist/audit/chain.d.ts.map +1 -1
  28. package/dist/audit/chain.js +65 -9
  29. package/dist/audit/chain.js.map +1 -1
  30. package/dist/audit/verify.d.ts +19 -0
  31. package/dist/audit/verify.d.ts.map +1 -1
  32. package/dist/audit/verify.js +216 -14
  33. package/dist/audit/verify.js.map +1 -1
  34. package/dist/cli/init.d.ts.map +1 -1
  35. package/dist/cli/init.js +9 -1
  36. package/dist/cli/init.js.map +1 -1
  37. package/dist/cli/skill.d.ts.map +1 -1
  38. package/dist/cli/skill.js +35 -5
  39. package/dist/cli/skill.js.map +1 -1
  40. package/dist/cli/snapshot.d.ts.map +1 -1
  41. package/dist/cli/snapshot.js +20 -2
  42. package/dist/cli/snapshot.js.map +1 -1
  43. package/dist/cli/verify.d.ts.map +1 -1
  44. package/dist/cli/verify.js +20 -11
  45. package/dist/cli/verify.js.map +1 -1
  46. package/dist/govern.d.ts +14 -3
  47. package/dist/govern.d.ts.map +1 -1
  48. package/dist/govern.js +367 -129
  49. package/dist/govern.js.map +1 -1
  50. package/dist/headless.d.ts.map +1 -1
  51. package/dist/headless.js +155 -36
  52. package/dist/headless.js.map +1 -1
  53. package/dist/index.d.ts +4 -1
  54. package/dist/index.d.ts.map +1 -1
  55. package/dist/index.js +3 -1
  56. package/dist/index.js.map +1 -1
  57. package/dist/ledger/client.d.ts +14 -0
  58. package/dist/ledger/client.d.ts.map +1 -1
  59. package/dist/ledger/client.js +56 -0
  60. package/dist/ledger/client.js.map +1 -1
  61. package/dist/ledger/pricing.d.ts.map +1 -1
  62. package/dist/ledger/pricing.js +8 -2
  63. package/dist/ledger/pricing.js.map +1 -1
  64. package/dist/policy/default-rules.d.ts +18 -3
  65. package/dist/policy/default-rules.d.ts.map +1 -1
  66. package/dist/policy/default-rules.js +33 -15
  67. package/dist/policy/default-rules.js.map +1 -1
  68. package/dist/policy/gate.d.ts.map +1 -1
  69. package/dist/policy/gate.js +114 -16
  70. package/dist/policy/gate.js.map +1 -1
  71. package/dist/policy/injection.d.ts.map +1 -1
  72. package/dist/policy/injection.js +25 -16
  73. package/dist/policy/injection.js.map +1 -1
  74. package/dist/policy/pii.d.ts +20 -0
  75. package/dist/policy/pii.d.ts.map +1 -1
  76. package/dist/policy/pii.js +45 -2
  77. package/dist/policy/pii.js.map +1 -1
  78. package/dist/proxy.d.ts +17 -9
  79. package/dist/proxy.d.ts.map +1 -1
  80. package/dist/proxy.js +8 -36
  81. package/dist/proxy.js.map +1 -1
  82. package/dist/shared/errors.d.ts +8 -0
  83. package/dist/shared/errors.d.ts.map +1 -1
  84. package/dist/shared/errors.js +18 -0
  85. package/dist/shared/errors.js.map +1 -1
  86. package/dist/shared/types.d.ts +119 -0
  87. package/dist/shared/types.d.ts.map +1 -1
  88. package/dist/shared/types.js +37 -1
  89. package/dist/shared/types.js.map +1 -1
  90. package/dist/snapshot/checkpoint.d.ts +18 -2
  91. package/dist/snapshot/checkpoint.d.ts.map +1 -1
  92. package/dist/snapshot/checkpoint.js +101 -17
  93. package/dist/snapshot/checkpoint.js.map +1 -1
  94. package/dist/streaming.d.ts +21 -3
  95. package/dist/streaming.d.ts.map +1 -1
  96. package/dist/streaming.js +35 -8
  97. package/dist/streaming.js.map +1 -1
  98. package/dist/supply-chain/permissions.d.ts +16 -3
  99. package/dist/supply-chain/permissions.d.ts.map +1 -1
  100. package/dist/supply-chain/permissions.js +59 -9
  101. package/dist/supply-chain/permissions.js.map +1 -1
  102. package/dist/supply-chain/sign.d.ts +5 -2
  103. package/dist/supply-chain/sign.d.ts.map +1 -1
  104. package/dist/supply-chain/sign.js +10 -2
  105. package/dist/supply-chain/sign.js.map +1 -1
  106. package/package.json +2 -4
@@ -15,6 +15,12 @@ function computeManifestHash(manifest) {
15
15
  /**
16
16
  * Checks whether a manifest's permissions are allowed by the config policy.
17
17
  * Trusted publishers bypass permission restrictions.
18
+ *
19
+ * NOTE: this does NOT verify identity — it is only reached from `enforceSkillLoad`
20
+ * after the signature has been checked against a REGISTERED key, so the trusted-
21
+ * publisher bypass here cannot be triggered by a forged-publisher manifest.
22
+ * `integrityVerified` is set to false here; `enforceSkillLoad` overrides it once
23
+ * source bytes have been re-hashed.
18
24
  */
19
25
  export function checkPermissions(manifest, config) {
20
26
  const sc = config.supplyChain;
@@ -26,6 +32,7 @@ export function checkPermissions(manifest, config) {
26
32
  permissionsAllowed: true,
27
33
  deniedPermissions: [],
28
34
  manifestHash,
35
+ integrityVerified: false,
29
36
  };
30
37
  }
31
38
  const allowed = new Set(sc.allowedPermissions);
@@ -35,21 +42,31 @@ export function checkPermissions(manifest, config) {
35
42
  permissionsAllowed: denied.length === 0,
36
43
  deniedPermissions: denied,
37
44
  manifestHash,
45
+ integrityVerified: false,
38
46
  };
39
47
  }
40
48
  /**
41
- * Full verification pipeline: validate schema, verify signature, check permissions, check trusted publishers.
42
- * Returns a SkillVerification result. Throws SkillVerificationError on hard failures.
49
+ * Full verification pipeline: validate schema, verify signature against the
50
+ * REGISTERED publisher key(s), re-hash the loaded source against the signed
51
+ * entryHash, then check permissions. Returns a SkillVerification result.
52
+ * Throws SkillVerificationError on hard (schema) failures.
53
+ *
54
+ * @param entrySource The exact bytes to be executed. When provided, they are
55
+ * re-hashed and compared to the signed `entryHash` (SC-2). A call WITHOUT
56
+ * `entrySource` yields `integrityVerified:false` and MUST be treated by any
57
+ * executor as "integrity unverified — do not execute".
43
58
  */
44
- export function enforceSkillLoad(manifest, config) {
59
+ export function enforceSkillLoad(manifest, config, entrySource) {
45
60
  const sc = config.supplyChain;
46
- // Guard: if supply chain is disabled, allow everything
61
+ // Guard: if supply chain is disabled, allow everything (deliberate operator
62
+ // override — only reachable once the operator has explicitly set enabled:false).
47
63
  if (!sc.enabled) {
48
64
  return {
49
65
  valid: true,
50
66
  permissionsAllowed: true,
51
67
  deniedPermissions: [],
52
68
  manifestHash: computeManifestHash(manifest),
69
+ integrityVerified: false,
53
70
  };
54
71
  }
55
72
  // Step 1: Validate schema
@@ -58,12 +75,24 @@ export function enforceSkillLoad(manifest, config) {
58
75
  const reason = parseResult.error.issues.map((i) => i.message).join("; ");
59
76
  throw new SkillVerificationError(manifest.id ?? "unknown", `Schema validation failed: ${reason}`);
60
77
  }
61
- // Step 2: Verify signature
62
- // Always verify signature for trusted publishers (prevent publisher forgery)
63
- // Also verify if requireSignature is true
78
+ // Step 2: Verify signature against the REGISTERED key(s) for the claimed
79
+ // publisher. The publisher->key registry is the trust anchor; an unregistered
80
+ // publisher or a self-signed key cannot be trusted.
81
+ const registeredKeys = sc.publisherKeys[manifest.publisher] ?? [];
64
82
  const isTrusted = sc.trustedPublishers.includes(manifest.publisher);
65
83
  if (sc.requireSignature || isTrusted) {
66
- const sigValid = verifySignature(manifest);
84
+ if (registeredKeys.length === 0) {
85
+ const manifestHash = computeManifestHash(manifest);
86
+ return {
87
+ valid: false,
88
+ permissionsAllowed: false,
89
+ deniedPermissions: manifest.permissions,
90
+ manifestHash,
91
+ integrityVerified: false,
92
+ error: `No registered signing key for publisher "${manifest.publisher}"`,
93
+ };
94
+ }
95
+ const sigValid = verifySignature(manifest, registeredKeys);
67
96
  if (!sigValid) {
68
97
  const manifestHash = computeManifestHash(manifest);
69
98
  return {
@@ -71,19 +100,40 @@ export function enforceSkillLoad(manifest, config) {
71
100
  permissionsAllowed: false,
72
101
  deniedPermissions: manifest.permissions,
73
102
  manifestHash,
103
+ integrityVerified: false,
74
104
  error: "Invalid manifest signature",
75
105
  };
76
106
  }
77
107
  }
108
+ // Step 2b: Code integrity — the bytes being loaded MUST hash to the signed
109
+ // entryHash. A valid signature over a manifest is worthless if it can be
110
+ // paired with other (malicious) code.
111
+ let integrityVerified = false;
112
+ if (entrySource !== undefined) {
113
+ const actualHash = createHash("sha256").update(entrySource).digest("hex");
114
+ if (actualHash !== manifest.entryHash) {
115
+ const manifestHash = computeManifestHash(manifest);
116
+ return {
117
+ valid: false,
118
+ permissionsAllowed: false,
119
+ deniedPermissions: manifest.permissions,
120
+ manifestHash,
121
+ integrityVerified: false,
122
+ error: "entryHash mismatch — skill source does not match signed manifest",
123
+ };
124
+ }
125
+ integrityVerified = true;
126
+ }
78
127
  // Step 3: Check permissions and trusted publishers
79
128
  const result = checkPermissions(manifest, config);
80
129
  if (!result.permissionsAllowed) {
81
130
  return {
82
131
  ...result,
83
132
  valid: false,
133
+ integrityVerified,
84
134
  error: `Denied permissions: ${result.deniedPermissions.join(", ")}`,
85
135
  };
86
136
  }
87
- return result;
137
+ return { ...result, integrityVerified };
88
138
  }
89
139
  //# sourceMappingURL=permissions.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"permissions.js","sourceRoot":"","sources":["../../src/supply-chain/permissions.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"permissions.js","sourceRoot":"","sources":["../../src/supply-chain/permissions.ts"],"names":[],"mappings":"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"}
@@ -11,7 +11,10 @@ export declare function generateKeyPair(): {
11
11
  */
12
12
  export declare function signManifest(manifest: Omit<SkillManifest, "signature" | "publicKey" | "signedAt">, privateKeyHex: string): SkillManifest;
13
13
  /**
14
- * Verifies the Ed25519 signature on a signed manifest.
14
+ * Verifies the Ed25519 signature on a signed manifest against the REGISTERED
15
+ * public key(s) for the claimed publisher. The key embedded in the manifest is
16
+ * NOT trusted as an authority: it is accepted only if it is one of `trustedKeys`.
17
+ * Passing an empty `trustedKeys` list always fails closed.
15
18
  */
16
- export declare function verifySignature(manifest: SkillManifest): boolean;
19
+ export declare function verifySignature(manifest: SkillManifest, trustedKeys: string[]): boolean;
17
20
  //# sourceMappingURL=sign.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"sign.d.ts","sourceRoot":"","sources":["../../src/supply-chain/sign.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAExD;;GAEG;AACH,wBAAgB,eAAe,IAAI;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAU3E;AAuBD;;GAEG;AACH,wBAAgB,YAAY,CAC3B,QAAQ,EAAE,IAAI,CAAC,aAAa,EAAE,WAAW,GAAG,WAAW,GAAG,UAAU,CAAC,EACrE,aAAa,EAAE,MAAM,GACnB,aAAa,CA+Bf;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,aAAa,GAAG,OAAO,CA+BhE"}
1
+ {"version":3,"file":"sign.d.ts","sourceRoot":"","sources":["../../src/supply-chain/sign.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAExD;;GAEG;AACH,wBAAgB,eAAe,IAAI;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAU3E;AAuBD;;GAEG;AACH,wBAAgB,YAAY,CAC3B,QAAQ,EAAE,IAAI,CAAC,aAAa,EAAE,WAAW,GAAG,WAAW,GAAG,UAAU,CAAC,EACrE,aAAa,EAAE,MAAM,GACnB,aAAa,CA+Bf;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,OAAO,CAqCvF"}
@@ -64,10 +64,18 @@ export function signManifest(manifest, privateKeyHex) {
64
64
  };
65
65
  }
66
66
  /**
67
- * Verifies the Ed25519 signature on a signed manifest.
67
+ * Verifies the Ed25519 signature on a signed manifest against the REGISTERED
68
+ * public key(s) for the claimed publisher. The key embedded in the manifest is
69
+ * NOT trusted as an authority: it is accepted only if it is one of `trustedKeys`.
70
+ * Passing an empty `trustedKeys` list always fails closed.
68
71
  */
69
- export function verifySignature(manifest) {
72
+ export function verifySignature(manifest, trustedKeys) {
70
73
  try {
74
+ // Trust anchor: the manifest's key must be one the operator registered for
75
+ // this publisher. A self-signed key from an attacker is rejected here.
76
+ if (!trustedKeys.includes(manifest.publicKey)) {
77
+ return false;
78
+ }
71
79
  const payload = computeSigningPayload({
72
80
  version: manifest.version,
73
81
  id: manifest.id,
@@ -1 +1 @@
1
- {"version":3,"file":"sign.js","sourceRoot":"","sources":["../../src/supply-chain/sign.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sign.js","sourceRoot":"","sources":["../../src/supply-chain/sign.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "usertrust",
3
- "version": "1.2.5",
3
+ "version": "1.4.0",
4
4
  "description": "Financial governance for AI agents. Every LLM call becomes an immutable, auditable transaction.",
5
5
  "license": "Apache-2.0",
6
6
  "author": "Usertools, Inc. <hello@usertools.ai> (https://usertrust.ai)",
@@ -57,9 +57,7 @@
57
57
  "build": "tsc",
58
58
  "prepublishOnly": "tsc"
59
59
  },
60
- "files": [
61
- "dist"
62
- ],
60
+ "files": ["dist"],
63
61
  "peerDependencies": {
64
62
  "@anthropic-ai/sdk": ">=0.30.0",
65
63
  "openai": ">=4.70.0"