@openleash/core 0.0.3 → 0.2.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 (64) hide show
  1. package/LICENSE +191 -0
  2. package/README.md +13 -29
  3. package/dist/audit.d.ts +11 -0
  4. package/dist/audit.d.ts.map +1 -0
  5. package/dist/audit.js +76 -0
  6. package/dist/audit.js.map +1 -0
  7. package/dist/canonicalize.d.ts +5 -0
  8. package/dist/canonicalize.d.ts.map +1 -0
  9. package/dist/canonicalize.js +51 -0
  10. package/dist/canonicalize.js.map +1 -0
  11. package/dist/constraints.d.ts +3 -0
  12. package/dist/constraints.d.ts.map +1 -0
  13. package/dist/constraints.js +51 -0
  14. package/dist/constraints.js.map +1 -0
  15. package/dist/engine.d.ts +21 -0
  16. package/dist/engine.d.ts.map +1 -0
  17. package/dist/engine.js +139 -0
  18. package/dist/engine.js.map +1 -0
  19. package/dist/expression.d.ts +3 -0
  20. package/dist/expression.d.ts.map +1 -0
  21. package/dist/expression.js +60 -0
  22. package/dist/expression.js.map +1 -0
  23. package/dist/index.d.ts +15 -0
  24. package/dist/index.d.ts.map +1 -0
  25. package/dist/index.js +31 -0
  26. package/dist/index.js.map +1 -0
  27. package/dist/jsonpath.d.ts +8 -0
  28. package/dist/jsonpath.d.ts.map +1 -0
  29. package/dist/jsonpath.js +48 -0
  30. package/dist/jsonpath.js.map +1 -0
  31. package/dist/keys.d.ts +9 -0
  32. package/dist/keys.d.ts.map +1 -0
  33. package/dist/keys.js +80 -0
  34. package/dist/keys.js.map +1 -0
  35. package/dist/nonce-cache.d.ts +17 -0
  36. package/dist/nonce-cache.d.ts.map +1 -0
  37. package/dist/nonce-cache.js +53 -0
  38. package/dist/nonce-cache.js.map +1 -0
  39. package/dist/obligations.d.ts +9 -0
  40. package/dist/obligations.d.ts.map +1 -0
  41. package/dist/obligations.js +89 -0
  42. package/dist/obligations.js.map +1 -0
  43. package/dist/policy-parser.d.ts +192 -0
  44. package/dist/policy-parser.d.ts.map +1 -0
  45. package/dist/policy-parser.js +153 -0
  46. package/dist/policy-parser.js.map +1 -0
  47. package/dist/signing.d.ts +34 -0
  48. package/dist/signing.d.ts.map +1 -0
  49. package/dist/signing.js +79 -0
  50. package/dist/signing.js.map +1 -0
  51. package/dist/state.d.ts +12 -0
  52. package/dist/state.d.ts.map +1 -0
  53. package/dist/state.js +118 -0
  54. package/dist/state.js.map +1 -0
  55. package/dist/tokens.d.ts +38 -0
  56. package/dist/tokens.d.ts.map +1 -0
  57. package/dist/tokens.js +56 -0
  58. package/dist/tokens.js.map +1 -0
  59. package/dist/types.d.ts +276 -0
  60. package/dist/types.d.ts.map +1 -0
  61. package/dist/types.js +70 -0
  62. package/dist/types.js.map +1 -0
  63. package/package.json +20 -19
  64. package/index.js +0 -3
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine.js","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { PolicyExpr } from './types.js';
2
+ export declare function evaluateExpr(expr: PolicyExpr, data: unknown): boolean;
3
+ //# sourceMappingURL=expression.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"expression.d.ts","sourceRoot":"","sources":["../src/expression.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAmB,MAAM,YAAY,CAAC;AAE9D,wBAAgB,YAAY,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAcrE"}
@@ -0,0 +1,60 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.evaluateExpr = evaluateExpr;
4
+ const jsonpath_js_1 = require("./jsonpath.js");
5
+ function evaluateExpr(expr, data) {
6
+ if ('all' in expr) {
7
+ return expr.all.every((e) => evaluateExpr(e, data));
8
+ }
9
+ if ('any' in expr) {
10
+ return expr.any.some((e) => evaluateExpr(e, data));
11
+ }
12
+ if ('not' in expr) {
13
+ return !evaluateExpr(expr.not, data);
14
+ }
15
+ if ('match' in expr) {
16
+ return evaluateMatch(expr.match, data);
17
+ }
18
+ return false;
19
+ }
20
+ function evaluateMatch(match, data) {
21
+ const actual = (0, jsonpath_js_1.jsonPathGet)(data, match.path);
22
+ const { op, value } = match;
23
+ switch (op) {
24
+ case 'exists':
25
+ return actual !== undefined && actual !== null;
26
+ case 'eq':
27
+ return actual === value;
28
+ case 'neq':
29
+ return actual !== value;
30
+ case 'in':
31
+ if (!Array.isArray(value))
32
+ return false;
33
+ return value.includes(actual);
34
+ case 'nin':
35
+ if (!Array.isArray(value))
36
+ return false;
37
+ return !value.includes(actual);
38
+ case 'lt':
39
+ return typeof actual === 'number' && typeof value === 'number' && actual < value;
40
+ case 'lte':
41
+ return typeof actual === 'number' && typeof value === 'number' && actual <= value;
42
+ case 'gt':
43
+ return typeof actual === 'number' && typeof value === 'number' && actual > value;
44
+ case 'gte':
45
+ return typeof actual === 'number' && typeof value === 'number' && actual >= value;
46
+ case 'regex': {
47
+ if (typeof actual !== 'string' || typeof value !== 'string')
48
+ return false;
49
+ try {
50
+ return new RegExp(value).test(actual);
51
+ }
52
+ catch {
53
+ return false;
54
+ }
55
+ }
56
+ default:
57
+ return false;
58
+ }
59
+ }
60
+ //# sourceMappingURL=expression.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"expression.js","sourceRoot":"","sources":["../src/expression.ts"],"names":[],"mappings":";;AAGA,oCAcC;AAjBD,+CAA4C;AAG5C,SAAgB,YAAY,CAAC,IAAgB,EAAE,IAAa;IAC1D,IAAI,KAAK,IAAI,IAAI,EAAE,CAAC;QAClB,OAAO,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;IACtD,CAAC;IACD,IAAI,KAAK,IAAI,IAAI,EAAE,CAAC;QAClB,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;IACrD,CAAC;IACD,IAAI,KAAK,IAAI,IAAI,EAAE,CAAC;QAClB,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IACvC,CAAC;IACD,IAAI,OAAO,IAAI,IAAI,EAAE,CAAC;QACpB,OAAO,aAAa,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IACzC,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,aAAa,CAAC,KAAsB,EAAE,IAAa;IAC1D,MAAM,MAAM,GAAG,IAAA,yBAAW,EAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;IAC7C,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,KAAK,CAAC;IAE5B,QAAQ,EAAE,EAAE,CAAC;QACX,KAAK,QAAQ;YACX,OAAO,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,IAAI,CAAC;QACjD,KAAK,IAAI;YACP,OAAO,MAAM,KAAK,KAAK,CAAC;QAC1B,KAAK,KAAK;YACR,OAAO,MAAM,KAAK,KAAK,CAAC;QAC1B,KAAK,IAAI;YACP,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;gBAAE,OAAO,KAAK,CAAC;YACxC,OAAO,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAChC,KAAK,KAAK;YACR,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;gBAAE,OAAO,KAAK,CAAC;YACxC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QACjC,KAAK,IAAI;YACP,OAAO,OAAO,MAAM,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,GAAG,KAAK,CAAC;QACnF,KAAK,KAAK;YACR,OAAO,OAAO,MAAM,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,IAAI,KAAK,CAAC;QACpF,KAAK,IAAI;YACP,OAAO,OAAO,MAAM,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,GAAG,KAAK,CAAC;QACnF,KAAK,KAAK;YACR,OAAO,OAAO,MAAM,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,IAAI,KAAK,CAAC;QACpF,KAAK,OAAO,CAAC,CAAC,CAAC;YACb,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,QAAQ;gBAAE,OAAO,KAAK,CAAC;YAC1E,IAAI,CAAC;gBACH,OAAO,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACxC,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,KAAK,CAAC;YACf,CAAC;QACH,CAAC;QACD;YACE,OAAO,KAAK,CAAC;IACjB,CAAC;AACH,CAAC"}
@@ -0,0 +1,15 @@
1
+ export * from './types.js';
2
+ export * from './canonicalize.js';
3
+ export * from './jsonpath.js';
4
+ export * from './expression.js';
5
+ export * from './constraints.js';
6
+ export * from './obligations.js';
7
+ export * from './policy-parser.js';
8
+ export * from './engine.js';
9
+ export * from './keys.js';
10
+ export * from './tokens.js';
11
+ export * from './state.js';
12
+ export * from './audit.js';
13
+ export * from './nonce-cache.js';
14
+ export * from './signing.js';
15
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,mBAAmB,CAAC;AAClC,cAAc,eAAe,CAAC;AAC9B,cAAc,iBAAiB,CAAC;AAChC,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,oBAAoB,CAAC;AACnC,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,cAAc,kBAAkB,CAAC;AACjC,cAAc,cAAc,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,31 @@
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 __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./types.js"), exports);
18
+ __exportStar(require("./canonicalize.js"), exports);
19
+ __exportStar(require("./jsonpath.js"), exports);
20
+ __exportStar(require("./expression.js"), exports);
21
+ __exportStar(require("./constraints.js"), exports);
22
+ __exportStar(require("./obligations.js"), exports);
23
+ __exportStar(require("./policy-parser.js"), exports);
24
+ __exportStar(require("./engine.js"), exports);
25
+ __exportStar(require("./keys.js"), exports);
26
+ __exportStar(require("./tokens.js"), exports);
27
+ __exportStar(require("./state.js"), exports);
28
+ __exportStar(require("./audit.js"), exports);
29
+ __exportStar(require("./nonce-cache.js"), exports);
30
+ __exportStar(require("./signing.js"), exports);
31
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,6CAA2B;AAC3B,oDAAkC;AAClC,gDAA8B;AAC9B,kDAAgC;AAChC,mDAAiC;AACjC,mDAAiC;AACjC,qDAAmC;AACnC,8CAA4B;AAC5B,4CAA0B;AAC1B,8CAA4B;AAC5B,6CAA2B;AAC3B,6CAA2B;AAC3B,mDAAiC;AACjC,+CAA6B"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Minimal JSONPath accessor.
3
+ * Supports dot access and array indexes only:
4
+ * $.payload.amount_minor
5
+ * $.payload.items[0].sku
6
+ */
7
+ export declare function jsonPathGet(obj: unknown, path: string): unknown;
8
+ //# sourceMappingURL=jsonpath.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jsonpath.d.ts","sourceRoot":"","sources":["../src/jsonpath.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAoB/D"}
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.jsonPathGet = jsonPathGet;
4
+ /**
5
+ * Minimal JSONPath accessor.
6
+ * Supports dot access and array indexes only:
7
+ * $.payload.amount_minor
8
+ * $.payload.items[0].sku
9
+ */
10
+ function jsonPathGet(obj, path) {
11
+ if (!path.startsWith('$.')) {
12
+ throw new Error(`Invalid JSONPath: must start with "$." — got "${path}"`);
13
+ }
14
+ const stripped = path.slice(2); // remove "$."
15
+ const segments = parseSegments(stripped);
16
+ let current = obj;
17
+ for (const seg of segments) {
18
+ if (current === null || current === undefined)
19
+ return undefined;
20
+ if (seg.type === 'key') {
21
+ if (typeof current !== 'object')
22
+ return undefined;
23
+ current = current[seg.value];
24
+ }
25
+ else {
26
+ if (!Array.isArray(current))
27
+ return undefined;
28
+ current = current[seg.value];
29
+ }
30
+ }
31
+ return current;
32
+ }
33
+ function parseSegments(path) {
34
+ const segments = [];
35
+ const re = /([a-zA-Z_][a-zA-Z0-9_]*)|\[(\d+)\]|\./g;
36
+ let m;
37
+ while ((m = re.exec(path)) !== null) {
38
+ if (m[1] !== undefined) {
39
+ segments.push({ type: 'key', value: m[1] });
40
+ }
41
+ else if (m[2] !== undefined) {
42
+ segments.push({ type: 'index', value: parseInt(m[2], 10) });
43
+ }
44
+ // dots are just separators
45
+ }
46
+ return segments;
47
+ }
48
+ //# sourceMappingURL=jsonpath.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jsonpath.js","sourceRoot":"","sources":["../src/jsonpath.ts"],"names":[],"mappings":";;AAMA,kCAoBC;AA1BD;;;;;GAKG;AACH,SAAgB,WAAW,CAAC,GAAY,EAAE,IAAY;IACpD,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CAAC,iDAAiD,IAAI,GAAG,CAAC,CAAC;IAC5E,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,cAAc;IAC9C,MAAM,QAAQ,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC;IAEzC,IAAI,OAAO,GAAY,GAAG,CAAC;IAC3B,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC3B,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,KAAK,SAAS;YAAE,OAAO,SAAS,CAAC;QAChE,IAAI,GAAG,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;YACvB,IAAI,OAAO,OAAO,KAAK,QAAQ;gBAAE,OAAO,SAAS,CAAC;YAClD,OAAO,GAAI,OAAmC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAC5D,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;gBAAE,OAAO,SAAS,CAAC;YAC9C,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAMD,SAAS,aAAa,CAAC,IAAY;IACjC,MAAM,QAAQ,GAAc,EAAE,CAAC;IAC/B,MAAM,EAAE,GAAG,wCAAwC,CAAC;IACpD,IAAI,CAAyB,CAAC;IAE9B,OAAO,CAAC,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QACpC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,SAAS,EAAE,CAAC;YACvB,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAC9C,CAAC;aAAM,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,SAAS,EAAE,CAAC;YAC9B,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;QAC9D,CAAC;QACD,2BAA2B;IAC7B,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC"}
package/dist/keys.d.ts ADDED
@@ -0,0 +1,9 @@
1
+ import * as crypto from 'node:crypto';
2
+ import type { ServerKeyFile } from './types.js';
3
+ export declare function generateSigningKey(): ServerKeyFile;
4
+ export declare function writeKeyFile(dataDir: string, key: ServerKeyFile): void;
5
+ export declare function readKeyFile(dataDir: string, kid: string): ServerKeyFile;
6
+ export declare function getPrivateKeyObject(key: ServerKeyFile): crypto.KeyObject;
7
+ export declare function getPublicKeyObject(key: ServerKeyFile): crypto.KeyObject;
8
+ export declare function getPublicKeyObjectFromB64(publicKeyB64: string): crypto.KeyObject;
9
+ //# sourceMappingURL=keys.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keys.d.ts","sourceRoot":"","sources":["../src/keys.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,aAAa,CAAC;AAGtC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,wBAAgB,kBAAkB,IAAI,aAAa,CAclD;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,aAAa,GAAG,IAAI,CAKtE;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,aAAa,CAGvE;AAED,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,aAAa,GAAG,MAAM,CAAC,SAAS,CAGxE;AAED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,aAAa,GAAG,MAAM,CAAC,SAAS,CAGvE;AAED,wBAAgB,yBAAyB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAAC,SAAS,CAGhF"}
package/dist/keys.js ADDED
@@ -0,0 +1,80 @@
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.generateSigningKey = generateSigningKey;
37
+ exports.writeKeyFile = writeKeyFile;
38
+ exports.readKeyFile = readKeyFile;
39
+ exports.getPrivateKeyObject = getPrivateKeyObject;
40
+ exports.getPublicKeyObject = getPublicKeyObject;
41
+ exports.getPublicKeyObjectFromB64 = getPublicKeyObjectFromB64;
42
+ const crypto = __importStar(require("node:crypto"));
43
+ const fs = __importStar(require("node:fs"));
44
+ const path = __importStar(require("node:path"));
45
+ function generateSigningKey() {
46
+ const kid = crypto.randomUUID();
47
+ const keypair = crypto.generateKeyPairSync('ed25519');
48
+ const publicKeyDer = keypair.publicKey.export({ type: 'spki', format: 'der' });
49
+ const privateKeyDer = keypair.privateKey.export({ type: 'pkcs8', format: 'der' });
50
+ return {
51
+ kid,
52
+ public_key_b64: publicKeyDer.toString('base64'),
53
+ private_key_b64: privateKeyDer.toString('base64'),
54
+ created_at: new Date().toISOString(),
55
+ revoked_at: null,
56
+ };
57
+ }
58
+ function writeKeyFile(dataDir, key) {
59
+ const keysDir = path.join(dataDir, 'keys');
60
+ fs.mkdirSync(keysDir, { recursive: true });
61
+ const filePath = path.join(keysDir, `${key.kid}.json`);
62
+ fs.writeFileSync(filePath, JSON.stringify(key, null, 2), 'utf-8');
63
+ }
64
+ function readKeyFile(dataDir, kid) {
65
+ const filePath = path.join(dataDir, 'keys', `${kid}.json`);
66
+ return JSON.parse(fs.readFileSync(filePath, 'utf-8'));
67
+ }
68
+ function getPrivateKeyObject(key) {
69
+ const der = Buffer.from(key.private_key_b64, 'base64');
70
+ return crypto.createPrivateKey({ key: der, format: 'der', type: 'pkcs8' });
71
+ }
72
+ function getPublicKeyObject(key) {
73
+ const der = Buffer.from(key.public_key_b64, 'base64');
74
+ return crypto.createPublicKey({ key: der, format: 'der', type: 'spki' });
75
+ }
76
+ function getPublicKeyObjectFromB64(publicKeyB64) {
77
+ const der = Buffer.from(publicKeyB64, 'base64');
78
+ return crypto.createPublicKey({ key: der, format: 'der', type: 'spki' });
79
+ }
80
+ //# sourceMappingURL=keys.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keys.js","sourceRoot":"","sources":["../src/keys.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAKA,gDAcC;AAED,oCAKC;AAED,kCAGC;AAED,kDAGC;AAED,gDAGC;AAED,8DAGC;AA9CD,oDAAsC;AACtC,4CAA8B;AAC9B,gDAAkC;AAGlC,SAAgB,kBAAkB;IAChC,MAAM,GAAG,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC;IAChC,MAAM,OAAO,GAAG,MAAM,CAAC,mBAAmB,CAAC,SAAS,CAAC,CAAC;IAEtD,MAAM,YAAY,GAAG,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;IAC/E,MAAM,aAAa,GAAG,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;IAElF,OAAO;QACL,GAAG;QACH,cAAc,EAAE,YAAY,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAC/C,eAAe,EAAE,aAAa,CAAC,QAAQ,CAAC,QAAQ,CAAC;QACjD,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACpC,UAAU,EAAE,IAAI;KACjB,CAAC;AACJ,CAAC;AAED,SAAgB,YAAY,CAAC,OAAe,EAAE,GAAkB;IAC9D,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAC3C,EAAE,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC;IACvD,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;AACpE,CAAC;AAED,SAAgB,WAAW,CAAC,OAAe,EAAE,GAAW;IACtD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,GAAG,OAAO,CAAC,CAAC;IAC3D,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;AACxD,CAAC;AAED,SAAgB,mBAAmB,CAAC,GAAkB;IACpD,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,eAAe,EAAE,QAAQ,CAAC,CAAC;IACvD,OAAO,MAAM,CAAC,gBAAgB,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;AAC7E,CAAC;AAED,SAAgB,kBAAkB,CAAC,GAAkB;IACnD,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAC;IACtD,OAAO,MAAM,CAAC,eAAe,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;AAC3E,CAAC;AAED,SAAgB,yBAAyB,CAAC,YAAoB;IAC5D,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;IAChD,OAAO,MAAM,CAAC,eAAe,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;AAC3E,CAAC"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * In-memory TTL nonce cache for replay protection.
3
+ */
4
+ export declare class NonceCache {
5
+ private cache;
6
+ private ttlMs;
7
+ private cleanupInterval;
8
+ constructor(ttlSeconds?: number);
9
+ /**
10
+ * Check if nonce has been seen. Returns true if nonce is fresh (not seen before).
11
+ * Returns false if nonce is a replay.
12
+ */
13
+ check(agentId: string, nonce: string): boolean;
14
+ private cleanup;
15
+ destroy(): void;
16
+ }
17
+ //# sourceMappingURL=nonce-cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nonce-cache.d.ts","sourceRoot":"","sources":["../src/nonce-cache.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,KAAK,CAA6B;IAC1C,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,eAAe,CAA+C;gBAE1D,UAAU,GAAE,MAAY;IAUpC;;;OAGG;IACH,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO;IAe9C,OAAO,CAAC,OAAO;IASf,OAAO,IAAI,IAAI;CAOhB"}
@@ -0,0 +1,53 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.NonceCache = void 0;
4
+ /**
5
+ * In-memory TTL nonce cache for replay protection.
6
+ */
7
+ class NonceCache {
8
+ cache = new Map(); // nonce -> expiry timestamp
9
+ ttlMs;
10
+ cleanupInterval = null;
11
+ constructor(ttlSeconds = 600) {
12
+ this.ttlMs = ttlSeconds * 1000;
13
+ // Periodic cleanup every 60 seconds
14
+ this.cleanupInterval = setInterval(() => this.cleanup(), 60_000);
15
+ // Allow Node to exit even if interval is running
16
+ if (this.cleanupInterval.unref) {
17
+ this.cleanupInterval.unref();
18
+ }
19
+ }
20
+ /**
21
+ * Check if nonce has been seen. Returns true if nonce is fresh (not seen before).
22
+ * Returns false if nonce is a replay.
23
+ */
24
+ check(agentId, nonce) {
25
+ const key = `${agentId}:${nonce}`;
26
+ const now = Date.now();
27
+ // Check if nonce exists and hasn't expired
28
+ const expiry = this.cache.get(key);
29
+ if (expiry !== undefined && expiry > now) {
30
+ return false; // replay
31
+ }
32
+ // Store nonce
33
+ this.cache.set(key, now + this.ttlMs);
34
+ return true; // fresh
35
+ }
36
+ cleanup() {
37
+ const now = Date.now();
38
+ for (const [key, expiry] of this.cache) {
39
+ if (expiry <= now) {
40
+ this.cache.delete(key);
41
+ }
42
+ }
43
+ }
44
+ destroy() {
45
+ if (this.cleanupInterval) {
46
+ clearInterval(this.cleanupInterval);
47
+ this.cleanupInterval = null;
48
+ }
49
+ this.cache.clear();
50
+ }
51
+ }
52
+ exports.NonceCache = NonceCache;
53
+ //# sourceMappingURL=nonce-cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nonce-cache.js","sourceRoot":"","sources":["../src/nonce-cache.ts"],"names":[],"mappings":";;;AAAA;;GAEG;AACH,MAAa,UAAU;IACb,KAAK,GAAG,IAAI,GAAG,EAAkB,CAAC,CAAC,4BAA4B;IAC/D,KAAK,CAAS;IACd,eAAe,GAA0C,IAAI,CAAC;IAEtE,YAAY,aAAqB,GAAG;QAClC,IAAI,CAAC,KAAK,GAAG,UAAU,GAAG,IAAI,CAAC;QAC/B,oCAAoC;QACpC,IAAI,CAAC,eAAe,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,MAAM,CAAC,CAAC;QACjE,iDAAiD;QACjD,IAAI,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,CAAC;YAC/B,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,CAAC;QAC/B,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,OAAe,EAAE,KAAa;QAClC,MAAM,GAAG,GAAG,GAAG,OAAO,IAAI,KAAK,EAAE,CAAC;QAClC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAEvB,2CAA2C;QAC3C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACnC,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,GAAG,GAAG,EAAE,CAAC;YACzC,OAAO,KAAK,CAAC,CAAC,SAAS;QACzB,CAAC;QAED,cAAc;QACd,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;QACtC,OAAO,IAAI,CAAC,CAAC,QAAQ;IACvB,CAAC;IAEO,OAAO;QACb,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,KAAK,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACvC,IAAI,MAAM,IAAI,GAAG,EAAE,CAAC;gBAClB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACzB,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO;QACL,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YACzB,aAAa,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;YACpC,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;QAC9B,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC;CACF;AAlDD,gCAkDC"}
@@ -0,0 +1,9 @@
1
+ import type { ActionRequest, DecisionResult, Obligation, PolicyObligation, PolicyRequirements } from './types.js';
2
+ /**
3
+ * Compute obligations from rule obligations + requirements, then derive decision.
4
+ */
5
+ export declare function computeObligationsAndDecision(ruleObligations: PolicyObligation[] | undefined, requirements: PolicyRequirements | undefined, action: ActionRequest): {
6
+ result: DecisionResult;
7
+ obligations: Obligation[];
8
+ };
9
+ //# sourceMappingURL=obligations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"obligations.d.ts","sourceRoot":"","sources":["../src/obligations.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,aAAa,EACb,cAAc,EACd,UAAU,EACV,gBAAgB,EAChB,kBAAkB,EACnB,MAAM,YAAY,CAAC;AAQpB;;GAEG;AACH,wBAAgB,6BAA6B,CAC3C,eAAe,EAAE,gBAAgB,EAAE,GAAG,SAAS,EAC/C,YAAY,EAAE,kBAAkB,GAAG,SAAS,EAC5C,MAAM,EAAE,aAAa,GACpB;IAAE,MAAM,EAAE,cAAc,CAAC;IAAC,WAAW,EAAE,UAAU,EAAE,CAAA;CAAE,CA6CvD"}
@@ -0,0 +1,89 @@
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.computeObligationsAndDecision = computeObligationsAndDecision;
37
+ const crypto = __importStar(require("node:crypto"));
38
+ const ASSURANCE_ORDER = {
39
+ LOW: 0,
40
+ SUBSTANTIAL: 1,
41
+ HIGH: 2,
42
+ };
43
+ /**
44
+ * Compute obligations from rule obligations + requirements, then derive decision.
45
+ */
46
+ function computeObligationsAndDecision(ruleObligations, requirements, action) {
47
+ const obligations = [];
48
+ // Collect explicit obligations from rule
49
+ if (ruleObligations) {
50
+ for (const ob of ruleObligations) {
51
+ obligations.push({
52
+ obligation_id: crypto.randomUUID(),
53
+ type: ob.type,
54
+ status: 'PENDING',
55
+ details_json: ob.params ?? {},
56
+ });
57
+ }
58
+ }
59
+ // Check requirements -> may add STEP_UP_AUTH obligation
60
+ if (requirements?.min_assurance_level) {
61
+ const required = requirements.min_assurance_level;
62
+ const actual = action.payload.assurance_level || 'LOW';
63
+ const requiredLevel = ASSURANCE_ORDER[required] ?? 0;
64
+ const actualLevel = ASSURANCE_ORDER[actual] ?? 0;
65
+ if (actualLevel < requiredLevel) {
66
+ obligations.push({
67
+ obligation_id: crypto.randomUUID(),
68
+ type: 'STEP_UP_AUTH',
69
+ status: 'PENDING',
70
+ details_json: { min_assurance_level: required },
71
+ });
72
+ }
73
+ }
74
+ // Determine decision from obligations (blocking precedence)
75
+ const types = new Set(obligations.map((o) => o.type));
76
+ let result = 'ALLOW';
77
+ if (types.has('HUMAN_APPROVAL')) {
78
+ result = 'REQUIRE_APPROVAL';
79
+ }
80
+ else if (types.has('STEP_UP_AUTH')) {
81
+ result = 'REQUIRE_STEP_UP';
82
+ }
83
+ else if (types.has('DEPOSIT')) {
84
+ result = 'REQUIRE_DEPOSIT';
85
+ }
86
+ // COUNTERPARTY_ATTESTATION is non-blocking: result stays ALLOW
87
+ return { result, obligations };
88
+ }
89
+ //# sourceMappingURL=obligations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"obligations.js","sourceRoot":"","sources":["../src/obligations.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkBA,sEAiDC;AAnED,oDAAsC;AAStC,MAAM,eAAe,GAA2B;IAC9C,GAAG,EAAE,CAAC;IACN,WAAW,EAAE,CAAC;IACd,IAAI,EAAE,CAAC;CACR,CAAC;AAEF;;GAEG;AACH,SAAgB,6BAA6B,CAC3C,eAA+C,EAC/C,YAA4C,EAC5C,MAAqB;IAErB,MAAM,WAAW,GAAiB,EAAE,CAAC;IAErC,yCAAyC;IACzC,IAAI,eAAe,EAAE,CAAC;QACpB,KAAK,MAAM,EAAE,IAAI,eAAe,EAAE,CAAC;YACjC,WAAW,CAAC,IAAI,CAAC;gBACf,aAAa,EAAE,MAAM,CAAC,UAAU,EAAE;gBAClC,IAAI,EAAE,EAAE,CAAC,IAA0B;gBACnC,MAAM,EAAE,SAAS;gBACjB,YAAY,EAAE,EAAE,CAAC,MAAM,IAAI,EAAE;aAC9B,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,wDAAwD;IACxD,IAAI,YAAY,EAAE,mBAAmB,EAAE,CAAC;QACtC,MAAM,QAAQ,GAAG,YAAY,CAAC,mBAAmB,CAAC;QAClD,MAAM,MAAM,GAAI,MAAM,CAAC,OAAO,CAAC,eAA0B,IAAI,KAAK,CAAC;QACnE,MAAM,aAAa,GAAG,eAAe,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QACrD,MAAM,WAAW,GAAG,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACjD,IAAI,WAAW,GAAG,aAAa,EAAE,CAAC;YAChC,WAAW,CAAC,IAAI,CAAC;gBACf,aAAa,EAAE,MAAM,CAAC,UAAU,EAAE;gBAClC,IAAI,EAAE,cAAc;gBACpB,MAAM,EAAE,SAAS;gBACjB,YAAY,EAAE,EAAE,mBAAmB,EAAE,QAAQ,EAAE;aAChD,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,4DAA4D;IAC5D,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAEtD,IAAI,MAAM,GAAmB,OAAO,CAAC;IACrC,IAAI,KAAK,CAAC,GAAG,CAAC,gBAAgB,CAAC,EAAE,CAAC;QAChC,MAAM,GAAG,kBAAkB,CAAC;IAC9B,CAAC;SAAM,IAAI,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,CAAC;QACrC,MAAM,GAAG,iBAAiB,CAAC;IAC7B,CAAC;SAAM,IAAI,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;QAChC,MAAM,GAAG,iBAAiB,CAAC;IAC7B,CAAC;IACD,+DAA+D;IAE/D,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;AACjC,CAAC"}