attenu-guard 0.1.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 (112) hide show
  1. package/CHANGELOG.md +46 -0
  2. package/LICENSE +202 -0
  3. package/README.md +200 -0
  4. package/SECURITY.md +34 -0
  5. package/bin/attenu-guard.js +4 -0
  6. package/dist/cjs/adapters/langgraph.d.ts +174 -0
  7. package/dist/cjs/adapters/langgraph.d.ts.map +1 -0
  8. package/dist/cjs/adapters/langgraph.js +242 -0
  9. package/dist/cjs/adapters/langgraph.js.map +1 -0
  10. package/dist/cjs/audit.d.ts +82 -0
  11. package/dist/cjs/audit.d.ts.map +1 -0
  12. package/dist/cjs/audit.js +195 -0
  13. package/dist/cjs/audit.js.map +1 -0
  14. package/dist/cjs/authority.d.ts +114 -0
  15. package/dist/cjs/authority.d.ts.map +1 -0
  16. package/dist/cjs/authority.js +238 -0
  17. package/dist/cjs/authority.js.map +1 -0
  18. package/dist/cjs/canonical.d.ts +91 -0
  19. package/dist/cjs/canonical.d.ts.map +1 -0
  20. package/dist/cjs/canonical.js +372 -0
  21. package/dist/cjs/canonical.js.map +1 -0
  22. package/dist/cjs/ceilings.d.ts +211 -0
  23. package/dist/cjs/ceilings.d.ts.map +1 -0
  24. package/dist/cjs/ceilings.js +476 -0
  25. package/dist/cjs/ceilings.js.map +1 -0
  26. package/dist/cjs/chain.d.ts +106 -0
  27. package/dist/cjs/chain.d.ts.map +1 -0
  28. package/dist/cjs/chain.js +0 -0
  29. package/dist/cjs/chain.js.map +1 -0
  30. package/dist/cjs/cli.d.ts +16 -0
  31. package/dist/cjs/cli.d.ts.map +1 -0
  32. package/dist/cjs/cli.js +100 -0
  33. package/dist/cjs/cli.js.map +1 -0
  34. package/dist/cjs/evidence.d.ts +163 -0
  35. package/dist/cjs/evidence.d.ts.map +1 -0
  36. package/dist/cjs/evidence.js +409 -0
  37. package/dist/cjs/evidence.js.map +1 -0
  38. package/dist/cjs/guard.d.ts +186 -0
  39. package/dist/cjs/guard.d.ts.map +1 -0
  40. package/dist/cjs/guard.js +432 -0
  41. package/dist/cjs/guard.js.map +1 -0
  42. package/dist/cjs/index.d.ts +52 -0
  43. package/dist/cjs/index.d.ts.map +1 -0
  44. package/dist/cjs/index.js +99 -0
  45. package/dist/cjs/index.js.map +1 -0
  46. package/dist/cjs/package.json +3 -0
  47. package/dist/cjs/reasons.d.ts +93 -0
  48. package/dist/cjs/reasons.d.ts.map +1 -0
  49. package/dist/cjs/reasons.js +139 -0
  50. package/dist/cjs/reasons.js.map +1 -0
  51. package/dist/cjs/strikes.d.ts +24 -0
  52. package/dist/cjs/strikes.d.ts.map +1 -0
  53. package/dist/cjs/strikes.js +30 -0
  54. package/dist/cjs/strikes.js.map +1 -0
  55. package/dist/cjs/wire.d.ts +83 -0
  56. package/dist/cjs/wire.d.ts.map +1 -0
  57. package/dist/cjs/wire.js +165 -0
  58. package/dist/cjs/wire.js.map +1 -0
  59. package/dist/esm/adapters/langgraph.d.ts +174 -0
  60. package/dist/esm/adapters/langgraph.d.ts.map +1 -0
  61. package/dist/esm/adapters/langgraph.js +199 -0
  62. package/dist/esm/adapters/langgraph.js.map +1 -0
  63. package/dist/esm/audit.d.ts +82 -0
  64. package/dist/esm/audit.d.ts.map +1 -0
  65. package/dist/esm/audit.js +189 -0
  66. package/dist/esm/audit.js.map +1 -0
  67. package/dist/esm/authority.d.ts +114 -0
  68. package/dist/esm/authority.d.ts.map +1 -0
  69. package/dist/esm/authority.js +233 -0
  70. package/dist/esm/authority.js.map +1 -0
  71. package/dist/esm/canonical.d.ts +91 -0
  72. package/dist/esm/canonical.d.ts.map +1 -0
  73. package/dist/esm/canonical.js +359 -0
  74. package/dist/esm/canonical.js.map +1 -0
  75. package/dist/esm/ceilings.d.ts +211 -0
  76. package/dist/esm/ceilings.d.ts.map +1 -0
  77. package/dist/esm/ceilings.js +460 -0
  78. package/dist/esm/ceilings.js.map +1 -0
  79. package/dist/esm/chain.d.ts +106 -0
  80. package/dist/esm/chain.d.ts.map +1 -0
  81. package/dist/esm/chain.js +0 -0
  82. package/dist/esm/chain.js.map +1 -0
  83. package/dist/esm/cli.d.ts +16 -0
  84. package/dist/esm/cli.d.ts.map +1 -0
  85. package/dist/esm/cli.js +97 -0
  86. package/dist/esm/cli.js.map +1 -0
  87. package/dist/esm/evidence.d.ts +163 -0
  88. package/dist/esm/evidence.d.ts.map +1 -0
  89. package/dist/esm/evidence.js +398 -0
  90. package/dist/esm/evidence.js.map +1 -0
  91. package/dist/esm/guard.d.ts +186 -0
  92. package/dist/esm/guard.d.ts.map +1 -0
  93. package/dist/esm/guard.js +427 -0
  94. package/dist/esm/guard.js.map +1 -0
  95. package/dist/esm/index.d.ts +52 -0
  96. package/dist/esm/index.d.ts.map +1 -0
  97. package/dist/esm/index.js +42 -0
  98. package/dist/esm/index.js.map +1 -0
  99. package/dist/esm/package.json +3 -0
  100. package/dist/esm/reasons.d.ts +93 -0
  101. package/dist/esm/reasons.d.ts.map +1 -0
  102. package/dist/esm/reasons.js +134 -0
  103. package/dist/esm/reasons.js.map +1 -0
  104. package/dist/esm/strikes.d.ts +24 -0
  105. package/dist/esm/strikes.d.ts.map +1 -0
  106. package/dist/esm/strikes.js +26 -0
  107. package/dist/esm/strikes.js.map +1 -0
  108. package/dist/esm/wire.d.ts +83 -0
  109. package/dist/esm/wire.d.ts.map +1 -0
  110. package/dist/esm/wire.js +159 -0
  111. package/dist/esm/wire.js.map +1 -0
  112. package/package.json +89 -0
@@ -0,0 +1,159 @@
1
+ /**
2
+ * wire.ts — the signing and verification backends.
3
+ *
4
+ * Anchors and delegation tokens are signed over canonical JSON bytes. Two
5
+ * backends ship, matching the Python library's `attenu_guard.wire`:
6
+ *
7
+ * `HS256TestSigner` stdlib HMAC-SHA256, for tests, examples and local dev;
8
+ * `Ed25519Signer` the production signer the Internet-Draft requires, with
9
+ * `Ed25519Verifier` for anyone holding only the public half.
10
+ *
11
+ * Everything here is built on Node's own `node:crypto`, so the package keeps
12
+ * zero runtime dependencies. Ed25519 keys are wrapped in the fixed DER prefixes
13
+ * below rather than pulled from a library.
14
+ */
15
+ import { createHmac, createPrivateKey, createPublicKey, generateKeyPairSync, sign as cryptoSign, timingSafeEqual, verify as cryptoVerify, } from "node:crypto";
16
+ /**
17
+ * stdlib HMAC-SHA256 signer — the default for tests, examples and local dev,
18
+ * because it needs no key management at all.
19
+ *
20
+ * NOT FOR PRODUCTION. HMAC is symmetric: `sign` and `verify` use the identical
21
+ * secret, so anyone able to verify a bundle is also able to forge one. That
22
+ * precludes the property the draft is built around — public offline
23
+ * verification at an untrusted enforcement point — because every verifier would
24
+ * have to hold the minting secret. Use `Ed25519Signer` in production; this
25
+ * class exists so the wire format and the interop fixtures can be exercised
26
+ * with no key distribution.
27
+ */
28
+ export class HS256TestSigner {
29
+ secret;
30
+ alg = "HS256";
31
+ kid;
32
+ constructor(secret, kid = "test") {
33
+ this.secret = secret;
34
+ this.kid = kid;
35
+ }
36
+ sign(signingInput) {
37
+ return createHmac("sha256", this.secret).update(signingInput).digest();
38
+ }
39
+ verify(signingInput, sig, _keyId) {
40
+ // `keyId` is accepted for parity with multi-key signers but not used for
41
+ // key selection: this signer holds exactly one secret. The comparison is
42
+ // constant-time to avoid a signature-forgery timing oracle.
43
+ const expected = this.sign(signingInput);
44
+ return expected.length === sig.length && timingSafeEqual(expected, sig);
45
+ }
46
+ }
47
+ // Fixed DER wrappers for raw Ed25519 keys (RFC 8410). A raw 32-byte public key
48
+ // becomes a SubjectPublicKeyInfo by prefixing the first; a raw 32-byte private
49
+ // key becomes a PKCS#8 PrivateKeyInfo by prefixing the second.
50
+ const ED25519_SPKI_PREFIX = Buffer.from("302a300506032b6570032100", "hex");
51
+ const ED25519_PKCS8_PREFIX = Buffer.from("302e020100300506032b657004220420", "hex");
52
+ function publicKeyFromRaw(raw) {
53
+ if (raw.length !== 32) {
54
+ throw new Error(`an Ed25519 public key is 32 bytes, got ${raw.length}`);
55
+ }
56
+ return createPublicKey({
57
+ key: Buffer.concat([ED25519_SPKI_PREFIX, raw]),
58
+ format: "der",
59
+ type: "spki",
60
+ });
61
+ }
62
+ function privateKeyFromRaw(raw) {
63
+ if (raw.length !== 32) {
64
+ throw new Error(`an Ed25519 private key is 32 bytes, got ${raw.length}`);
65
+ }
66
+ return createPrivateKey({
67
+ key: Buffer.concat([ED25519_PKCS8_PREFIX, raw]),
68
+ format: "der",
69
+ type: "pkcs8",
70
+ });
71
+ }
72
+ function rawPublicBytes(key) {
73
+ const der = key.export({ format: "der", type: "spki" });
74
+ return Buffer.from(der.subarray(der.length - 32));
75
+ }
76
+ function rawPrivateBytes(key) {
77
+ const der = key.export({ format: "der", type: "pkcs8" });
78
+ return Buffer.from(der.subarray(der.length - 32));
79
+ }
80
+ /**
81
+ * The production signer the draft requires ("Implementations MUST support
82
+ * Ed25519"); JOSE alg "EdDSA". Public-key, so — unlike `HS256TestSigner` — a
83
+ * verifier never needs the signing secret, which is exactly what offline
84
+ * verification at an untrusted edge depends on.
85
+ */
86
+ export class Ed25519Signer {
87
+ alg = "EdDSA";
88
+ kid;
89
+ privateKey;
90
+ publicKey;
91
+ constructor(privateKey, kid = "ed25519-1") {
92
+ if (privateKey === undefined) {
93
+ const pair = generateKeyPairSync("ed25519");
94
+ this.privateKey = pair.privateKey;
95
+ this.publicKey = pair.publicKey;
96
+ }
97
+ else {
98
+ this.privateKey = privateKey;
99
+ this.publicKey = createPublicKey(privateKey);
100
+ }
101
+ this.kid = kid;
102
+ }
103
+ /** A signer wrapping a freshly generated keypair. */
104
+ static generate(kid = "ed25519-1") {
105
+ return new Ed25519Signer(undefined, kid);
106
+ }
107
+ /** Rebuild a signer from the 32 raw bytes `privateBytesRaw` produced. */
108
+ static fromPrivateBytes(raw, kid = "ed25519-1") {
109
+ return new Ed25519Signer(privateKeyFromRaw(raw), kid);
110
+ }
111
+ sign(signingInput) {
112
+ return cryptoSign(null, signingInput, this.privateKey);
113
+ }
114
+ verify(signingInput, sig, _keyId) {
115
+ try {
116
+ return cryptoVerify(null, signingInput, this.publicKey, sig);
117
+ }
118
+ catch {
119
+ return false;
120
+ }
121
+ }
122
+ /** The 32-byte raw public key — a trust anchor to distribute out of band. */
123
+ publicBytesRaw() {
124
+ return rawPublicBytes(this.publicKey);
125
+ }
126
+ /** The 32-byte raw private key — what a key FILE stores, never a repo. */
127
+ privateBytesRaw() {
128
+ return rawPrivateBytes(this.privateKey);
129
+ }
130
+ }
131
+ /**
132
+ * The public-key-only counterpart of `Ed25519Signer` — what a console, an
133
+ * auditor or an ingest server holds. It verifies anchors signed by the matching
134
+ * private key and can never sign: `sign` throws.
135
+ */
136
+ export class Ed25519Verifier {
137
+ alg = "EdDSA";
138
+ kid;
139
+ publicKey;
140
+ constructor(publicBytesRaw, kid = "ed25519-1") {
141
+ this.publicKey = publicKeyFromRaw(publicBytesRaw);
142
+ this.kid = kid;
143
+ }
144
+ sign(_signingInput) {
145
+ throw new Error("Ed25519Verifier holds no private key and cannot sign");
146
+ }
147
+ verify(signingInput, sig, _keyId) {
148
+ try {
149
+ return cryptoVerify(null, signingInput, this.publicKey, sig);
150
+ }
151
+ catch {
152
+ return false;
153
+ }
154
+ }
155
+ publicBytesRaw() {
156
+ return rawPublicBytes(this.publicKey);
157
+ }
158
+ }
159
+ //# sourceMappingURL=wire.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wire.js","sourceRoot":"","sources":["../../src/wire.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,89 @@
1
+ {
2
+ "name": "attenu-guard",
3
+ "version": "0.1.0",
4
+ "description": "Attenu Guard for TypeScript: enforces per-agent permissions on every tool call and sub-agent handoff — a sub-agent never holds more than its parent — and writes a hash-chained audit log you verify offline. Same bundle format as the Python library.",
5
+ "license": "Apache-2.0",
6
+ "author": "Attenu",
7
+ "homepage": "https://attenu.io",
8
+ "repository": {
9
+ "type": "git",
10
+ "url": "git+https://github.com/attenu-io/attenu-guard-ts.git"
11
+ },
12
+ "bugs": {
13
+ "url": "https://github.com/attenu-io/attenu-guard-ts/issues"
14
+ },
15
+ "keywords": [
16
+ "ai",
17
+ "agents",
18
+ "security",
19
+ "authorization",
20
+ "least-privilege",
21
+ "delegation",
22
+ "sub-agents",
23
+ "audit-log",
24
+ "mcp",
25
+ "a2a",
26
+ "owasp",
27
+ "langgraph",
28
+ "langchain",
29
+ "langgraphjs",
30
+ "typescript"
31
+ ],
32
+ "type": "commonjs",
33
+ "main": "./dist/cjs/index.js",
34
+ "module": "./dist/esm/index.js",
35
+ "types": "./dist/cjs/index.d.ts",
36
+ "exports": {
37
+ ".": {
38
+ "import": {
39
+ "types": "./dist/esm/index.d.ts",
40
+ "default": "./dist/esm/index.js"
41
+ },
42
+ "require": {
43
+ "types": "./dist/cjs/index.d.ts",
44
+ "default": "./dist/cjs/index.js"
45
+ }
46
+ },
47
+ "./adapters/langgraph": {
48
+ "import": {
49
+ "types": "./dist/esm/adapters/langgraph.d.ts",
50
+ "default": "./dist/esm/adapters/langgraph.js"
51
+ },
52
+ "require": {
53
+ "types": "./dist/cjs/adapters/langgraph.d.ts",
54
+ "default": "./dist/cjs/adapters/langgraph.js"
55
+ }
56
+ },
57
+ "./package.json": "./package.json"
58
+ },
59
+ "bin": {
60
+ "attenu-guard": "bin/attenu-guard.js"
61
+ },
62
+ "files": [
63
+ "dist",
64
+ "bin",
65
+ "README.md",
66
+ "LICENSE",
67
+ "CHANGELOG.md",
68
+ "SECURITY.md"
69
+ ],
70
+ "engines": {
71
+ "node": ">=20"
72
+ },
73
+ "sideEffects": false,
74
+ "scripts": {
75
+ "clean": "node -e \"require('node:fs').rmSync('dist',{recursive:true,force:true});require('node:fs').rmSync('build',{recursive:true,force:true})\"",
76
+ "build": "npm run clean && tsc -p tsconfig.cjs.json && tsc -p tsconfig.esm.json && node scripts/write-module-markers.js",
77
+ "build:tests": "tsc -p tsconfig.test.json",
78
+ "pretest": "npm run build && npm run build:tests",
79
+ "test": "node --test build/test/*.test.js",
80
+ "fixtures": "python3 tools/gen_fixtures.py"
81
+ },
82
+ "devDependencies": {
83
+ "@langchain/core": "^1.2.9",
84
+ "@langchain/langgraph": "^1.4.13",
85
+ "@types/node": "^22.20.1",
86
+ "typescript": "^5.9.3",
87
+ "zod": "^4.4.3"
88
+ }
89
+ }