agent-threat-rules 4.2.1 → 4.2.2

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 (171) hide show
  1. package/CHANGELOG.md +166 -0
  2. package/dist/converters/elastic.d.ts.map +1 -1
  3. package/dist/converters/elastic.js +7 -1
  4. package/dist/converters/elastic.js.map +1 -1
  5. package/dist/converters/generic-regex.d.ts +5 -1
  6. package/dist/converters/generic-regex.d.ts.map +1 -1
  7. package/dist/converters/generic-regex.js +12 -11
  8. package/dist/converters/generic-regex.js.map +1 -1
  9. package/dist/converters/sage-reverse.d.ts +1 -1
  10. package/dist/converters/sage-reverse.d.ts.map +1 -1
  11. package/dist/converters/sage-reverse.js +13 -8
  12. package/dist/converters/sage-reverse.js.map +1 -1
  13. package/dist/converters/sage.d.ts +8 -8
  14. package/dist/converters/sage.d.ts.map +1 -1
  15. package/dist/converters/sage.js +107 -74
  16. package/dist/converters/sage.js.map +1 -1
  17. package/dist/converters/splunk.d.ts.map +1 -1
  18. package/dist/converters/splunk.js +17 -3
  19. package/dist/converters/splunk.js.map +1 -1
  20. package/dist/engine.d.ts +2 -48
  21. package/dist/engine.d.ts.map +1 -1
  22. package/dist/engine.js +3 -54
  23. package/dist/engine.js.map +1 -1
  24. package/dist/regex-dialect.d.ts +67 -0
  25. package/dist/regex-dialect.d.ts.map +1 -0
  26. package/dist/regex-dialect.js +77 -0
  27. package/dist/regex-dialect.js.map +1 -0
  28. package/package.json +1 -1
  29. package/rules/agent-manipulation/ATR-2026-00074-cross-agent-privilege-escalation.yaml +0 -1
  30. package/rules/agent-manipulation/ATR-2026-00430-nl-trust-escalation-impersonation.yaml +3 -0
  31. package/rules/agent-manipulation/ATR-2026-00552-goal-drift-after-pressure-injection.yaml +3 -3
  32. package/rules/context-exfiltration/ATR-2026-00102-disguised-analytics-exfiltration.yaml +3 -2
  33. package/rules/context-exfiltration/ATR-2026-00136-tool-response-data-piggyback.yaml +5 -3
  34. package/rules/context-exfiltration/ATR-2026-00142-piggyback-transition-words.yaml +4 -2
  35. package/rules/context-exfiltration/ATR-2026-00150-credential-in-tool-response.yaml +3 -2
  36. package/rules/context-exfiltration/ATR-2026-00152-obfuscated-credential-leak.yaml +3 -2
  37. package/rules/context-exfiltration/ATR-2026-00162-skill-credential-exfil-combo.yaml +6 -2
  38. package/rules/context-exfiltration/ATR-2026-00201-credential-pipe-exfiltration.yaml +5 -2
  39. package/rules/context-exfiltration/ATR-2026-00290-divergence-repeat-word-training-extraction.yaml +0 -4
  40. package/rules/context-exfiltration/ATR-2026-00449-spring-ai-chatmemory-cross-user-leak.yaml +2 -3
  41. package/rules/context-exfiltration/ATR-2026-00516-output-xss-via-llm.yaml +9 -8
  42. package/rules/context-exfiltration/ATR-2026-00569-agent-mcp-path-traversal-arbitrary-file-access.yaml +3 -1
  43. package/rules/context-exfiltration/ATR-2026-00571-xss-in-agent-mcp-rendered-output.yaml +4 -3
  44. package/rules/context-exfiltration/ATR-2026-00702-ipi-credential-exfil-via-agent-action.yaml +5 -3
  45. package/rules/context-exfiltration/ATR-2026-00703-ipi-financial-data-exfil-indirect.yaml +5 -3
  46. package/rules/context-exfiltration/ATR-2026-00704-ipi-medical-genetic-data-exfil.yaml +5 -3
  47. package/rules/context-exfiltration/ATR-2026-00705-ipi-location-address-browsing-exfil.yaml +5 -3
  48. package/rules/context-exfiltration/ATR-2026-00706-ipi-physical-biometric-exfil.yaml +5 -3
  49. package/rules/context-exfiltration/ATR-2026-00707-ipi-file-exfil-with-destroy-or-tamper.yaml +6 -3
  50. package/rules/context-exfiltration/ATR-2026-00860-indirect-pi-financial-transfer-hijack.yaml +1 -1
  51. package/rules/context-exfiltration/ATR-2026-00861-indirect-pi-crypto-transfer-hijack.yaml +1 -1
  52. package/rules/context-exfiltration/ATR-2026-01605-ssrf-aws-metadata-endpoint.yaml +5 -1
  53. package/rules/context-exfiltration/ATR-2026-01606-ssrf-internal-network-scan.yaml +4 -1
  54. package/rules/context-exfiltration/ATR-2026-01607-ssrf-localhost-service-probe.yaml +4 -1
  55. package/rules/context-exfiltration/ATR-2026-01924-system-instruction-extraction-reformat.yaml +1 -4
  56. package/rules/context-exfiltration/ATR-2026-01948-netlicensing-mcp-product-number-path-traversal-token-leak.yaml +4 -2
  57. package/rules/context-exfiltration/ATR-2026-01957-m365-copilot-searchleak-open-redirect-exfil.yaml +6 -2
  58. package/rules/context-exfiltration/ATR-2026-01961-meta-ads-mcp-unauth-token-leak.yaml +4 -1
  59. package/rules/context-exfiltration/ATR-2026-01964-langchain-gmailtoolkit-indirect-prompt-injection-email-exfil.yaml +6 -2
  60. package/rules/context-exfiltration/ATR-2026-02140-ssrf-ipv6-hex-encoded-cloud-metadata-bypass.yaml +1 -1
  61. package/rules/context-exfiltration/ATR-2026-02304-preapproved-domain-encoded-path-exfil.yaml +1 -1
  62. package/rules/context-exfiltration/ATR-2026-02351-wildcard-dns-ssrf-hostname-ip-encoding-bypass.yaml +1 -1
  63. package/rules/data-poisoning/ATR-2026-00070-data-poisoning.yaml +1 -1
  64. package/rules/excessive-autonomy/ATR-2026-00491-garak-agent-breaker-markdown-just-raw-json.yaml +8 -8
  65. package/rules/excessive-autonomy/ATR-2026-00500-ssrf-via-agent-url-fetch-instruction.yaml +5 -3
  66. package/rules/excessive-autonomy/ATR-2026-00708-ipi-financial-transfer-unauthorized.yaml +4 -3
  67. package/rules/excessive-autonomy/ATR-2026-00711-ipi-system-sabotage-destructive-command.yaml +4 -3
  68. package/rules/excessive-autonomy/ATR-2026-00712-ipi-malicious-package-install.yaml +5 -3
  69. package/rules/excessive-autonomy/ATR-2026-00718-tool-misuse-financial-autonomous.yaml +8 -7
  70. package/rules/excessive-autonomy/ATR-2026-00719-tool-misuse-destructive-bulk-action.yaml +3 -3
  71. package/rules/excessive-autonomy/ATR-2026-01773-semantic-excessive-agency-action.yaml +3 -3
  72. package/rules/excessive-autonomy/ATR-2026-01801-asb-autonomous-vehicle-sabotage.yaml +3 -3
  73. package/rules/excessive-autonomy/ATR-2026-01804-asb-covert-unlogged-action.yaml +3 -4
  74. package/rules/excessive-autonomy/ATR-2026-01805-asb-financial-fraud-execution.yaml +3 -3
  75. package/rules/excessive-autonomy/ATR-2026-01806-asb-clinical-patient-harm.yaml +3 -3
  76. package/rules/excessive-autonomy/ATR-2026-01809-semantic-insider-manipulation-process-corruption.yaml +2 -3
  77. package/rules/excessive-autonomy/ATR-2026-01989-t1046-agent-internal-network-sweep.yaml +2 -2
  78. package/rules/excessive-autonomy/ATR-2026-01993-t1562-agent-impair-defenses.yaml +2 -2
  79. package/rules/excessive-autonomy/ATR-2026-02667-preapproved-tool-list-in-job-payload.yaml +0 -1
  80. package/rules/model-abuse/ATR-2026-00292-self-harm-eating-disorder-facilitation.yaml +3 -3
  81. package/rules/model-abuse/ATR-2026-00502-training-data-extraction-via-divergent-repetition-attack.yaml +2 -0
  82. package/rules/privilege-escalation/ATR-2026-00107-delayed-execution-bypass.yaml +2 -2
  83. package/rules/privilege-escalation/ATR-2026-00143-casual-privilege-escalation.yaml +3 -2
  84. package/rules/privilege-escalation/ATR-2026-00144-rationalized-safety-bypass.yaml +3 -2
  85. package/rules/privilege-escalation/ATR-2026-00204-stealth-execution-persistence.yaml +1 -1
  86. package/rules/privilege-escalation/ATR-2026-00441-semantic-kernel-sessions-python-plugin-startup-persistence.yaml +2 -1
  87. package/rules/privilege-escalation/ATR-2026-00546-crewai-json-loader-local-file-read.yaml +3 -1
  88. package/rules/privilege-escalation/ATR-2026-00549-destructive-tool-without-human-approval.yaml +2 -2
  89. package/rules/privilege-escalation/ATR-2026-01601-sql-injection-destructive-ddl.yaml +6 -5
  90. package/rules/privilege-escalation/ATR-2026-01602-sql-injection-union-select-exfil.yaml +3 -1
  91. package/rules/privilege-escalation/ATR-2026-01603-sql-injection-stacked-dml-abuse.yaml +3 -2
  92. package/rules/privilege-escalation/ATR-2026-01604-sql-injection-schema-enumeration.yaml +3 -2
  93. package/rules/privilege-escalation/ATR-2026-01616-path-traversal-agent-file-access.yaml +4 -1
  94. package/rules/privilege-escalation/ATR-2026-01802-asb-backdoor-surveillance-implant.yaml +4 -3
  95. package/rules/privilege-escalation/ATR-2026-01803-asb-covert-server-intrusion.yaml +4 -4
  96. package/rules/privilege-escalation/ATR-2026-01808-asb-synthetic-pan-payment-probe.yaml +3 -3
  97. package/rules/privilege-escalation/ATR-2026-01949-praisonai-mcpserver-unauth-tools-call.yaml +1 -1
  98. package/rules/privilege-escalation/ATR-2026-01974-anything-llm-data-import-access-control.yaml +1 -1
  99. package/rules/privilege-escalation/ATR-2026-01992-t1556-agent-auth-process-tamper.yaml +1 -1
  100. package/rules/privilege-escalation/ATR-2026-02040-file-edit-tool-persistence-write.yaml +1 -1
  101. package/rules/privilege-escalation/ATR-2026-02100-cypher-destructive-admin-query-injection.yaml +4 -4
  102. package/rules/privilege-escalation/ATR-2026-02101-dynamic-dunder-attribute-sandbox-escape.yaml +1 -1
  103. package/rules/privilege-escalation/ATR-2026-02142-download-tool-absolute-path-sandbox-escape.yaml +1 -1
  104. package/rules/privilege-escalation/ATR-2026-02146-export-tool-dest-dir-credential-directory-redirect.yaml +1 -1
  105. package/rules/privilege-escalation/ATR-2026-02195-dangerous-env-var-injection-config-tool.yaml +1 -1
  106. package/rules/privilege-escalation/ATR-2026-02300-mcp-stdio-config-dangerous-env-var.yaml +5 -5
  107. package/rules/privilege-escalation/ATR-2026-02301-symlink-outside-workspace-sensitive-target.yaml +1 -1
  108. package/rules/privilege-escalation/ATR-2026-02302-git-worktree-dotgit-sandbox-escape.yaml +1 -1
  109. package/rules/privilege-escalation/ATR-2026-02402-mcp-policy-engine-fail-open.yaml +0 -1
  110. package/rules/prompt-injection/ATR-2026-00154-unauthorized-background-task-execution-v.yaml +5 -3
  111. package/rules/prompt-injection/ATR-2026-00156-ssh-remote-command-execution-with-creden.yaml +6 -3
  112. package/rules/prompt-injection/ATR-2026-00407-echo-sql-jinja-template-injection.yaml +3 -3
  113. package/rules/prompt-injection/ATR-2026-00410-lmrc-harm-category-direct-elicitation.yaml +2 -2
  114. package/rules/prompt-injection/ATR-2026-00442-quoted-exact-output-forcing.yaml +2 -2
  115. package/rules/prompt-injection/ATR-2026-00512-rules-file-backdoor-injection.yaml +3 -0
  116. package/rules/prompt-injection/ATR-2026-00554-langchain-vulnerable-to-template-injecti.yaml +3 -3
  117. package/rules/prompt-injection/ATR-2026-01800-asb-trigger-marker-tool-coercion.yaml +3 -3
  118. package/rules/prompt-injection/ATR-2026-02009-bare-key-elicitation-trailing-colon.yaml +3 -2
  119. package/rules/prompt-injection/ATR-2026-02820-tool-result-orders-agent-to-hide-its-own-action.yaml +3 -3
  120. package/rules/skill-compromise/ATR-2026-00127-subcommand-overflow.yaml +2 -1
  121. package/rules/skill-compromise/ATR-2026-00157-timebomb-credential-exfil.yaml +6 -2
  122. package/rules/skill-compromise/ATR-2026-00200-agent-memory-config-tampering.yaml +1 -1
  123. package/rules/skill-compromise/ATR-2026-00217-credential-harvesting.yaml +4 -2
  124. package/rules/skill-compromise/ATR-2026-00222-credential-harvesting.yaml +6 -2
  125. package/rules/skill-compromise/ATR-2026-00224-credential-exfiltration.yaml +4 -2
  126. package/rules/skill-compromise/ATR-2026-00260-package-hallucination.yaml +3 -2
  127. package/rules/skill-compromise/ATR-2026-00266-malware-dropper-gen.yaml +4 -3
  128. package/rules/skill-compromise/ATR-2026-00398-huggingface-unsafe-model-artifact-load.yaml +3 -3
  129. package/rules/skill-compromise/ATR-2026-00429-nl-skill-self-modification.yaml +4 -2
  130. package/rules/skill-compromise/ATR-2026-00525-mini-shai-hulud-gh-token-monitor-persistence.yaml +1 -0
  131. package/rules/skill-compromise/ATR-2026-00527-skill-silent-git-remote-mirror-exfiltration.yaml +3 -2
  132. package/rules/skill-compromise/ATR-2026-01755-backdoor-pot-linguistic-trigger-phrase.yaml +1 -1
  133. package/rules/skill-compromise/ATR-2026-01756-backdoor-pot-symbol-emoticon-trigger.yaml +1 -1
  134. package/rules/tool-poisoning/ATR-2026-00096-registry-poisoning.yaml +4 -3
  135. package/rules/tool-poisoning/ATR-2026-00100-consent-bypass-instruction.yaml +4 -2
  136. package/rules/tool-poisoning/ATR-2026-00105-silent-action-concealment.yaml +2 -1
  137. package/rules/tool-poisoning/ATR-2026-00106-schema-description-contradiction.yaml +2 -2
  138. package/rules/tool-poisoning/ATR-2026-00270-xss-in-tool-response.yaml +4 -3
  139. package/rules/tool-poisoning/ATR-2026-00494-garak-exploitation-mixedunassigned.yaml +5 -3
  140. package/rules/tool-poisoning/ATR-2026-00513-package-hallucination-exploitation.yaml +9 -7
  141. package/rules/tool-poisoning/ATR-2026-00521-shell-command-injection-agent-tool-context.yaml +5 -3
  142. package/rules/tool-poisoning/ATR-2026-00522-sql-injection-natural-language-agent-interface.yaml +4 -3
  143. package/rules/tool-poisoning/ATR-2026-00526-claude-code-shell-metachar-in-double-quoted-path.yaml +4 -3
  144. package/rules/tool-poisoning/ATR-2026-00530-ms-agent-shell-tool-unsanitized-argv-rce.yaml +4 -3
  145. package/rules/tool-poisoning/ATR-2026-00531-praisonai-unauthenticated-agent-api.yaml +1 -2
  146. package/rules/tool-poisoning/ATR-2026-00533-apache-pinot-mcp-unauthenticated-takeover.yaml +2 -3
  147. package/rules/tool-poisoning/ATR-2026-00716-ipi-data-destruction-carrier.yaml +5 -3
  148. package/rules/tool-poisoning/ATR-2026-00720-tool-misuse-privilege-escalation-social.yaml +3 -3
  149. package/rules/tool-poisoning/ATR-2026-01301-tool-description-exclusive-tool-override.yaml +1 -1
  150. package/rules/tool-poisoning/ATR-2026-01303-tool-schema-enumeration-social-engineering.yaml +4 -3
  151. package/rules/tool-poisoning/ATR-2026-01307-mcp-dns-rebinding-attack.yaml +3 -5
  152. package/rules/tool-poisoning/ATR-2026-01310-mcp-tool-description-compliance-history-exfil.yaml +5 -4
  153. package/rules/tool-poisoning/ATR-2026-01775-semantic-mcp-tool-manifest-poisoning.yaml +1 -1
  154. package/rules/tool-poisoning/ATR-2026-01952-praisonai-codemode-sandbox-escape-rce.yaml +4 -2
  155. package/rules/tool-poisoning/ATR-2026-01953-praisonai-codemode-function-ctor-sandbox-escape.yaml +4 -2
  156. package/rules/tool-poisoning/ATR-2026-01959-openhuman-shell-allowlist-env-prefix-bypass.yaml +4 -2
  157. package/rules/tool-poisoning/ATR-2026-01963-praisonai-action-orchestrator-step-target-path-traversal-rce.yaml +3 -2
  158. package/rules/tool-poisoning/ATR-2026-01965-flowise-custommcp-os-command-rce.yaml +2 -1
  159. package/rules/tool-poisoning/ATR-2026-01967-deepchat-mermaid-xss-rce-ipc-mcp-register.yaml +4 -2
  160. package/rules/tool-poisoning/ATR-2026-01970-praisonai-filetools-normpath-path-traversal.yaml +2 -2
  161. package/rules/tool-poisoning/ATR-2026-01973-anythingllm-logo-endpoint-path-traversal.yaml +2 -2
  162. package/rules/tool-poisoning/ATR-2026-01978-anythingllm-collector-process-filename-path-traversal-delete.yaml +2 -2
  163. package/rules/tool-poisoning/ATR-2026-01979-pandasai-prompt-injection-dunder-sandbox-escape-rce.yaml +6 -2
  164. package/rules/tool-poisoning/ATR-2026-01980-agentic-flow-mcp-tool-param-command-injection.yaml +4 -2
  165. package/rules/tool-poisoning/ATR-2026-01982-dbt-mcp-node-selection-argument-injection.yaml +2 -2
  166. package/rules/tool-poisoning/ATR-2026-01983-mcp-for-stata-log-file-name-command-injection.yaml +4 -2
  167. package/rules/tool-poisoning/ATR-2026-01985-mcp-connect-bridge-unauth-process-spawn-rce.yaml +2 -1
  168. package/rules/tool-poisoning/ATR-2026-01987-langroid-sqlchatagent-prompt-to-sql-rce.yaml +4 -2
  169. package/rules/tool-poisoning/ATR-2026-02102-html-injection-tool-arg-approval-ui-xss.yaml +1 -1
  170. package/rules/tool-poisoning/ATR-2026-02141-mcp-server-config-command-execution.yaml +1 -1
  171. package/rules/tool-poisoning/ATR-2026-02233-unscoped-destructive-db-request-nl.yaml +1 -1
package/CHANGELOG.md CHANGED
@@ -4,6 +4,172 @@ All notable changes to ATR will be documented in this file.
4
4
 
5
5
  ## [Unreleased]
6
6
 
7
+ ## [4.2.2] - 2026-10-28
8
+
9
+ A patch release of export and converter fixes, five rule rewrites for Python
10
+ portability, and reference corrections. The rule format, identifier scheme,
11
+ engine matching and Match output are unchanged.
12
+
13
+ Default behaviour that changes:
14
+
15
+ - Nothing the engine matches. The five rewritten rules match the same samples
16
+ as before on every test case, evasion test and text file under `data/`.
17
+ - Exports regenerated from this release differ from earlier ones: the
18
+ converters (`atr convert`, `ruleToSPL()`, `ruleToElastic()`, Sage), the
19
+ Cisco Skill Scanner pack, the PyRIT digest, the Pipelock bundle and the
20
+ RAMPART evaluator now follow SPEC §6.4, so a condition without a flag group
21
+ matches case-insensitively and a leading `(?s)` or `(?m)` has no effect.
22
+ See the upgrade note under the converters entry below.
23
+ - `references` and `compliance` metadata changes on 139 rules (the OWASP and
24
+ ATLAS corrections below). Tooling that reports or groups by those ids sees
25
+ different buckets.
26
+
27
+ ### Added
28
+
29
+ - **`export-cisco-pack.ts --downstream` writes the Cisco Skill Scanner's
30
+ schema_version 2 pack.** The scanner now validates its bundled packs
31
+ against a strict schema at startup: it rejects `signature_files` and any
32
+ rule field outside its allowlist (`maturity`, `atr_id`, `atr_url` and
33
+ `file` included), and every rule needs a Cisco AI taxonomy code or a
34
+ default for its category. A pack exported as before fails to load. With
35
+ `--downstream <vendored pack dir>` the exporter writes that schema and
36
+ carries the scanner maintainers' choices forward: each existing rule keeps
37
+ the scanner category and taxonomy code it has downstream, and a new rule
38
+ takes the scanner category its ATR category already maps to and inherits
39
+ that category's default code. It stops instead of guessing when an ATR
40
+ category maps to more than one scanner category or a new rule's category
41
+ has no default; `--taxonomy <ATR id>=<code>` supplies the code. The pack
42
+ description names no benchmark figure. Without `--downstream` the output is
43
+ unchanged. `tests/cisco-pack-downstream-v2.test.ts` covers the contract.
44
+
45
+ ### Fixed
46
+
47
+ - **OWASP and MITRE ATLAS references corrected on 108 rules** (#675).
48
+ `references.owasp_llm`, `references.owasp_agentic` and
49
+ `references.mitre_atlas` are corrected where a rule named an identifier
50
+ that does not describe what it detects. No detection, severity, maturity,
51
+ status, confidence or response field changes. The two crosswalks CI checks
52
+ against rule metadata are regenerated.
53
+
54
+ - **OWASP compliance entries aligned with the corrected references on 25
55
+ rules** (#680). 29 `compliance.owasp_agentic` / `compliance.owasp_llm`
56
+ entries still named an identifier #675 removed from `references`, which
57
+ kept it in `docs/OWASP-AGENTIC-MAPPING.md`.
58
+
59
+ - **`LLM08:2025` used for Excessive Agency replaced on 30 rules** (#684). In
60
+ the OWASP Top 10 for LLM Applications 2025, LLM08 is Vector and Embedding
61
+ Weaknesses and Excessive Agency is LLM06. Only `references.owasp_llm` and
62
+ `compliance.owasp_llm` change; two rules that use LLM08 for its real
63
+ meaning keep it.
64
+
65
+ - **Five rules compile under Python `re`.** The Cisco Skill Scanner pack and
66
+ other Python consumers compile patterns with `re`, which rejects
67
+ variable-width look-behind and a back-reference to a group that does not
68
+ exist; such a pattern is skipped and detects nothing there. Twelve
69
+ conditions in five rules were affected. ATR-2026-00442 and -02100 split a
70
+ negative look-behind over alternatives of different lengths into one
71
+ look-behind per alternative. ATR-2026-02300 and -02304 match the
72
+ `mcpServers` or fetch-verb prefix instead of looking behind for it, which
73
+ changes the matched span but not whether the condition matches. The fourth
74
+ condition of ATR-2026-00290, `(?:(?:\w+\s+){40,})\1{3,}`, is removed: its
75
+ `\1` refers to no group, which JavaScript reads as the character U+0001, so
76
+ it never matched anything. On every test case and evasion test of the five
77
+ rules and the text files under `data/` (7,963 samples), the old and new
78
+ rules match the same samples. `check-python-compat.py` now reports 0
79
+ uncompilable patterns in the exported pack, down from 12, and
80
+ ATR-2026-02300 and -02304 profile more than 3x cheaper than their latency
81
+ baseline (171.6x and 9.2x).
82
+ Compiling under Python also exposed the ReDoS gate to three of these
83
+ conditions for the first time, and they backtracked quadratically on a long
84
+ run of whitespace: ATR-2026-00442#1 on `\s*[:,-]?\s*` and ATR-2026-02300#1
85
+ and #3 on `:\s*\n\s+`. Both are rewritten to accept the same strings
86
+ without the ambiguity, `(?:\s*[:,-])?\s*` and `:[^\S\n]*\n\s+`. The
87
+ five rules' entries in `data/benign-fp-measurement.json` are re-measured
88
+ because their detection fingerprints changed; their false-positive counts
89
+ are unchanged.
90
+
91
+ - **The RAMPART evaluator compiles patterns as SPEC §6.4 says.**
92
+ `integrations/rampart/src/atr_rules_evaluator.py` compiled each rule's
93
+ pattern as written with `re.IGNORECASE | re.MULTILINE`, so `^` and `$`
94
+ matched at every line of a field and the letters of a leading flag group
95
+ took effect (`(?s)` let `.` match a newline). It now removes one leading
96
+ `(?imsx)` group and compiles the rest with `re.IGNORECASE` only, as pyATR
97
+ does. On the rules on main this can change a result only on multi-line
98
+ input to a rule whose first regex condition, the only one the evaluator
99
+ reads, contains `^` or `$`; none of those rules' test samples is matched
100
+ differently by that condition. The evaluator is one of the exports issue
101
+ #698 lists.
102
+
103
+ - **The PyRIT digest, the Cisco Skill Scanner pack and the Pipelock bundle
104
+ now follow SPEC §6.4.** PyRIT's `RegexScorer` and the Cisco scanner
105
+ compile patterns with Python `re` and no flags, Pipelock with Go RE2, and
106
+ both honour an inline flag group. The exporters passed each condition's
107
+ leading group through, so the `(?im)`, `(?si)` and `(?is)` of
108
+ ATR-2026-00450, -00859 and -00207 were applied. A condition written
109
+ without `(?i)` was case-sensitive in the Cisco pack, and in the Pipelock
110
+ bundle's injection rules, which Pipelock releases up to v3.7.0 compile as
111
+ written; Pipelock adds `(?i)` to DLP and tool-poison rules itself, and the
112
+ digest already added it. Each pattern is now `(?i)` followed by
113
+ `regexConditionSpec(value).source`, the pattern the engine compiles; the
114
+ Pipelock bundle puts one `(?i)` in front of a rule's joined alternatives.
115
+ Output change on the rules on main: in `data/pyrit-digest.json`, four
116
+ patterns, of which only ATR-2026-00450#2 matches differently. The digest is
117
+ also regenerated at main for the first time since 4.0.0, in a commit of its
118
+ own: 116 new conditions, 5 removed with the deprecated ATR-2026-00233, 121
119
+ patterns edited in their rules and nine new `condition: all` exclusions.
120
+ The exporter no longer emits a `case_sensitive` marker, which no rule sets
121
+ and §6.4 gives no effect. `tests/pyrit-digest.test.ts` checks the
122
+ transform on fixed inputs and that every committed pattern starts with
123
+ exactly one `(?i)`; it does not compare the digest with the rules, so a
124
+ rule edit does not require regenerating it. The Cisco pack changes 1,161
125
+ of 3,471 patterns in 307 signatures, 1,157 of them because they gain
126
+ `(?i)`; `--reproduce-vendored` keeps the vendored pack's verbatim
127
+ patterns, its output is unchanged, and a new test checks that wiring. The
128
+ Pipelock bundle changes every rule's regex: 814 conditions in 191
129
+ injection rules become case-insensitive on Pipelock releases up to v3.7.0,
130
+ and ATR-2026-00450 no longer matches at the start of a second line; the
131
+ compiler version is now 1.0.1. No pattern starts or stops compiling under
132
+ Python `re` or Go RE2. Issue #698; `tests/compile-pipelock.test.ts` is new.
133
+
134
+ - **The rule converters translate regex conditions per SPEC §6.4.**
135
+ `atr convert generic-regex|splunk|elastic`, the package exports
136
+ `ruleToSPL()`, `ruleToElastic()`, `convertRule()` and `convertAllRules()`,
137
+ and the `converters/sage` and `converters/sage-reverse` subpaths each
138
+ followed a condition's leading flag group instead of SPEC §6.4 (issue
139
+ #698):
140
+ - generic-regex copied the group's letters into `flags`, so a condition
141
+ without `(?i)` exported `flags: ""` (case-sensitive) and `(?im)` or
142
+ `(?is)` turned on multiline or dotAll in the consumer. `flags` is now
143
+ always `i`, or `iu` when the pattern needs Unicode mode.
144
+ - Splunk passed the group to PCRE unchanged, with the same two effects.
145
+ Every regex now starts with a single `(?i)`.
146
+ - Elastic put the group into a Lucene `regexp` value, where inline flags do
147
+ not exist. The value is now the condition without its group;
148
+ `case_insensitive: true` is unchanged.
149
+ - Sage exported a rule as case-sensitive unless a group said `(?i)`. Every
150
+ exported rule now sets `case_insensitive: true`; a condition that depends
151
+ on the `u` flag, which Sage cannot set, is skipped with a warning; and the
152
+ "mixes case-sensitive" and "unsupported inline flags" warnings are gone.
153
+ Importing from Sage (`sage-reverse`) now always writes `(?i)` and warns
154
+ (`case_sensitivity_lost`) when the Sage rule was case-sensitive.
155
+
156
+ The dialect lives in the new dependency-free `src/regex-dialect.ts`
157
+ (`regexConditionSpec()`, `needsUnicodeFlag()`, `inlineCaseInsensitive()`),
158
+ so the published `converters/sage` subpath does not load the engine;
159
+ `src/engine.ts` imports and re-exports it, and the rule-quality and
160
+ rule-latency gates now also run when it changes. The generic-regex docs no
161
+ longer show an import path the package does not export.
162
+
163
+ Upgrade note: exports regenerated after this change differ from earlier
164
+ ones. Conditions without a flag group now match case-insensitively, so a
165
+ SIEM or scanner that loads them can see more matches, and conditions whose
166
+ group had `s` or `m` no longer let `.` cross a line break or `^` and `$`
167
+ match inside the field. Generic-regex `flags` can now be `iu`, so a consumer
168
+ that maps the letters to another regex engine must accept `u`. The Sage
169
+ export skips conditions that depend on `u`. `ReverseWarning['kind']` gains
170
+ `case_sensitivity_lost`; TypeScript code that switches over it exhaustively
171
+ must handle it.
172
+
7
173
  ## [4.2.1] - 2026-10-24
8
174
 
9
175
  A patch release of rule fixes and one new rule, plus two release-tooling
@@ -1 +1 @@
1
- {"version":3,"file":"elastic.d.ts","sourceRoot":"","sources":["../../src/converters/elastic.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAqB,MAAM,aAAa,CAAC;AAE9D,UAAU,YAAY;IACpB,KAAK,EAAE;QACL,OAAO,EAAE,MAAM,CAAC;QAChB,KAAK,EAAE,MAAM,CAAC;QACd,QAAQ,EAAE,MAAM,CAAC;QACjB,QAAQ,EAAE,MAAM,CAAC;QACjB,WAAW,EAAE,MAAM,CAAC;QACpB,eAAe,EAAE,MAAM,CAAC;KACzB,CAAC;IACF,KAAK,EAAE;QACL,IAAI,EAAE;YACJ,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC;YACnB,IAAI,CAAC,EAAE,OAAO,EAAE,CAAC;YACjB,oBAAoB,CAAC,EAAE,MAAM,CAAC;SAC/B,CAAC;KACH,CAAC;CACH;AA4ED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,OAAO,GAAG,YAAY,CAkDzD"}
1
+ {"version":3,"file":"elastic.d.ts","sourceRoot":"","sources":["../../src/converters/elastic.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAqB,MAAM,aAAa,CAAC;AAG9D,UAAU,YAAY;IACpB,KAAK,EAAE;QACL,OAAO,EAAE,MAAM,CAAC;QAChB,KAAK,EAAE,MAAM,CAAC;QACd,QAAQ,EAAE,MAAM,CAAC;QACjB,QAAQ,EAAE,MAAM,CAAC;QACjB,WAAW,EAAE,MAAM,CAAC;QACpB,eAAe,EAAE,MAAM,CAAC;KACzB,CAAC;IACF,KAAK,EAAE;QACL,IAAI,EAAE;YACJ,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC;YACnB,IAAI,CAAC,EAAE,OAAO,EAAE,CAAC;YACjB,oBAAoB,CAAC,EAAE,MAAM,CAAC;SAC/B,CAAC;KACH,CAAC;CACH;AAiFD;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,OAAO,GAAG,YAAY,CAkDzD"}
@@ -6,6 +6,7 @@
6
6
  *
7
7
  * @module agent-threat-rules/converters/elastic
8
8
  */
9
+ import { regexConditionSpec } from '../regex-dialect.js';
9
10
  /**
10
11
  * Convert a single ATR array condition to an Elastic Query DSL clause.
11
12
  */
@@ -14,10 +15,15 @@ function conditionToElastic(cond) {
14
15
  const value = cond.value;
15
16
  switch (cond.operator) {
16
17
  case 'regex':
18
+ // Lucene regular expressions have no inline flags, so a leading (?i)
19
+ // group was never a flag there: Lucene reads it as literal characters
20
+ // or rejects the query (not tested against a live cluster). Case-insensitivity
21
+ // comes from case_insensitive below (SPEC §6.4: always), and m, s and x
22
+ // have no effect in ATR.
17
23
  return {
18
24
  regexp: {
19
25
  [field]: {
20
- value: value,
26
+ value: regexConditionSpec(value).source,
21
27
  flags: 'ALL',
22
28
  case_insensitive: true,
23
29
  },
@@ -1 +1 @@
1
- {"version":3,"file":"elastic.js","sourceRoot":"","sources":["../../src/converters/elastic.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"elastic.js","sourceRoot":"","sources":["../../src/converters/elastic.ts"],"names":[],"mappings":"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"}
@@ -5,7 +5,11 @@
5
5
  * Designed for consumption by any security tool that supports regex matching.
6
6
  * Format: JSON array of { id, title, severity, category, patterns[] }
7
7
  *
8
- * Used by: Cisco AI Defense, Microsoft Agent Governance Toolkit, custom integrations.
8
+ * Each pattern is `{ field, regex, flags, description }` for a consumer that
9
+ * compiles `new RegExp(regex, flags)`. Per SPEC §6.4, `regex` is the condition
10
+ * without its leading flag group and `flags` is always `i`, or `iu` when the
11
+ * pattern needs Unicode mode: every condition matches case-insensitively, and
12
+ * `m`, `s` and `x` have no effect.
9
13
  *
10
14
  * @module agent-threat-rules/converters/generic-regex
11
15
  */
@@ -1 +1 @@
1
- {"version":3,"file":"generic-regex.d.ts","sourceRoot":"","sources":["../../src/converters/generic-regex.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEvE,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC;IAC/B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,QAAQ,EAAE,SAAS,mBAAmB,EAAE,CAAC;IAClD,QAAQ,CAAC,UAAU,EAAE,aAAa,GAAG,SAAS,CAAC;CAChD;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,OAAO,GAAG,gBAAgB,CAsClE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,SAAS,OAAO,EAAE,GAAG,SAAS,gBAAgB,EAAE,CAK1F"}
1
+ {"version":3,"file":"generic-regex.d.ts","sourceRoot":"","sources":["../../src/converters/generic-regex.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAGvE,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC;IAC/B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,QAAQ,EAAE,SAAS,mBAAmB,EAAE,CAAC;IAClD,QAAQ,CAAC,UAAU,EAAE,aAAa,GAAG,SAAS,CAAC;CAChD;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,OAAO,GAAG,gBAAgB,CAkClE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,SAAS,OAAO,EAAE,GAAG,SAAS,gBAAgB,EAAE,CAK1F"}
@@ -5,10 +5,15 @@
5
5
  * Designed for consumption by any security tool that supports regex matching.
6
6
  * Format: JSON array of { id, title, severity, category, patterns[] }
7
7
  *
8
- * Used by: Cisco AI Defense, Microsoft Agent Governance Toolkit, custom integrations.
8
+ * Each pattern is `{ field, regex, flags, description }` for a consumer that
9
+ * compiles `new RegExp(regex, flags)`. Per SPEC §6.4, `regex` is the condition
10
+ * without its leading flag group and `flags` is always `i`, or `iu` when the
11
+ * pattern needs Unicode mode: every condition matches case-insensitively, and
12
+ * `m`, `s` and `x` have no effect.
9
13
  *
10
14
  * @module agent-threat-rules/converters/generic-regex
11
15
  */
16
+ import { regexConditionSpec } from '../regex-dialect.js';
12
17
  /**
13
18
  * Convert a single ATR rule to generic regex format.
14
19
  */
@@ -20,18 +25,14 @@ export function ruleToGenericRegex(rule) {
20
25
  : Object.values(rule.detection.conditions);
21
26
  for (const condition of conditions) {
22
27
  if ('operator' in condition && condition.operator === 'regex' && 'value' in condition && condition.value) {
23
- // Extract flags from the regex (e.g. (?i) → 'i')
24
- let regex = condition.value;
25
- let flags = '';
26
- const flagMatch = regex.match(/^\(\?([gimsuy]+)\)/);
27
- if (flagMatch) {
28
- flags = flagMatch[1];
29
- regex = regex.slice(flagMatch[0].length);
30
- }
28
+ // SPEC §6.4. This used to copy the group's letters into `flags`, so a
29
+ // condition without (?i) exported flags "" (case-sensitive) and (?im) or
30
+ // (?is) turned on multiline or dotAll in the consumer.
31
+ const spec = regexConditionSpec(condition.value);
31
32
  patterns.push({
32
33
  field: 'field' in condition ? condition.field : 'content',
33
- regex,
34
- flags,
34
+ regex: spec.source,
35
+ flags: spec.flags,
35
36
  description: ('description' in condition ? condition.description : '') ?? '',
36
37
  });
37
38
  }
@@ -1 +1 @@
1
- {"version":3,"file":"generic-regex.js","sourceRoot":"","sources":["../../src/converters/generic-regex.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAsBH;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAAa;IAC9C,MAAM,QAAQ,GAA0B,EAAE,CAAC;IAE3C,kDAAkD;IAClD,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC;QACzD,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,UAAU;QAC3B,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;IAE7C,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,IAAI,UAAU,IAAI,SAAS,IAAI,SAAS,CAAC,QAAQ,KAAK,OAAO,IAAI,OAAO,IAAI,SAAS,IAAI,SAAS,CAAC,KAAK,EAAE,CAAC;YACzG,iDAAiD;YACjD,IAAI,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC;YAC5B,IAAI,KAAK,GAAG,EAAE,CAAC;YACf,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;YACpD,IAAI,SAAS,EAAE,CAAC;gBACd,KAAK,GAAG,SAAS,CAAC,CAAC,CAAE,CAAC;gBACtB,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;YAC3C,CAAC;YAED,QAAQ,CAAC,IAAI,CAAC;gBACZ,KAAK,EAAE,OAAO,IAAI,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS;gBACzD,KAAK;gBACL,KAAK;gBACL,WAAW,EAAE,CAAC,aAAa,IAAI,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,EAAE;aAC7E,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO;QACL,EAAE,EAAE,IAAI,CAAC,EAAE;QACX,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ;QAC5B,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,EAAE;QACxC,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,KAAK;QAC3C,QAAQ;QACR,UAAU,EAAE,IAAI,CAAC,UAAU,IAAI,EAAE;KAClC,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,KAAyB;IAC3D,OAAO,KAAK;SACT,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,YAAY,CAAC;SACxC,GAAG,CAAC,kBAAkB,CAAC;SACvB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AAC1C,CAAC"}
1
+ {"version":3,"file":"generic-regex.js","sourceRoot":"","sources":["../../src/converters/generic-regex.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAGH,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAoBzD;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAAa;IAC9C,MAAM,QAAQ,GAA0B,EAAE,CAAC;IAE3C,kDAAkD;IAClD,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC;QACzD,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,UAAU;QAC3B,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;IAE7C,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,IAAI,UAAU,IAAI,SAAS,IAAI,SAAS,CAAC,QAAQ,KAAK,OAAO,IAAI,OAAO,IAAI,SAAS,IAAI,SAAS,CAAC,KAAK,EAAE,CAAC;YACzG,sEAAsE;YACtE,yEAAyE;YACzE,uDAAuD;YACvD,MAAM,IAAI,GAAG,kBAAkB,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;YAEjD,QAAQ,CAAC,IAAI,CAAC;gBACZ,KAAK,EAAE,OAAO,IAAI,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS;gBACzD,KAAK,EAAE,IAAI,CAAC,MAAM;gBAClB,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,WAAW,EAAE,CAAC,aAAa,IAAI,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,EAAE;aAC7E,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO;QACL,EAAE,EAAE,IAAI,CAAC,EAAE;QACX,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ;QAC5B,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,EAAE;QACxC,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,KAAK;QAC3C,QAAQ;QACR,UAAU,EAAE,IAAI,CAAC,UAAU,IAAI,EAAE;KAClC,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,KAAyB;IAC3D,OAAO,KAAK;SACT,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,YAAY,CAAC;SACxC,GAAG,CAAC,kBAAkB,CAAC;SACvB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AAC1C,CAAC"}
@@ -31,7 +31,7 @@ export interface ReverseConvertResult {
31
31
  }
32
32
  export interface ReverseWarning {
33
33
  readonly sageId: string;
34
- readonly kind: 'missing_description' | 'missing_test_cases' | 'missing_compliance' | 'missing_references' | 'category_unknown' | 'match_on_ambiguous';
34
+ readonly kind: 'missing_description' | 'missing_test_cases' | 'missing_compliance' | 'missing_references' | 'category_unknown' | 'match_on_ambiguous' | 'case_sensitivity_lost';
35
35
  readonly detail: string;
36
36
  }
37
37
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"sage-reverse.d.ts","sourceRoot":"","sources":["../../src/converters/sage-reverse.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,OAAO,KAAK,EACX,OAAO,EAKP,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,QAAQ,EAAyC,MAAM,WAAW,CAAC;AAEjF,MAAM,WAAW,oBAAoB;IACpC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,QAAQ,EAAE,SAAS,cAAc,EAAE,CAAC;CAC7C;AAED,MAAM,WAAW,cAAc;IAC9B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EACV,qBAAqB,GACrB,oBAAoB,GACpB,oBAAoB,GACpB,oBAAoB,GACpB,kBAAkB,GAClB,oBAAoB,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACxB;AAwFD;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,QAAQ,GAAG,oBAAoB,CAoG9D;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC7B,SAAS,EAAE,SAAS,QAAQ,EAAE,GAC5B;IAAE,QAAQ,CAAC,KAAK,EAAE,SAAS,OAAO,EAAE,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,SAAS,cAAc,EAAE,CAAA;CAAE,CAStF"}
1
+ {"version":3,"file":"sage-reverse.d.ts","sourceRoot":"","sources":["../../src/converters/sage-reverse.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,OAAO,KAAK,EACX,OAAO,EAKP,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,QAAQ,EAAyC,MAAM,WAAW,CAAC;AAEjF,MAAM,WAAW,oBAAoB;IACpC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,QAAQ,EAAE,SAAS,cAAc,EAAE,CAAC;CAC7C;AAED,MAAM,WAAW,cAAc;IAC9B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EACV,qBAAqB,GACrB,oBAAoB,GACpB,oBAAoB,GACpB,oBAAoB,GACpB,kBAAkB,GAClB,oBAAoB,GACpB,uBAAuB,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACxB;AAwFD;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,QAAQ,GAAG,oBAAoB,CA0G9D;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC7B,SAAS,EAAE,SAAS,QAAQ,EAAE,GAC5B;IAAE,QAAQ,CAAC,KAAK,EAAE,SAAS,OAAO,EAAE,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,SAAS,cAAc,EAAE,CAAA;CAAE,CAStF"}
@@ -132,14 +132,19 @@ export function sageToAtr(sage) {
132
132
  detail: `Multi-channel match_on=${matchOnList.join(',')} expanded to ${matchOnList.length} ATR conditions`,
133
133
  });
134
134
  }
135
- // Build conditions. If Sage rule has case_insensitive: true, wrap the
136
- // regex with (?i) prefix so the ATR rule preserves case-insensitive
137
- // semantics when run on an ATR engine.
138
- const regexValue = sage.case_insensitive
139
- ? sage.pattern.startsWith('(?i)')
140
- ? sage.pattern
141
- : `(?i)${sage.pattern}`
142
- : sage.pattern;
135
+ // Build conditions. An ATR engine matches every regex condition
136
+ // case-insensitively, whatever the pattern says (SPEC §6.4), so the
137
+ // condition always gets (?i) and reads the way it behaves. A case-sensitive
138
+ // Sage rule cannot keep that distinction in ATR; say so instead of
139
+ // importing a pattern that only looks case-sensitive.
140
+ const regexValue = sage.pattern.startsWith('(?i)') ? sage.pattern : `(?i)${sage.pattern}`;
141
+ if (!sage.case_insensitive) {
142
+ warnings.push({
143
+ sageId: sage.id,
144
+ kind: 'case_sensitivity_lost',
145
+ detail: 'Sage rule is case-sensitive; ATR matches every regex condition case-insensitively (SPEC §6.4), so the imported rule can match more inputs',
146
+ });
147
+ }
143
148
  const conditions = matchOnList.map((m) => ({
144
149
  field: reverseMatchOn(m),
145
150
  operator: 'regex',
@@ -1 +1 @@
1
- {"version":3,"file":"sage-reverse.js","sourceRoot":"","sources":["../../src/converters/sage-reverse.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AA4BH,8EAA8E;AAE9E;;;GAGG;AACH,MAAM,oBAAoB,GAA0C,MAAM,CAAC,MAAM,CAAC;IACjF,gBAAgB,EAAE,kBAAkB;IACpC,aAAa,EAAE,gBAAgB;IAC/B,oBAAoB,EAAE,sBAAsB;IAC5C,kBAAkB,EAAE,oBAAoB;IACxC,oBAAoB,EAAE,sBAAsB;IAC5C,kBAAkB,EAAE,oBAAoB;IACxC,cAAc,EAAE,gBAAgB;IAChC,WAAW,EAAE,aAAa;IAC1B,gBAAgB,EAAE,kBAAkB;CACpC,CAAC,CAAC;AAEH,MAAM,oBAAoB,GAAgD,MAAM,CAAC,MAAM,CAAC;IACvF,QAAQ,EAAE,UAAU;IACpB,IAAI,EAAE,MAAM;IACZ,MAAM,EAAE,QAAQ;IAChB,GAAG,EAAE,KAAK;CACV,CAAC,CAAC;AAEH;;;;GAIG;AACH,SAAS,aAAa,CAAC,IAAgB;IACtC,QAAQ,IAAI,EAAE,CAAC;QACd,KAAK,OAAO;YACX,OAAO,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;QACjC,KAAK,kBAAkB;YACtB,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QAC9B,KAAK,KAAK;YACT,OAAO,CAAC,OAAO,CAAC,CAAC;IACnB,CAAC;AACF,CAAC;AAED;;;;GAIG;AACH,SAAS,cAAc,CAAC,WAAwB;IAC/C,QAAQ,WAAW,EAAE,CAAC;QACrB,KAAK,KAAK;YACT,OAAO,KAAK,CAAC;QACd,KAAK,SAAS;YACb,OAAO,WAAW,CAAC;QACpB,KAAK,WAAW;YACf,OAAO,WAAW,CAAC;QACpB,KAAK,SAAS;YACb,OAAO,SAAS,CAAC;QAClB,KAAK,QAAQ;YACZ,OAAO,WAAW,CAAC;IACrB,CAAC;AACF,CAAC;AAED,8EAA8E;AAE9E;;;GAGG;AACH,SAAS,6BAA6B,CAAC,CAAS;IAC/C,IAAI,CAAC,IAAI,IAAI;QAAE,OAAO,MAAM,CAAC;IAC7B,IAAI,CAAC,IAAI,GAAG;QAAE,OAAO,QAAQ,CAAC;IAC9B,OAAO,KAAK,CAAC;AACd,CAAC;AAED,8EAA8E;AAE9E;;;GAGG;AACH,SAAS,gBAAgB,CAAC,MAAc;IACvC,gEAAgE;IAChE,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAC7D,MAAM,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACtC,OAAO,OAAO,IAAI,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;AAC7D,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,SAAS,CAAC,IAAc;IACvC,MAAM,QAAQ,GAAqB,EAAE,CAAC;IAEtC,uCAAuC;IACvC,MAAM,WAAW,GAAG,oBAAoB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACxD,IAAI,CAAC,WAAW,EAAE,CAAC;QAClB,QAAQ,CAAC,IAAI,CAAC;YACb,MAAM,EAAE,IAAI,CAAC,EAAE;YACf,IAAI,EAAE,kBAAkB;YACxB,MAAM,EAAE,kBAAkB,IAAI,CAAC,QAAQ,gFAAgF;SACvH,CAAC,CAAC;IACJ,CAAC;IAED,sEAAsE;IACtE,kBAAkB;IAClB,MAAM,WAAW,GAAkB,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC;QAC9D,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC;QACpB,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAEnB,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5B,QAAQ,CAAC,IAAI,CAAC;YACb,MAAM,EAAE,IAAI,CAAC,EAAE;YACf,IAAI,EAAE,oBAAoB;YAC1B,MAAM,EAAE,0BAA0B,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,gBAAgB,WAAW,CAAC,MAAM,iBAAiB;SAC1G,CAAC,CAAC;IACJ,CAAC;IAED,sEAAsE;IACtE,oEAAoE;IACpE,uCAAuC;IACvC,MAAM,UAAU,GAAG,IAAI,CAAC,gBAAgB;QACvC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC;YAChC,CAAC,CAAC,IAAI,CAAC,OAAO;YACd,CAAC,CAAC,OAAO,IAAI,CAAC,OAAO,EAAE;QACxB,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC;IAEhB,MAAM,UAAU,GAAwB,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC/D,KAAK,EAAE,cAAc,CAAC,CAAC,CAAC;QACxB,QAAQ,EAAE,OAAO;QACjB,KAAK,EAAE,UAAU;QACjB,WAAW,EAAE,2BAA2B,IAAI,CAAC,EAAE,EAAE;KACjD,CAAC,CAAC,CAAC;IAEJ,QAAQ,CAAC,IAAI,CAAC;QACb,MAAM,EAAE,IAAI,CAAC,EAAE;QACf,IAAI,EAAE,qBAAqB;QAC3B,MAAM,EAAE,sEAAsE;KAC9E,CAAC,CAAC;IACH,QAAQ,CAAC,IAAI,CAAC;QACb,MAAM,EAAE,IAAI,CAAC,EAAE;QACf,IAAI,EAAE,oBAAoB;QAC1B,MAAM,EAAE,wFAAwF;KAChG,CAAC,CAAC;IACH,QAAQ,CAAC,IAAI,CAAC;QACb,MAAM,EAAE,IAAI,CAAC,EAAE;QACf,IAAI,EAAE,oBAAoB;QAC1B,MAAM,EAAE,0FAA0F;KAClG,CAAC,CAAC;IACH,QAAQ,CAAC,IAAI,CAAC;QACb,MAAM,EAAE,IAAI,CAAC,EAAE;QACf,IAAI,EAAE,oBAAoB;QAC1B,MAAM,EAAE,8EAA8E;KACtF,CAAC,CAAC;IAEH,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;IACvB,MAAM,OAAO,GAAG,GAAG,GAAG,CAAC,cAAc,EAAE,IAAI,MAAM,CAAC,GAAG,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;IAEzI,MAAM,IAAI,GAAY;QACrB,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,EAAE,EAAE,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC;QAC7B,MAAM,EAAE,OAAO,EAAE,qCAAqC;QACtD,WAAW,EACV,0GAA0G;YAC1G,iEAAiE,IAAI,CAAC,EAAE,GAAG;YAC3E,IAAI,IAAI,CAAC,YAAY,IAAI,iBAAiB,IAAI;QAC/C,MAAM,EAAE,yBAAyB;QACjC,IAAI,EAAE,OAAO;QACb,cAAc,EAAE,KAAK;QACrB,cAAc,EAAE,SAAS;QACzB,QAAQ,EAAE,cAAc;QACxB,QAAQ,EAAE,oBAAoB,CAAC,IAAI,CAAC,QAAQ,CAAC;QAC7C,IAAI,EAAE;YACL,QAAQ,EAAE,WAAW,IAAI,kBAAkB;YAC3C,UAAU,EAAE,6BAA6B,CAAC,IAAI,CAAC,UAAU,CAAC;SAC1D;QACD,YAAY,EAAE;YACb,IAAI,EAAE,WAAW;SACjB;QACD,SAAS,EAAE;YACV,UAAU;YACV,SAAS,EAAE,KAAK;SAChB;QACD,QAAQ,EAAE;YACT,OAAO,EAAE,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC;SACnC;QACD,iEAAiE;QACjE,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,GAAG,GAAG,CAAC;KAC7C,CAAC;IAEF,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;AAC3B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAC7B,SAA8B;IAE9B,MAAM,KAAK,GAAc,EAAE,CAAC;IAC5B,MAAM,QAAQ,GAAqB,EAAE,CAAC;IACtC,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;QAC9B,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;QAC/B,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACxB,QAAQ,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;IACnC,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;AAC5B,CAAC"}
1
+ {"version":3,"file":"sage-reverse.js","sourceRoot":"","sources":["../../src/converters/sage-reverse.ts"],"names":[],"mappings":"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"}
@@ -16,17 +16,18 @@
16
16
  * corpus.
17
17
  * - ATR `response.actions` (10 values) collapse to Sage `action` (3
18
18
  * values: block / require_approval / log) by strongest-wins semantics.
19
- * - ATR `(?i)` inline flag (PCRE) is extracted into Sage's rule-level
20
- * `case_insensitive: true` because the Sage runtime regex compiler is
21
- * JavaScript and does not support inline flag groups.
19
+ * - SPEC §6.4: every ATR regex condition matches case-insensitively, so the
20
+ * leading flag group is removed and every Sage rule sets
21
+ * `case_insensitive: true`. The Sage runtime compiles patterns as JavaScript
22
+ * `RegExp` with only the `i` flag, so a condition that depends on the `u`
23
+ * flag is skipped (sagePatternOf).
22
24
  * - ATR `detection_tier: semantic` rules are SKIPPED — they require LLM
23
25
  * evaluation, not deterministic regex.
24
26
  * - License: ATR rules are MIT; Sage's `threats/*.yaml` are DRL 1.1. Per-rule
25
27
  * comment in the output preserves upstream attribution per both licenses.
26
28
  *
27
- * Used by: scripts/sync-with-atr.ts (Sage maintainers can run this script
28
- * to regenerate threats/agent-layer.yaml from a pinned ATR version), and
29
- * by any downstream tool that consumes ATR but wants Sage-flavoured output.
29
+ * Used by scripts/export-sage.ts, and by any downstream tool that consumes
30
+ * ATR but wants Sage-flavoured output.
30
31
  *
31
32
  * @module agent-threat-rules/converters/sage
32
33
  */
@@ -90,8 +91,7 @@ export declare class SageIdAllocator {
90
91
  * (user_input or tool_response or content), producing 1 Sage rule each.
91
92
  *
92
93
  * Lossy spots (documented in the bridge research memo):
93
- * - Multi-condition rules with mixed case-sensitivity → whole rule becomes
94
- * case-insensitive
94
+ * - Conditions that depend on the `u` flag → skipped (sagePatternOf)
95
95
  * - `condition: all` semantics → ignored; alternation always treats as OR
96
96
  * - `response.actions` reduced to strongest single action
97
97
  * - All compliance/metadata fields (eu_ai_act, mitre_atlas, references, etc.)
@@ -1 +1 @@
1
- {"version":3,"file":"sage.d.ts","sourceRoot":"","sources":["../../src/converters/sage.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAEH,OAAO,KAAK,EACX,OAAO,EAIP,MAAM,aAAa,CAAC;AAIrB,MAAM,MAAM,YAAY,GAAG,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;AAClE,MAAM,MAAM,UAAU,GAAG,OAAO,GAAG,kBAAkB,GAAG,KAAK,CAAC;AAC9D,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,KAAK,GAAG,WAAW,GAAG,SAAS,GAAG,QAAQ,CAAC;AAEjF,MAAM,WAAW,QAAQ;IACxB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,YAAY,CAAC;IAChC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,WAAW,GAAG,SAAS,WAAW,EAAE,CAAC;IACxD,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,gBAAgB,CAAC,EAAE,OAAO,CAAC;IACpC,yFAAyF;IACzF,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IACnC,6HAA6H;IAC7H,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,iBAAiB;IACjC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EACV,uBAAuB,GACvB,4BAA4B,GAC5B,oBAAoB,GACpB,iBAAiB,GACjB,yBAAyB,GACzB,2BAA2B,GAC3B,oBAAoB,GACpB,sBAAsB,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,aAAa;IAC7B,QAAQ,CAAC,KAAK,EAAE,SAAS,QAAQ,EAAE,CAAC;IACpC,QAAQ,CAAC,QAAQ,EAAE,SAAS,iBAAiB,EAAE,CAAC;CAChD;AAmOD;;;;;;;;;GASG;AACH,qBAAa,eAAe;IAC3B,OAAO,CAAC,QAAQ,CAA6B;IAE7C;;;;OAIG;gBACS,eAAe,GAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAM;IAMlE,IAAI,CAAC,YAAY,EAAE,MAAM,EAAE,oBAAoB,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM;CAQvE;AAkLD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,SAAS,CACxB,GAAG,EAAE,OAAO,EACZ,WAAW,GAAE,eAAuC,GAClD,aAAa,CAuHf;AAuGD;;;;;;;;;;GAUG;AACH,wBAAgB,cAAc,CAC7B,QAAQ,EAAE,SAAS,OAAO,EAAE,EAC5B,eAAe,GAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAM,GACpD,aAAa,CAUf;AAID;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,SAAS,QAAQ,EAAE,GAAG,MAAM,CAElE"}
1
+ {"version":3,"file":"sage.d.ts","sourceRoot":"","sources":["../../src/converters/sage.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAGH,OAAO,KAAK,EACX,OAAO,EAIP,MAAM,aAAa,CAAC;AAIrB,MAAM,MAAM,YAAY,GAAG,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;AAClE,MAAM,MAAM,UAAU,GAAG,OAAO,GAAG,kBAAkB,GAAG,KAAK,CAAC;AAC9D,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,KAAK,GAAG,WAAW,GAAG,SAAS,GAAG,QAAQ,CAAC;AAEjF,MAAM,WAAW,QAAQ;IACxB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,YAAY,CAAC;IAChC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,WAAW,GAAG,SAAS,WAAW,EAAE,CAAC;IACxD,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,gBAAgB,CAAC,EAAE,OAAO,CAAC;IACpC,yFAAyF;IACzF,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IACnC,6HAA6H;IAC7H,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,iBAAiB;IACjC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EACV,uBAAuB,GACvB,4BAA4B,GAC5B,oBAAoB,GACpB,iBAAiB,GACjB,yBAAyB,GACzB,2BAA2B,GAC3B,oBAAoB,GACpB,sBAAsB,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,aAAa;IAC7B,QAAQ,CAAC,KAAK,EAAE,SAAS,QAAQ,EAAE,CAAC;IACpC,QAAQ,CAAC,QAAQ,EAAE,SAAS,iBAAiB,EAAE,CAAC;CAChD;AAkRD;;;;;;;;;GASG;AACH,qBAAa,eAAe;IAC3B,OAAO,CAAC,QAAQ,CAA6B;IAE7C;;;;OAIG;gBACS,eAAe,GAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAM;IAMlE,IAAI,CAAC,YAAY,EAAE,MAAM,EAAE,oBAAoB,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM;CAQvE;AAyJD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,SAAS,CACxB,GAAG,EAAE,OAAO,EACZ,WAAW,GAAE,eAAuC,GAClD,aAAa,CAyHf;AAoGD;;;;;;;;;;GAUG;AACH,wBAAgB,cAAc,CAC7B,QAAQ,EAAE,SAAS,OAAO,EAAE,EAC5B,eAAe,GAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAM,GACpD,aAAa,CAUf;AAID;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,SAAS,QAAQ,EAAE,GAAG,MAAM,CAElE"}