@highflame/policy 2.1.37 → 2.1.39

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.
@@ -0,0 +1,82 @@
1
+ export declare const AARM_ANNOTATION_REGISTRY_VERSION = "1.0.0";
2
+ export declare const AARM_ANNOTATION_REGISTRY_INTRODUCED_IN = "R4";
3
+ export declare const AARM_ANNOTATION_REGISTRY_SPEC_URL = "https://aarm.dev/conformance/requirements";
4
+ /**
5
+ * Declared runtime type of an AARM annotation parameter.
6
+ * Constrained to the four primitives the registry parser allows.
7
+ */
8
+ export type AARMParameterType = 'string' | 'int' | 'float' | 'bool';
9
+ /**
10
+ * Typed parameter value used in Default / Min / Max. Discriminator
11
+ * matches `AARMParameterType`; consumers should type-narrow on the
12
+ * `kind` field rather than reading `value` directly.
13
+ */
14
+ export type AARMParameterValue = {
15
+ kind: 'string';
16
+ value: string;
17
+ } | {
18
+ kind: 'int';
19
+ value: number;
20
+ } | {
21
+ kind: 'float';
22
+ value: number;
23
+ } | {
24
+ kind: 'bool';
25
+ value: boolean;
26
+ };
27
+ /** One parameter on an AARM annotation. */
28
+ export interface AARMParameterDef {
29
+ name: string;
30
+ type: AARMParameterType;
31
+ required: boolean;
32
+ positional: boolean;
33
+ description: string;
34
+ /** Default value when the parameter is omitted; null for required. */
35
+ default: AARMParameterValue | null;
36
+ /** Inclusive lower bound for int/float; null otherwise. */
37
+ min: AARMParameterValue | null;
38
+ /** Inclusive upper bound for int/float; null otherwise. */
39
+ max: AARMParameterValue | null;
40
+ /** Regex pattern (for string parameters); empty string when unset. */
41
+ pattern: string;
42
+ /** Runtime source identifier for typeahead (e.g. 'authn.roles'). */
43
+ valueSource: string;
44
+ }
45
+ /**
46
+ * One entry in the platform's annotation registry.
47
+ *
48
+ * - `key` is the @<name> bare identifier as it appears in Cedar policy text.
49
+ * - `decisionEffect`, when non-empty, names the Shield decision this
50
+ * annotation drives ('step_up' | 'defer' | 'modify').
51
+ * - `promotesCapability`, when non-empty, names the capabilities.yaml
52
+ * row that becomes implementable once Shield emits the named effect.
53
+ * - `parameters` preserve the order produced by the registry parser:
54
+ * the positional parameter (if any) first, then the rest alphabetically.
55
+ */
56
+ export interface AARMAnnotationDef {
57
+ key: string;
58
+ description: string;
59
+ aarmRequirement: string;
60
+ promotesCapability: string;
61
+ decisionEffect: string;
62
+ parameters: AARMParameterDef[];
63
+ }
64
+ /**
65
+ * Authoritative annotation registry. Treat as read-only —
66
+ * mutation is a programming error.
67
+ */
68
+ export declare const AARM_ANNOTATIONS: readonly AARMAnnotationDef[];
69
+ /**
70
+ * O(1) lookup over AARM_ANNOTATIONS. Use this when validating raw
71
+ * policy annotations against the registry; the array form is for
72
+ * iteration and stable order.
73
+ *
74
+ * The backing object is built with `Object.create(null)` so a
75
+ * registry author who somehow lands `__proto__` / `constructor` /
76
+ * `hasOwnProperty` as an annotation key (rejected by the Rust
77
+ * registry validator, but defense-in-depth) cannot prototype-
78
+ * pollute the lookup. `Object.freeze` is applied on top to lock
79
+ * the top-level key set; consumers should still treat values as
80
+ * immutable (see the `as const` literal types above).
81
+ */
82
+ export declare const AARM_ANNOTATION_BY_KEY: Readonly<Record<string, AARMAnnotationDef>>;
@@ -0,0 +1,117 @@
1
+ // Code generated by highflame-policy-codegen. DO NOT EDIT.
2
+ // Source: schemas/annotations.json
3
+ //
4
+ // AARM-aware annotation registry. Single source of truth for the
5
+ // annotations Shield's scheduler interprets at evaluation time and
6
+ // that Studio's editor surfaces for autocomplete/lint. Generic Cedar
7
+ // annotations (@id, @name, @description, @severity, @tags) remain
8
+ // free-form and are unrelated.
9
+ export const AARM_ANNOTATION_REGISTRY_VERSION = '1.0.0';
10
+ export const AARM_ANNOTATION_REGISTRY_INTRODUCED_IN = 'R4';
11
+ export const AARM_ANNOTATION_REGISTRY_SPEC_URL = 'https://aarm.dev/conformance/requirements';
12
+ /**
13
+ * Authoritative annotation registry. Treat as read-only —
14
+ * mutation is a programming error.
15
+ */
16
+ export const AARM_ANNOTATIONS = [
17
+ {
18
+ key: 'defer_below_confidence',
19
+ description: 'Defer the decision when ANY detector this policy conditions on returned a confidence below the threshold. AARM R3 DEFER on low confidence: prevents both false-positive blocks and false-negative permits at the gray-zone boundary, suspending until a stronger signal arrives.',
20
+ aarmRequirement: 'R3',
21
+ promotesCapability: 'CAP-ENF-005',
22
+ decisionEffect: 'defer',
23
+ parameters: [
24
+ {
25
+ name: 'threshold',
26
+ type: 'float',
27
+ required: true,
28
+ positional: true,
29
+ description: 'Confidence threshold in [0.0, 1.0]. Detector scores strictly less than this value trigger a deferral. 0.0 disables (matches no detector). 1.0 always defers.',
30
+ default: null,
31
+ min: { kind: 'float', value: 0.0 },
32
+ max: { kind: 'float', value: 1.0 },
33
+ pattern: '',
34
+ valueSource: '',
35
+ },
36
+ ],
37
+ },
38
+ {
39
+ key: 'defer_on_conflict',
40
+ description: 'Defer the decision when two or more equal-priority `forbid` rules disagree about whether to block this action. AARM R3 + R4 DEFER on policy conflict: the scheduler suspends rather than picking deny-by-default, so a policy author can resolve the conflict explicitly. Default behavior absent this annotation remains deny-overrides.',
41
+ aarmRequirement: 'R3',
42
+ promotesCapability: 'CAP-ENF-005',
43
+ decisionEffect: 'defer',
44
+ parameters: [],
45
+ },
46
+ {
47
+ key: 'defer_until_context',
48
+ description: 'Defer the decision when a named Cedar context field is null, missing, or the empty string. AARM R3 DEFER on missing context: lets the policy author require a populated field (e.g. `session_max_sensitivity`, `agent_identity_verified`) before letting a decision land, suspending the action rather than evaluating against a half-built session.',
49
+ aarmRequirement: 'R3',
50
+ promotesCapability: 'CAP-ENF-005',
51
+ decisionEffect: 'defer',
52
+ parameters: [
53
+ {
54
+ name: 'field',
55
+ type: 'string',
56
+ required: true,
57
+ positional: true,
58
+ description: 'Dotted Cedar context-attribute path (e.g. `session_max_sensitivity`, `agent.identity_verified`). Matched against the request\'s projected context at evaluation time.',
59
+ default: null,
60
+ min: null,
61
+ max: null,
62
+ pattern: '^[a-zA-Z_][a-zA-Z0-9_.]*$',
63
+ valueSource: '',
64
+ },
65
+ ],
66
+ },
67
+ {
68
+ key: 'step_up_required',
69
+ description: 'Suspend the action pending human approval from an approver with the named role. AARM R4 STEP_UP decision: action does not execute until POST /v1/approvals/{id}/resolve returns allow, OR timeout_seconds elapses (fail-closed: timeout DENYs the action, never permits).',
70
+ aarmRequirement: 'R4',
71
+ promotesCapability: 'CAP-ENF-004',
72
+ decisionEffect: 'step_up',
73
+ parameters: [
74
+ {
75
+ name: 'role',
76
+ type: 'string',
77
+ required: true,
78
+ positional: true,
79
+ description: 'AuthN role string the approver must carry (e.g. "finance_lead", "security_oncall"). Validated against authn.roles at deploy time; unknown roles reject the policy.',
80
+ default: null,
81
+ min: null,
82
+ max: null,
83
+ pattern: '',
84
+ valueSource: 'authn.roles',
85
+ },
86
+ {
87
+ name: 'timeout_seconds',
88
+ type: 'int',
89
+ required: false,
90
+ positional: false,
91
+ description: 'Seconds the action waits for approval before fail-closed DENY. Default 24h (86400s); bounded [60s, 7d].',
92
+ default: { kind: 'int', value: 86400 },
93
+ min: { kind: 'int', value: 60 },
94
+ max: { kind: 'int', value: 604800 },
95
+ pattern: '',
96
+ valueSource: '',
97
+ },
98
+ ],
99
+ },
100
+ ];
101
+ /**
102
+ * O(1) lookup over AARM_ANNOTATIONS. Use this when validating raw
103
+ * policy annotations against the registry; the array form is for
104
+ * iteration and stable order.
105
+ *
106
+ * The backing object is built with `Object.create(null)` so a
107
+ * registry author who somehow lands `__proto__` / `constructor` /
108
+ * `hasOwnProperty` as an annotation key (rejected by the Rust
109
+ * registry validator, but defense-in-depth) cannot prototype-
110
+ * pollute the lookup. `Object.freeze` is applied on top to lock
111
+ * the top-level key set; consumers should still treat values as
112
+ * immutable (see the `as const` literal types above).
113
+ */
114
+ export const AARM_ANNOTATION_BY_KEY = Object.freeze(AARM_ANNOTATIONS.reduce((acc, ann) => {
115
+ acc[ann.key] = ann;
116
+ return acc;
117
+ }, Object.create(null)));
package/dist/index.d.ts CHANGED
@@ -2,6 +2,7 @@ export * from './entities.gen.js';
2
2
  export * from './actions.gen.js';
3
3
  export * from './context.gen.js';
4
4
  export * from './schema.gen.js';
5
+ export * from './aarm-annotations.gen.js';
5
6
  export * from './engine.js';
6
7
  export * from './builder.js';
7
8
  export * from './parser.js';
package/dist/index.js CHANGED
@@ -7,6 +7,9 @@ export * from './entities.gen.js';
7
7
  export * from './actions.gen.js';
8
8
  export * from './context.gen.js';
9
9
  export * from './schema.gen.js';
10
+ // AARM-aware annotation registry (typed Cedar annotation vocabulary
11
+ // Shield interprets at decision time; Studio/Admin use for lint).
12
+ export * from './aarm-annotations.gen.js';
10
13
  // Non-generated modules (require Node.js)
11
14
  export * from './engine.js';
12
15
  export * from './builder.js';
@@ -171,17 +171,21 @@ when {
171
171
 
172
172
  @id("data-protection.block-env-file-paths")
173
173
  @name("Block dotenv file access")
174
- @description("Blocks read_file and write_file when path matches *.env*.")
174
+ @description("Blocks read_file and write_file when path matches a .env file or .env.<suffix> variant.")
175
175
  @severity("high")
176
176
  @tags("category:data-protection,threat:secrets,detection:pattern,compliance:nist-si-3")
177
- @reject_message("File access blocked: .env file targeted these files typically contain secrets and database credentials.")
177
+ @reject_message("File access blocked: .env file targeted, these files typically contain secrets and database credentials.")
178
178
  forbid (
179
179
  principal,
180
180
  action in [Overwatch::Action::"read_file", Overwatch::Action::"write_file"],
181
181
  resource
182
182
  )
183
183
  when {
184
- context has path && context.path like "*.env*"
184
+ context has path &&
185
+ (
186
+ context.path like "*.env" ||
187
+ context.path like "*.env.*"
188
+ )
185
189
  };
186
190
  `;
187
191
  const OVERWATCH_SEMANTIC_DEFAULTS_CEDAR = `// =============================================================================
@@ -455,58 +459,60 @@ when {
455
459
  const OVERWATCH_TOOLS_DEFAULTS_CEDAR = `// =============================================================================
456
460
  // Tool Permissioning (Default)
457
461
  // =============================================================================
458
- // Controls IDE tool execution, shell access, sensitive file system paths, and
459
- // threat-severity-based blocking. Sections 1–2 are opt-in (inactive unless
460
- // explicitly enabled); sections 3–4 are active baseline.
462
+ // Sensitive system-path file access and destructive MCP file-operation
463
+ // blocking. Shell-execution blocking lives in tools_shell_block.cedar as a
464
+ // separate opt-in template and is not bundled with this default.
461
465
  //
462
466
  // Context keys consumed:
463
- // - tool_name: String
464
- // - path: String
465
- // - max_threat_severity: Long (0-4)
467
+ // - path: String
468
+ // - tool_name: String
466
469
  //
467
470
  // Compliance:
468
471
  // - NIST 800-53 AC-3, AC-6, CM-7
469
- // - OWASP LLM06, OWASP ASI02
470
- // - MITRE ATT&CK T1059, T1005
472
+ // - OWASP ASI02; MITRE ATT&CK T1005
471
473
  //
472
474
  // Category: tools
473
475
  // Namespace: Overwatch
474
476
  // =============================================================================
475
477
 
476
478
  // ---------------------------------------------------------------------------
477
- // Section 1: Shell execution (opt-in)
479
+ // Section 1: Sensitive system paths
478
480
  // ---------------------------------------------------------------------------
479
481
 
480
- @id("tools.block-shell")
481
- @name("Block shell and command execution")
482
- @description("Blocks call_tool when tool_name is shell, bash, sh, terminal, cmd, or powershell.")
483
- @severity("critical")
484
- @tags("category:tools,threat:command-injection,detection:rule,surface:call-tool,owasp:llm06,mitre:t1059")
485
- @reject_message("Tool execution blocked: shell/command execution is restricted in this environment.")
482
+ @id("tools.block-system-paths")
483
+ @name("Block system directory access")
484
+ @description("Blocks read_file and write_file when path matches a sensitive Linux or macOS system directory.")
485
+ @severity("high")
486
+ @tags("category:tools,threat:path-traversal,detection:pattern,mitre:t1005")
487
+ @reject_message("File access blocked: sensitive system directory targeted (/etc, /proc, /sys, /root, /var, /System, /Library, /private).")
486
488
  forbid (
487
489
  principal,
488
- action == Overwatch::Action::"call_tool",
490
+ action in [Overwatch::Action::"read_file", Overwatch::Action::"write_file"],
489
491
  resource
490
492
  )
491
493
  when {
492
- context has tool_name &&
494
+ context has path &&
493
495
  (
494
- context.tool_name == "shell" ||
495
- context.tool_name == "bash" ||
496
- context.tool_name == "sh" ||
497
- context.tool_name == "terminal" ||
498
- context.tool_name == "cmd" ||
499
- context.tool_name == "powershell"
496
+ context.path like "/etc/*" ||
497
+ context.path like "/proc/*" ||
498
+ context.path like "/sys/*" ||
499
+ context.path like "/root/*" ||
500
+ context.path like "/var/log/*" ||
501
+ context.path like "/var/run/*" ||
502
+ context.path like "/private/etc/*" ||
503
+ context.path like "/private/var/*" ||
504
+ context.path like "/Library/*" ||
505
+ context.path like "/System/*"
500
506
  )
501
507
  };
502
508
 
503
509
  // ---------------------------------------------------------------------------
504
- // Section 2: Destructive file operations (opt-in)
510
+ // Section 2: Destructive MCP file operations
505
511
  // ---------------------------------------------------------------------------
506
512
 
507
513
  @id("tools.block-destructive-ops")
508
514
  @name("Block destructive file operations")
509
- @description("Blocks call_tool when tool_name is a destructive file operation.")
515
+ @description("Blocks call_tool when tool_name is a destructive MCP file operation.")
510
516
  @severity("high")
511
517
  @tags("category:tools,detection:rule,surface:call-tool,owasp:asi02")
512
518
  @reject_message("Tool execution blocked: destructive file operations (delete, rmdir, unlink) require explicit human approval.")
@@ -526,56 +532,47 @@ when {
526
532
  context.tool_name == "remove_directory"
527
533
  )
528
534
  };
535
+ `;
536
+ const OVERWATCH_TOOLS_BLOCK_SHELL_CEDAR = `// =============================================================================
537
+ // Tool Permissioning — Shell execution block (Opt-in)
538
+ // =============================================================================
539
+ // Blocks shell and command execution tools. Inactive unless explicitly enabled
540
+ // because it blocks ALL shell access (including safe commands like git and
541
+ // echo). Intended for high-security environments where shell access is
542
+ // prohibited.
543
+ //
544
+ // Context keys consumed:
545
+ // - tool_name: String
546
+ //
547
+ // Compliance:
548
+ // - NIST 800-53 CM-7; OWASP LLM06; MITRE ATT&CK T1059
549
+ //
550
+ // Category: tools
551
+ // Namespace: Overwatch
552
+ // =============================================================================
529
553
 
530
- // ---------------------------------------------------------------------------
531
- // Section 3: Sensitive system paths (active)
532
- // ---------------------------------------------------------------------------
533
-
534
- @id("tools.block-system-paths")
535
- @name("Block system directory access")
536
- @description("Blocks read_file and write_file when path matches a sensitive Linux or macOS system directory.")
537
- @severity("high")
538
- @tags("category:tools,threat:path-traversal,detection:pattern,mitre:t1005")
539
- @reject_message("File access blocked: sensitive system directory targeted (/etc, /proc, /sys, /root, /var, /System, /Library, /private).")
554
+ @id("tools.block-shell")
555
+ @name("Block shell and command execution")
556
+ @description("Blocks call_tool when tool_name is shell, bash, sh, terminal, cmd, or powershell.")
557
+ @severity("critical")
558
+ @tags("category:tools,threat:command-injection,detection:rule,surface:call-tool,owasp:llm06,mitre:t1059")
559
+ @reject_message("Tool execution blocked: shell/command execution is restricted in this environment.")
540
560
  forbid (
541
561
  principal,
542
- action in [Overwatch::Action::"read_file", Overwatch::Action::"write_file"],
562
+ action == Overwatch::Action::"call_tool",
543
563
  resource
544
564
  )
545
565
  when {
546
- context has path &&
566
+ context has tool_name &&
547
567
  (
548
- context.path like "/etc/*" ||
549
- context.path like "/proc/*" ||
550
- context.path like "/sys/*" ||
551
- context.path like "/root/*" ||
552
- context.path like "/var/log/*" ||
553
- context.path like "/var/run/*" ||
554
- context.path like "/private/etc/*" ||
555
- context.path like "/private/var/*" ||
556
- context.path like "/Library/*" ||
557
- context.path like "/System/*"
568
+ context.tool_name == "shell" ||
569
+ context.tool_name == "bash" ||
570
+ context.tool_name == "sh" ||
571
+ context.tool_name == "terminal" ||
572
+ context.tool_name == "cmd" ||
573
+ context.tool_name == "powershell"
558
574
  )
559
575
  };
560
-
561
- // ---------------------------------------------------------------------------
562
- // Section 4: Threat-severity catch-all
563
- // ---------------------------------------------------------------------------
564
-
565
- @id("tools.block-high-severity")
566
- @name("Block high-severity tool calls")
567
- @description("Blocks call_tool when max_threat_severity >= 3.")
568
- @severity("high")
569
- @tags("category:tools,detection:aggregate,surface:call-tool,posture:catch-all")
570
- @reject_message("Tool execution blocked: high or critical severity threats detected in content.")
571
- forbid (
572
- principal,
573
- action == Overwatch::Action::"call_tool",
574
- resource
575
- )
576
- when {
577
- context has max_threat_severity && context.max_threat_severity >= 3
578
- };
579
576
  `;
580
577
  const OVERWATCH_PRIVACY_DEFAULTS_CEDAR = `// =============================================================================
581
578
  // PII Detection (Default)
@@ -1036,11 +1033,20 @@ export const OVERWATCH_TEMPLATES = [
1036
1033
  {
1037
1034
  id: 'tools.defaults',
1038
1035
  name: 'Tool Permissioning',
1039
- description: 'Block sensitive system paths and tool calls with high-severity threats; opt-in shell and destructive-op blocking.',
1036
+ description: 'Block sensitive system-path file access and destructive MCP file-operation tools.',
1040
1037
  category: 'tools',
1041
1038
  cedarText: OVERWATCH_TOOLS_DEFAULTS_CEDAR,
1039
+ severity: 'high',
1040
+ tags: ['category:tools', 'threat:path-traversal', 'detection:pattern', 'mitre:t1005', 'owasp:asi02'],
1041
+ },
1042
+ {
1043
+ id: 'tools.block-shell',
1044
+ name: 'Block shell and command execution',
1045
+ description: 'Blocks call_tool when tool_name is shell, bash, sh, terminal, cmd, or powershell.',
1046
+ category: 'tools',
1047
+ cedarText: OVERWATCH_TOOLS_BLOCK_SHELL_CEDAR,
1042
1048
  severity: 'critical',
1043
- tags: ['category:tools', 'threat:command-injection', 'owasp:llm06'],
1049
+ tags: ['category:tools', 'threat:command-injection', 'detection:rule', 'surface:call-tool', 'owasp:llm06', 'mitre:t1059'],
1044
1050
  },
1045
1051
  {
1046
1052
  id: 'privacy.defaults',
@@ -1190,7 +1196,13 @@ export const OVERWATCH_TEMPLATES_JSON = `{
1190
1196
  "category": "semantic",
1191
1197
  "file": "defaults/semantic.cedar",
1192
1198
  "severity": "critical",
1193
- "tags": ["category:semantic", "threat:injection", "threat:jailbreak", "owasp:llm01", "owasp:llm02"]
1199
+ "tags": [
1200
+ "category:semantic",
1201
+ "threat:injection",
1202
+ "threat:jailbreak",
1203
+ "owasp:llm01",
1204
+ "owasp:llm02"
1205
+ ]
1194
1206
  },
1195
1207
  {
1196
1208
  "id": "trust-safety.defaults",
@@ -1199,16 +1211,43 @@ export const OVERWATCH_TEMPLATES_JSON = `{
1199
1211
  "category": "trust-safety",
1200
1212
  "file": "defaults/content_safety.cedar",
1201
1213
  "severity": "critical",
1202
- "tags": ["category:trust-safety", "threat:harmful", "compliance:eu-ai-act", "compliance:iso-42001"]
1214
+ "tags": [
1215
+ "category:trust-safety",
1216
+ "threat:harmful",
1217
+ "compliance:eu-ai-act",
1218
+ "compliance:iso-42001"
1219
+ ]
1203
1220
  },
1204
1221
  {
1205
1222
  "id": "tools.defaults",
1206
1223
  "name": "Tool Permissioning",
1207
- "description": "Block sensitive system paths and tool calls with high-severity threats; opt-in shell and destructive-op blocking.",
1224
+ "description": "Block sensitive system-path file access and destructive MCP file-operation tools.",
1208
1225
  "category": "tools",
1209
1226
  "file": "defaults/tools.cedar",
1227
+ "severity": "high",
1228
+ "tags": [
1229
+ "category:tools",
1230
+ "threat:path-traversal",
1231
+ "detection:pattern",
1232
+ "mitre:t1005",
1233
+ "owasp:asi02"
1234
+ ]
1235
+ },
1236
+ {
1237
+ "id": "tools.block-shell",
1238
+ "name": "Block shell and command execution",
1239
+ "description": "Blocks call_tool when tool_name is shell, bash, sh, terminal, cmd, or powershell.",
1240
+ "category": "tools",
1241
+ "file": "tools_shell_block.cedar",
1210
1242
  "severity": "critical",
1211
- "tags": ["category:tools", "threat:command-injection", "owasp:llm06"]
1243
+ "tags": [
1244
+ "category:tools",
1245
+ "threat:command-injection",
1246
+ "detection:rule",
1247
+ "surface:call-tool",
1248
+ "owasp:llm06",
1249
+ "mitre:t1059"
1250
+ ]
1212
1251
  },
1213
1252
  {
1214
1253
  "id": "privacy.defaults",
@@ -1217,7 +1256,13 @@ export const OVERWATCH_TEMPLATES_JSON = `{
1217
1256
  "category": "privacy",
1218
1257
  "file": "defaults/pii.cedar",
1219
1258
  "severity": "critical",
1220
- "tags": ["category:privacy", "threat:pii", "compliance:pci-dss", "compliance:gdpr", "compliance:hipaa"]
1259
+ "tags": [
1260
+ "category:privacy",
1261
+ "threat:pii",
1262
+ "compliance:pci-dss",
1263
+ "compliance:gdpr",
1264
+ "compliance:hipaa"
1265
+ ]
1221
1266
  },
1222
1267
  {
1223
1268
  "id": "tools.mcp-server-allowlist",
@@ -1235,7 +1280,11 @@ export const OVERWATCH_TEMPLATES_JSON = `{
1235
1280
  "category": "tools",
1236
1281
  "file": "mcp_tool_permissions.cedar",
1237
1282
  "severity": "critical",
1238
- "tags": ["category:tools", "threat:supply-chain", "posture:permit-default"]
1283
+ "tags": [
1284
+ "category:tools",
1285
+ "threat:supply-chain",
1286
+ "posture:permit-default"
1287
+ ]
1239
1288
  },
1240
1289
  {
1241
1290
  "id": "organization.deny-baseline",
@@ -1244,7 +1293,11 @@ export const OVERWATCH_TEMPLATES_JSON = `{
1244
1293
  "category": "organization",
1245
1294
  "file": "default_deny_all.cedar",
1246
1295
  "severity": "high",
1247
- "tags": ["category:organization", "posture:deny-default", "scope:org-wide"]
1296
+ "tags": [
1297
+ "category:organization",
1298
+ "posture:deny-default",
1299
+ "scope:org-wide"
1300
+ ]
1248
1301
  },
1249
1302
  {
1250
1303
  "id": "organization.audit-all",
@@ -1253,7 +1306,11 @@ export const OVERWATCH_TEMPLATES_JSON = `{
1253
1306
  "category": "organization",
1254
1307
  "file": "audit_all_actions.cedar",
1255
1308
  "severity": "low",
1256
- "tags": ["category:organization", "posture:permit-default", "compliance:soc2"]
1309
+ "tags": [
1310
+ "category:organization",
1311
+ "posture:permit-default",
1312
+ "compliance:soc2"
1313
+ ]
1257
1314
  },
1258
1315
  {
1259
1316
  "id": "organization.team-permissions",
@@ -1262,7 +1319,11 @@ export const OVERWATCH_TEMPLATES_JSON = `{
1262
1319
  "category": "organization",
1263
1320
  "file": "team_permissions.cedar",
1264
1321
  "severity": "medium",
1265
- "tags": ["category:organization", "scope:per-tool", "posture:deny-default"]
1322
+ "tags": [
1323
+ "category:organization",
1324
+ "scope:per-tool",
1325
+ "posture:deny-default"
1326
+ ]
1266
1327
  },
1267
1328
  {
1268
1329
  "id": "agent-identity.agent-guardrails",
@@ -1271,7 +1332,12 @@ export const OVERWATCH_TEMPLATES_JSON = `{
1271
1332
  "category": "agent-identity",
1272
1333
  "file": "agent_guardrails.cedar",
1273
1334
  "severity": "critical",
1274
- "tags": ["category:agent-identity", "scope:per-agent", "threat:injection", "threat:pii"]
1335
+ "tags": [
1336
+ "category:agent-identity",
1337
+ "scope:per-agent",
1338
+ "threat:injection",
1339
+ "threat:pii"
1340
+ ]
1275
1341
  }
1276
1342
  ]
1277
1343
  }
package/dist/types.d.ts CHANGED
@@ -2,6 +2,7 @@ export * from './entities.gen.js';
2
2
  export * from './actions.gen.js';
3
3
  export * from './context.gen.js';
4
4
  export * from './schema.gen.js';
5
+ export * from './aarm-annotations.gen.js';
5
6
  export * from './builder.js';
6
7
  export * from './errors.js';
7
8
  export * from './annotations.js';
package/dist/types.js CHANGED
@@ -9,6 +9,9 @@ export * from './entities.gen.js';
9
9
  export * from './actions.gen.js';
10
10
  export * from './context.gen.js';
11
11
  export * from './schema.gen.js';
12
+ // AARM-aware annotation registry (browser-safe — Studio uses this
13
+ // for Monaco autocomplete + lint of @step_up_required / @defer_* keys).
14
+ export * from './aarm-annotations.gen.js';
12
15
  // PolicyBuilder - works in browser (no WASM dependency)
13
16
  export * from './builder.js';
14
17
  // Error types - works in browser (no WASM dependency)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@highflame/policy",
3
- "version": "2.1.37",
3
+ "version": "2.1.39",
4
4
  "engines": {
5
5
  "node": ">=18"
6
6
  },