@highflame/policy 1.2.0 → 2.0.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 (74) hide show
  1. package/README.md +219 -0
  2. package/_schemas/overwatch/context.json +463 -0
  3. package/_schemas/overwatch/schema.cedarschema +184 -0
  4. package/_schemas/palisade/context.json +325 -0
  5. package/_schemas/palisade/schema.cedarschema +168 -0
  6. package/dist/builder.d.ts +1 -2
  7. package/dist/builder.d.ts.map +1 -1
  8. package/dist/builder.js.map +1 -1
  9. package/dist/context.gen.d.ts +1 -94
  10. package/dist/context.gen.d.ts.map +1 -1
  11. package/dist/context.gen.js +1 -97
  12. package/dist/context.gen.js.map +1 -1
  13. package/dist/engine.d.ts +18 -18
  14. package/dist/engine.d.ts.map +1 -1
  15. package/dist/engine.js +44 -28
  16. package/dist/engine.js.map +1 -1
  17. package/dist/engine.test.js.map +1 -1
  18. package/dist/entities.gen.d.ts +1 -0
  19. package/dist/entities.gen.d.ts.map +1 -1
  20. package/dist/entities.gen.js +1 -0
  21. package/dist/entities.gen.js.map +1 -1
  22. package/dist/errors.d.ts +102 -0
  23. package/dist/errors.d.ts.map +1 -0
  24. package/dist/errors.js +127 -0
  25. package/dist/errors.js.map +1 -0
  26. package/dist/index.d.ts +2 -0
  27. package/dist/index.d.ts.map +1 -1
  28. package/dist/index.js +2 -0
  29. package/dist/index.js.map +1 -1
  30. package/dist/overwatch-context.gen.d.ts +31 -0
  31. package/dist/overwatch-context.gen.d.ts.map +1 -0
  32. package/dist/overwatch-context.gen.js +32 -0
  33. package/dist/overwatch-context.gen.js.map +1 -0
  34. package/dist/palisade-context.gen.d.ts +25 -0
  35. package/dist/palisade-context.gen.d.ts.map +1 -0
  36. package/dist/palisade-context.gen.js +26 -0
  37. package/dist/palisade-context.gen.js.map +1 -0
  38. package/dist/parser.d.ts.map +1 -1
  39. package/dist/parser.js +79 -34
  40. package/dist/parser.js.map +1 -1
  41. package/dist/parser.test.js +44 -0
  42. package/dist/parser.test.js.map +1 -1
  43. package/dist/schema.gen.d.ts +1 -1
  44. package/dist/schema.gen.d.ts.map +1 -1
  45. package/dist/schema.gen.js +60 -541
  46. package/dist/schema.gen.js.map +1 -1
  47. package/dist/schemas.d.ts +64 -0
  48. package/dist/schemas.d.ts.map +1 -0
  49. package/dist/schemas.js +70 -0
  50. package/dist/schemas.js.map +1 -0
  51. package/dist/schemas.test.d.ts +8 -0
  52. package/dist/schemas.test.d.ts.map +1 -0
  53. package/dist/schemas.test.js +381 -0
  54. package/dist/schemas.test.js.map +1 -0
  55. package/dist/types.d.ts +1 -0
  56. package/dist/types.d.ts.map +1 -1
  57. package/dist/types.js +2 -0
  58. package/dist/types.js.map +1 -1
  59. package/package.json +13 -6
  60. package/src/builder.ts +1 -2
  61. package/src/context.gen.ts +0 -97
  62. package/src/engine.test.ts +0 -1
  63. package/src/engine.ts +62 -33
  64. package/src/entities.gen.ts +1 -0
  65. package/src/errors.ts +195 -0
  66. package/src/index.ts +2 -0
  67. package/src/overwatch-context.gen.ts +34 -0
  68. package/src/palisade-context.gen.ts +28 -0
  69. package/src/parser.test.ts +53 -0
  70. package/src/parser.ts +83 -36
  71. package/src/schema.gen.ts +60 -541
  72. package/src/schemas.test.ts +449 -0
  73. package/src/schemas.ts +91 -0
  74. package/src/types.ts +3 -0
@@ -0,0 +1,64 @@
1
+ /**
2
+ * Service-specific Cedar schemas and context metadata
3
+ *
4
+ * This module provides access to service-specific Cedar schemas
5
+ * and their associated context metadata for UI builders.
6
+ *
7
+ * Schemas are bundled with the package and loaded at runtime. The schema
8
+ * files are copied from schemas/ to packages/typescript/_schemas/ during
9
+ * codegen (see Makefile). This ensures the package is self-contained and
10
+ * works correctly when installed from npm.
11
+ *
12
+ * Available Schemas:
13
+ * - Overwatch (Guardian): IDE security policies for LLM agents and tool calls
14
+ * - Palisade: ML supply chain security policies for artifact scanning
15
+ *
16
+ * @example
17
+ * ```typescript
18
+ * import { OVERWATCH_SCHEMA, OVERWATCH_CONTEXT } from '@highflame/policy/schemas';
19
+ * import { PolicyEngine } from '@highflame/policy';
20
+ *
21
+ * const engine = new PolicyEngine();
22
+ * engine.loadSchema(OVERWATCH_SCHEMA);
23
+ *
24
+ * // Parse context metadata for UI dropdowns
25
+ * const contextMeta = JSON.parse(OVERWATCH_CONTEXT);
26
+ * ```
27
+ */
28
+ export { OverwatchContextKey } from './overwatch-context.gen.js';
29
+ export { PalisadeContextKey } from './palisade-context.gen.js';
30
+ export type { OverwatchContextKey as OverwatchContextKeyType } from './overwatch-context.gen.js';
31
+ export type { PalisadeContextKey as PalisadeContextKeyType } from './palisade-context.gen.js';
32
+ /**
33
+ * Overwatch (Guardian) Cedar schema
34
+ *
35
+ * Full Cedar schema for IDE security, including:
36
+ * - Actions: process_prompt, call_tool, connect_server, read_file, write_file
37
+ * - Entities: User, Agent, LlmPrompt, Tool, Server, FilePath
38
+ * - 20+ context attributes for threat detection and workspace security
39
+ */
40
+ export declare const OVERWATCH_SCHEMA: string;
41
+ /**
42
+ * Overwatch context metadata (JSON)
43
+ *
44
+ * Metadata describing available context attributes for each Overwatch action.
45
+ * Used by PolicyBuilder UI to generate context dropdowns with type information.
46
+ */
47
+ export declare const OVERWATCH_CONTEXT: string;
48
+ /**
49
+ * Palisade Cedar schema
50
+ *
51
+ * Full Cedar schema for ML supply chain security, including:
52
+ * - Actions: scan_artifact, validate_integrity, validate_provenance, quarantine_artifact, load_model, deploy_model
53
+ * - Entities: Scanner, Artifact, Package
54
+ * - 15+ context attributes for ML security findings
55
+ */
56
+ export declare const PALISADE_SCHEMA: string;
57
+ /**
58
+ * Palisade context metadata (JSON)
59
+ *
60
+ * Metadata describing available context attributes for each Palisade action.
61
+ * Used by PolicyBuilder UI to generate context dropdowns with type information.
62
+ */
63
+ export declare const PALISADE_CONTEXT: string;
64
+ //# sourceMappingURL=schemas.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schemas.d.ts","sourceRoot":"","sources":["../src/schemas.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAaH,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,YAAY,EAAE,mBAAmB,IAAI,uBAAuB,EAAE,MAAM,4BAA4B,CAAC;AACjG,YAAY,EAAE,kBAAkB,IAAI,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AAE9F;;;;;;;GAOG;AACH,eAAO,MAAM,gBAAgB,QAG5B,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,iBAAiB,QAG7B,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,eAAe,QAG3B,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,gBAAgB,QAG5B,CAAC"}
@@ -0,0 +1,70 @@
1
+ /**
2
+ * Service-specific Cedar schemas and context metadata
3
+ *
4
+ * This module provides access to service-specific Cedar schemas
5
+ * and their associated context metadata for UI builders.
6
+ *
7
+ * Schemas are bundled with the package and loaded at runtime. The schema
8
+ * files are copied from schemas/ to packages/typescript/_schemas/ during
9
+ * codegen (see Makefile). This ensures the package is self-contained and
10
+ * works correctly when installed from npm.
11
+ *
12
+ * Available Schemas:
13
+ * - Overwatch (Guardian): IDE security policies for LLM agents and tool calls
14
+ * - Palisade: ML supply chain security policies for artifact scanning
15
+ *
16
+ * @example
17
+ * ```typescript
18
+ * import { OVERWATCH_SCHEMA, OVERWATCH_CONTEXT } from '@highflame/policy/schemas';
19
+ * import { PolicyEngine } from '@highflame/policy';
20
+ *
21
+ * const engine = new PolicyEngine();
22
+ * engine.loadSchema(OVERWATCH_SCHEMA);
23
+ *
24
+ * // Parse context metadata for UI dropdowns
25
+ * const contextMeta = JSON.parse(OVERWATCH_CONTEXT);
26
+ * ```
27
+ */
28
+ import * as fs from 'fs';
29
+ import * as path from 'path';
30
+ import { fileURLToPath } from 'url';
31
+ const __filename = fileURLToPath(import.meta.url);
32
+ const __dirname = path.dirname(__filename);
33
+ // Path to schemas directory (bundled with package)
34
+ const SCHEMAS_DIR = path.join(__dirname, '..', '_schemas');
35
+ // Re-export service-specific context keys
36
+ export { OverwatchContextKey } from './overwatch-context.gen.js';
37
+ export { PalisadeContextKey } from './palisade-context.gen.js';
38
+ /**
39
+ * Overwatch (Guardian) Cedar schema
40
+ *
41
+ * Full Cedar schema for IDE security, including:
42
+ * - Actions: process_prompt, call_tool, connect_server, read_file, write_file
43
+ * - Entities: User, Agent, LlmPrompt, Tool, Server, FilePath
44
+ * - 20+ context attributes for threat detection and workspace security
45
+ */
46
+ export const OVERWATCH_SCHEMA = fs.readFileSync(path.join(SCHEMAS_DIR, 'overwatch', 'schema.cedarschema'), 'utf-8');
47
+ /**
48
+ * Overwatch context metadata (JSON)
49
+ *
50
+ * Metadata describing available context attributes for each Overwatch action.
51
+ * Used by PolicyBuilder UI to generate context dropdowns with type information.
52
+ */
53
+ export const OVERWATCH_CONTEXT = fs.readFileSync(path.join(SCHEMAS_DIR, 'overwatch', 'context.json'), 'utf-8');
54
+ /**
55
+ * Palisade Cedar schema
56
+ *
57
+ * Full Cedar schema for ML supply chain security, including:
58
+ * - Actions: scan_artifact, validate_integrity, validate_provenance, quarantine_artifact, load_model, deploy_model
59
+ * - Entities: Scanner, Artifact, Package
60
+ * - 15+ context attributes for ML security findings
61
+ */
62
+ export const PALISADE_SCHEMA = fs.readFileSync(path.join(SCHEMAS_DIR, 'palisade', 'schema.cedarschema'), 'utf-8');
63
+ /**
64
+ * Palisade context metadata (JSON)
65
+ *
66
+ * Metadata describing available context attributes for each Palisade action.
67
+ * Used by PolicyBuilder UI to generate context dropdowns with type information.
68
+ */
69
+ export const PALISADE_CONTEXT = fs.readFileSync(path.join(SCHEMAS_DIR, 'palisade', 'context.json'), 'utf-8');
70
+ //# sourceMappingURL=schemas.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schemas.js","sourceRoot":"","sources":["../src/schemas.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AAEpC,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;AAE3C,mDAAmD;AACnD,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC;AAE3D,0CAA0C;AAC1C,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAI/D;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,EAAE,CAAC,YAAY,CAC7C,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,EAAE,oBAAoB,CAAC,EACzD,OAAO,CACR,CAAC;AAEF;;;;;GAKG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,EAAE,CAAC,YAAY,CAC9C,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,EAAE,cAAc,CAAC,EACnD,OAAO,CACR,CAAC;AAEF;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,EAAE,CAAC,YAAY,CAC5C,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,UAAU,EAAE,oBAAoB,CAAC,EACxD,OAAO,CACR,CAAC;AAEF;;;;;GAKG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,EAAE,CAAC,YAAY,CAC7C,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,UAAU,EAAE,cAAc,CAAC,EAClD,OAAO,CACR,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Schema validation tests
3
+ *
4
+ * Tests service-specific schema loading and policy validation
5
+ * using Overwatch (Guardian) and Palisade schemas.
6
+ */
7
+ export {};
8
+ //# sourceMappingURL=schemas.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schemas.test.d.ts","sourceRoot":"","sources":["../src/schemas.test.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
@@ -0,0 +1,381 @@
1
+ /**
2
+ * Schema validation tests
3
+ *
4
+ * Tests service-specific schema loading and policy validation
5
+ * using Overwatch (Guardian) and Palisade schemas.
6
+ */
7
+ import { describe, it, expect, beforeEach } from 'vitest';
8
+ import { PolicyEngine, PolicyValidator, newEntityUID, newEntity, } from './index.js';
9
+ import * as fs from 'fs';
10
+ import * as path from 'path';
11
+ // Load service-specific schemas
12
+ const SCHEMAS_DIR = path.join(__dirname, '..', '..', '..', 'schemas');
13
+ const OVERWATCH_SCHEMA = fs.readFileSync(path.join(SCHEMAS_DIR, 'overwatch', 'schema.cedarschema'), 'utf-8');
14
+ const PALISADE_SCHEMA = fs.readFileSync(path.join(SCHEMAS_DIR, 'palisade', 'schema.cedarschema'), 'utf-8');
15
+ describe('Service-Specific Schemas', () => {
16
+ describe('Schema Loading', () => {
17
+ it('should load Overwatch schema successfully', () => {
18
+ expect(OVERWATCH_SCHEMA).toBeTruthy();
19
+ expect(OVERWATCH_SCHEMA).toContain('namespace');
20
+ expect(OVERWATCH_SCHEMA).toContain('Overwatch');
21
+ });
22
+ it('should load Palisade schema successfully', () => {
23
+ expect(PALISADE_SCHEMA).toBeTruthy();
24
+ expect(PALISADE_SCHEMA).toContain('namespace');
25
+ expect(PALISADE_SCHEMA).toContain('Palisade');
26
+ });
27
+ });
28
+ describe('Overwatch Schema Validation', () => {
29
+ let validator;
30
+ beforeEach(() => {
31
+ validator = new PolicyValidator(OVERWATCH_SCHEMA);
32
+ });
33
+ it('should validate a correct Overwatch policy', () => {
34
+ const validPolicy = `
35
+ permit(
36
+ principal is Overwatch::User,
37
+ action == Overwatch::Action::"call_tool",
38
+ resource is Overwatch::Tool
39
+ )
40
+ when {
41
+ context.threat_count < 5 &&
42
+ context.highest_severity != "critical"
43
+ };
44
+ `;
45
+ const result = validator.validate(validPolicy);
46
+ if (!result.valid) {
47
+ console.log('Validation errors:', result.errors);
48
+ }
49
+ expect(result.valid).toBe(true);
50
+ expect(result.errors).toHaveLength(0);
51
+ });
52
+ it('should reject policy with invalid entity type', () => {
53
+ const invalidPolicy = `
54
+ permit(
55
+ principal is Overwatch::NonExistentEntity,
56
+ action == Overwatch::Action::"call_tool",
57
+ resource is Overwatch::Tool
58
+ );
59
+ `;
60
+ const result = validator.validate(invalidPolicy);
61
+ expect(result.valid).toBe(false);
62
+ expect(result.errors.length).toBeGreaterThan(0);
63
+ });
64
+ it('should reject policy with invalid action', () => {
65
+ const invalidPolicy = `
66
+ permit(
67
+ principal is Overwatch::User,
68
+ action == Overwatch::Action::"invalid_action",
69
+ resource is Overwatch::Tool
70
+ );
71
+ `;
72
+ const result = validator.validate(invalidPolicy);
73
+ expect(result.valid).toBe(false);
74
+ expect(result.errors.length).toBeGreaterThan(0);
75
+ });
76
+ it('should validate policy with multiple context attributes', () => {
77
+ const policy = `
78
+ permit(
79
+ principal is Overwatch::Agent,
80
+ action == Overwatch::Action::"process_prompt",
81
+ resource is Overwatch::LlmPrompt
82
+ )
83
+ when {
84
+ context.threat_count == 0 &&
85
+ context.highest_severity == "low" &&
86
+ context.contains_secrets == false
87
+ };
88
+ `;
89
+ const result = validator.validate(policy);
90
+ expect(result.valid).toBe(true);
91
+ });
92
+ });
93
+ describe('Palisade Schema Validation', () => {
94
+ let validator;
95
+ beforeEach(() => {
96
+ validator = new PolicyValidator(PALISADE_SCHEMA);
97
+ });
98
+ it('should validate a correct Palisade policy', () => {
99
+ const validPolicy = `
100
+ permit(
101
+ principal is Palisade::Scanner,
102
+ action == Palisade::Action::"scan_artifact",
103
+ resource is Palisade::Artifact
104
+ )
105
+ when {
106
+ context.environment == "production" &&
107
+ context.artifact_format == "safetensors"
108
+ };
109
+ `;
110
+ const result = validator.validate(validPolicy);
111
+ expect(result.valid).toBe(true);
112
+ expect(result.errors).toHaveLength(0);
113
+ });
114
+ it('should reject policy with wrong namespace', () => {
115
+ const invalidPolicy = `
116
+ permit(
117
+ principal is Overwatch::Scanner,
118
+ action == Palisade::Action::"scan_artifact",
119
+ resource is Palisade::Artifact
120
+ );
121
+ `;
122
+ const result = validator.validate(invalidPolicy);
123
+ expect(result.valid).toBe(false);
124
+ });
125
+ it('should validate policy with ML-specific context', () => {
126
+ const policy = `
127
+ forbid(
128
+ principal is Palisade::Scanner,
129
+ action == Palisade::Action::"scan_artifact",
130
+ resource is Palisade::Artifact
131
+ )
132
+ when {
133
+ context.pickle_exec_path_detected == true ||
134
+ context.severity == "CRITICAL"
135
+ };
136
+ `;
137
+ const result = validator.validate(policy);
138
+ expect(result.valid).toBe(true);
139
+ });
140
+ });
141
+ describe('PolicyEngine with Service Schemas', () => {
142
+ it('should evaluate Overwatch policy correctly', () => {
143
+ const policy = `
144
+ permit(
145
+ principal is Overwatch::User,
146
+ action == Overwatch::Action::"call_tool",
147
+ resource is Overwatch::Tool
148
+ )
149
+ when { context.threat_count < 5 };
150
+ `;
151
+ const engine = new PolicyEngine({ schema: OVERWATCH_SCHEMA });
152
+ engine.loadPolicies(policy);
153
+ const entities = [
154
+ newEntity('Overwatch::User', 'mcp_client', { user_type: 'external', email: 'user@example.com' }),
155
+ newEntity('Overwatch::Tool', 'shell', { tool_name: 'shell', risk_level: 'high' }),
156
+ ];
157
+ const decision = engine.evaluate({
158
+ principal: newEntityUID('Overwatch::User', 'mcp_client'),
159
+ action: 'Overwatch::Action::"call_tool"',
160
+ resource: newEntityUID('Overwatch::Tool', 'shell'),
161
+ context: {
162
+ content: 'ls -la',
163
+ source: 'claudecode',
164
+ event: 'PreToolUse',
165
+ user_email: 'user@example.com',
166
+ tool_name: 'shell',
167
+ mcp_server: 'filesystem',
168
+ mcp_tool: 'shell',
169
+ server_name: 'filesystem',
170
+ path: '/workspace',
171
+ file_path: '/workspace',
172
+ cwd: '/workspace',
173
+ workspace_root: '/workspace',
174
+ threat_count: 3,
175
+ highest_severity: 'low',
176
+ threat_categories: [],
177
+ threat_types: [],
178
+ yara_threats: [],
179
+ max_threat_severity: 1,
180
+ contains_secrets: false,
181
+ response_content: '',
182
+ },
183
+ entities,
184
+ });
185
+ if (decision.effect !== 'Allow') {
186
+ console.log('Decision:', decision);
187
+ console.log('Reason:', decision.reason);
188
+ }
189
+ expect(decision.effect).toBe('Allow');
190
+ });
191
+ it('should deny Overwatch policy when context fails condition', () => {
192
+ const policy = `
193
+ permit(
194
+ principal is Overwatch::User,
195
+ action == Overwatch::Action::"call_tool",
196
+ resource is Overwatch::Tool
197
+ )
198
+ when { context.threat_count < 5 };
199
+ `;
200
+ const engine = new PolicyEngine({ schema: OVERWATCH_SCHEMA });
201
+ engine.loadPolicies(policy);
202
+ const entities = [
203
+ newEntity('Overwatch::User', 'mcp_client', { user_type: 'external', email: 'user@example.com' }),
204
+ newEntity('Overwatch::Tool', 'shell', { tool_name: 'shell', risk_level: 'high' }),
205
+ ];
206
+ const decision = engine.evaluate({
207
+ principal: newEntityUID('Overwatch::User', 'mcp_client'),
208
+ action: 'Overwatch::Action::"call_tool"',
209
+ resource: newEntityUID('Overwatch::Tool', 'shell'),
210
+ context: { threat_count: 10 }, // Too many threats
211
+ entities,
212
+ });
213
+ expect(decision.effect).toBe('Deny');
214
+ });
215
+ it('should evaluate Palisade policy correctly', () => {
216
+ const policy = `
217
+ forbid(
218
+ principal is Palisade::Scanner,
219
+ action == Palisade::Action::"load_model",
220
+ resource is Palisade::Artifact
221
+ )
222
+ when {
223
+ context.pickle_exec_path_detected == true
224
+ };
225
+ `;
226
+ const engine = new PolicyEngine({ schema: PALISADE_SCHEMA });
227
+ engine.loadPolicies(policy);
228
+ const entities = [
229
+ newEntity('Palisade::Scanner', 'palisade', { scanner_type: 'ml_security' }),
230
+ newEntity('Palisade::Artifact', 'model.pkl', { artifact_format: 'pickle', path: '/models/model.pkl', signed: false, signer: 'unsigned' }),
231
+ ];
232
+ const decision = engine.evaluate({
233
+ principal: newEntityUID('Palisade::Scanner', 'palisade'),
234
+ action: 'Palisade::Action::"load_model"',
235
+ resource: newEntityUID('Palisade::Artifact', 'model.pkl'),
236
+ context: {
237
+ environment: 'production',
238
+ pickle_exec_path_detected: true,
239
+ severity: 'CRITICAL',
240
+ },
241
+ entities,
242
+ });
243
+ expect(decision.effect).toBe('Deny');
244
+ });
245
+ it('should allow Palisade policy when condition is false', () => {
246
+ const policy = `
247
+ permit(
248
+ principal is Palisade::Scanner,
249
+ action == Palisade::Action::"scan_artifact",
250
+ resource is Palisade::Artifact
251
+ );
252
+
253
+ forbid(
254
+ principal is Palisade::Scanner,
255
+ action == Palisade::Action::"scan_artifact",
256
+ resource is Palisade::Artifact
257
+ )
258
+ when {
259
+ context.pickle_exec_path_detected == true
260
+ };
261
+ `;
262
+ const engine = new PolicyEngine({ schema: PALISADE_SCHEMA });
263
+ engine.loadPolicies(policy);
264
+ const entities = [
265
+ newEntity('Palisade::Scanner', 'palisade', { scanner_type: 'ml_security' }),
266
+ newEntity('Palisade::Artifact', 'model.safetensors', { artifact_format: 'safetensors', path: '/models/model.safetensors', signed: true, signer: 'trusted-org' }),
267
+ ];
268
+ const decision = engine.evaluate({
269
+ principal: newEntityUID('Palisade::Scanner', 'palisade'),
270
+ action: 'Palisade::Action::"scan_artifact"',
271
+ resource: newEntityUID('Palisade::Artifact', 'model.safetensors'),
272
+ context: {
273
+ environment: 'production',
274
+ pickle_exec_path_detected: false,
275
+ severity: 'INFO',
276
+ finding_type: 'backdoor_check',
277
+ artifact_format: 'safetensors',
278
+ path: '/models/model.safetensors',
279
+ artifact_signed: true,
280
+ provenance_signer: 'trusted',
281
+ tokenizer_added_tokens_count: 0,
282
+ adapter_base_digest_mismatch: false,
283
+ gguf_suspicious_metadata: false,
284
+ safetensors_integrity_violation: false,
285
+ metadata_malicious_pattern: false,
286
+ metadata_cosai_level_numeric: 3,
287
+ match_count: 0,
288
+ },
289
+ entities,
290
+ });
291
+ if (decision.effect !== 'Allow') {
292
+ console.log('Decision:', decision);
293
+ console.log('Reason:', decision.reason);
294
+ }
295
+ expect(decision.effect).toBe('Allow');
296
+ });
297
+ });
298
+ describe('Example from REFACTORING_SUMMARY.md', () => {
299
+ it('should work with Guardian plugin example', () => {
300
+ const engine = new PolicyEngine({ schema: OVERWATCH_SCHEMA });
301
+ const policy = `
302
+ permit(
303
+ principal is Overwatch::User,
304
+ action == Overwatch::Action::"call_tool",
305
+ resource is Overwatch::Tool
306
+ )
307
+ when {
308
+ context.threat_count < 10 &&
309
+ context.highest_severity != "critical"
310
+ };
311
+ `;
312
+ engine.loadPolicies(policy);
313
+ const entities = [
314
+ newEntity('Overwatch::User', 'mcp_client', { user_type: 'external', email: 'user@example.com' }),
315
+ newEntity('Overwatch::Tool', 'shell', { tool_name: 'shell', risk_level: 'high' }),
316
+ ];
317
+ const decision = engine.evaluate({
318
+ principal: newEntityUID('Overwatch::User', 'mcp_client'),
319
+ action: 'Overwatch::Action::"call_tool"',
320
+ resource: newEntityUID('Overwatch::Tool', 'shell'),
321
+ context: {
322
+ content: 'cat /etc/passwd',
323
+ source: 'claudecode',
324
+ event: 'PreToolUse',
325
+ user_email: 'user@example.com',
326
+ tool_name: 'shell',
327
+ mcp_server: 'filesystem',
328
+ mcp_tool: 'shell',
329
+ server_name: 'filesystem',
330
+ path: '/etc/passwd',
331
+ file_path: '/etc/passwd',
332
+ cwd: '/workspace',
333
+ workspace_root: '/workspace',
334
+ threat_count: 5,
335
+ highest_severity: 'medium',
336
+ threat_categories: [],
337
+ threat_types: [],
338
+ yara_threats: [],
339
+ max_threat_severity: 2,
340
+ contains_secrets: false,
341
+ response_content: '',
342
+ },
343
+ entities,
344
+ });
345
+ expect(decision.effect).toBe('Allow');
346
+ });
347
+ it('should work with Palisade service example', () => {
348
+ const engine = new PolicyEngine({ schema: PALISADE_SCHEMA });
349
+ const policy = `
350
+ forbid(
351
+ principal is Palisade::Scanner,
352
+ action == Palisade::Action::"load_model",
353
+ resource is Palisade::Artifact
354
+ )
355
+ when {
356
+ context.environment == "production" &&
357
+ context.pickle_exec_path_detected == true &&
358
+ context.severity == "CRITICAL"
359
+ };
360
+ `;
361
+ engine.loadPolicies(policy);
362
+ const entities = [
363
+ newEntity('Palisade::Scanner', 'palisade', { scanner_type: 'ml_security' }),
364
+ newEntity('Palisade::Artifact', 'model.pkl', { artifact_format: 'pickle', path: '/models/model.pkl', signed: false, signer: 'unsigned' }),
365
+ ];
366
+ const decision = engine.evaluate({
367
+ principal: newEntityUID('Palisade::Scanner', 'palisade'),
368
+ action: 'Palisade::Action::"load_model"',
369
+ resource: newEntityUID('Palisade::Artifact', 'model.pkl'),
370
+ context: {
371
+ environment: 'production',
372
+ pickle_exec_path_detected: true,
373
+ severity: 'CRITICAL',
374
+ },
375
+ entities,
376
+ });
377
+ expect(decision.effect).toBe('Deny');
378
+ });
379
+ });
380
+ });
381
+ //# sourceMappingURL=schemas.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schemas.test.js","sourceRoot":"","sources":["../src/schemas.test.ts"],"names":[],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -3,4 +3,5 @@ export * from './actions.gen.js';
3
3
  export * from './context.gen.js';
4
4
  export * from './schema.gen.js';
5
5
  export * from './builder.js';
6
+ export * from './errors.js';
6
7
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAQA,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC;AAGhC,cAAc,cAAc,CAAC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAQA,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC;AAGhC,cAAc,cAAc,CAAC;AAG7B,cAAc,aAAa,CAAC"}
package/dist/types.js CHANGED
@@ -11,4 +11,6 @@ export * from './context.gen.js';
11
11
  export * from './schema.gen.js';
12
12
  // PolicyBuilder - works in browser (no WASM dependency)
13
13
  export * from './builder.js';
14
+ // Error types - works in browser (no WASM dependency)
15
+ export * from './errors.js';
14
16
  //# sourceMappingURL=types.js.map
package/dist/types.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,2DAA2D;AAC3D,uCAAuC;AACvC,EAAE;AACF,6CAA6C;AAC7C,gDAAgD;AAChD,yEAAyE;AAEzE,gDAAgD;AAChD,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC;AAEhC,wDAAwD;AACxD,cAAc,cAAc,CAAC"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,2DAA2D;AAC3D,uCAAuC;AACvC,EAAE;AACF,6CAA6C;AAC7C,gDAAgD;AAChD,yEAAyE;AAEzE,gDAAgD;AAChD,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC;AAEhC,wDAAwD;AACxD,cAAc,cAAc,CAAC;AAE7B,sDAAsD;AACtD,cAAc,aAAa,CAAC"}
package/package.json CHANGED
@@ -1,7 +1,8 @@
1
1
  {
2
2
  "name": "@highflame/policy",
3
- "version": "1.2.0",
3
+ "version": "2.0.0",
4
4
  "description": "Highflame Cedar policy types and engine wrapper",
5
+ "readme": "README.md",
5
6
  "main": "dist/index.js",
6
7
  "types": "dist/index.d.ts",
7
8
  "type": "module",
@@ -26,10 +27,10 @@
26
27
  "import": "./dist/actions.gen.js",
27
28
  "types": "./dist/actions.gen.d.ts"
28
29
  },
29
- "./context": {
30
- "import": "./dist/context.gen.js",
31
- "types": "./dist/context.gen.d.ts"
32
- },
30
+ "./schemas/overwatch": "./_schemas/overwatch/schema.cedarschema",
31
+ "./schemas/palisade": "./_schemas/palisade/schema.cedarschema",
32
+ "./context/overwatch": "./_schemas/overwatch/context.json",
33
+ "./context/palisade": "./_schemas/palisade/context.json",
33
34
  "./engine": {
34
35
  "import": "./dist/engine.js",
35
36
  "types": "./dist/engine.d.ts"
@@ -37,6 +38,10 @@
37
38
  "./builder": {
38
39
  "import": "./dist/builder.js",
39
40
  "types": "./dist/builder.d.ts"
41
+ },
42
+ "./parser": {
43
+ "import": "./dist/parser.js",
44
+ "types": "./dist/parser.d.ts"
40
45
  }
41
46
  },
42
47
  "scripts": {
@@ -49,12 +54,14 @@
49
54
  "@cedar-policy/cedar-wasm": "^4.0.0"
50
55
  },
51
56
  "devDependencies": {
57
+ "@types/node": "^25.2.0",
52
58
  "typescript": "^5.3.0",
53
59
  "vitest": "^2.0.0"
54
60
  },
55
61
  "files": [
56
62
  "dist",
57
- "src"
63
+ "src",
64
+ "_schemas"
58
65
  ],
59
66
  "keywords": [
60
67
  "cedar",
package/src/builder.ts CHANGED
@@ -24,7 +24,6 @@
24
24
 
25
25
  import { EntityType, EntityUID } from './entities.gen.js';
26
26
  import { ActionType } from './actions.gen.js';
27
- import { ContextKey } from './context.gen.js';
28
27
 
29
28
  /**
30
29
  * Policy effect - permit or forbid
@@ -397,7 +396,7 @@ export class PolicyBuilder {
397
396
  /**
398
397
  * Add a structured condition
399
398
  */
400
- when(field: ContextKey | string, operator: ConditionOperator, value: string | number | boolean | string[]): PolicyBuilder {
399
+ when(field: string, operator: ConditionOperator, value: string | number | boolean | string[]): PolicyBuilder {
401
400
  this.data.conditions.push({ field, operator, value });
402
401
  return this;
403
402
  }