prompt-sanitizer 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,110 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "prompt_sanitizer/version"
4
+
5
+ module PromptSanitizer
6
+ class Error < StandardError; end
7
+ class ConfigurationError < Error; end
8
+ class ModeError < Error; end
9
+
10
+ # Raised when on_detect: :block and PII is found.
11
+ # @example
12
+ # rescue PromptSanitizer::PIIDetectedError => e
13
+ # e.entities # => Array<DetectedEntity>
14
+ class PIIDetectedError < Error
15
+ attr_reader :entities
16
+
17
+ def initialize(entities)
18
+ @entities = entities
19
+ types = entities.map { |e| e.entity_type }.uniq.join(", ")
20
+ super("PII detected and blocked (types: #{types})")
21
+ end
22
+ end
23
+
24
+ # ── Configuration ──────────────────────────────────────────────────────────
25
+
26
+ class Configuration
27
+ # Detection mode: :fast, :smart, :full
28
+ attr_accessor :mode
29
+
30
+ # NER backend (used in :smart / :full mode): :informers, :mitie
31
+ attr_accessor :ner_backend
32
+
33
+ # NER model variant: "distilbert" (66 MB, default) or "bert-base" (110 MB)
34
+ attr_accessor :ner_model
35
+
36
+ # Vault persistence: :memory (default), :rails_cache, :active_record
37
+ attr_accessor :vault_store
38
+
39
+ # Audit log backend: :none (default), :memory, :active_record
40
+ attr_accessor :audit_log
41
+
42
+ # Locale for synthetic replacements (Faker locale string, e.g. "en", "fr")
43
+ attr_accessor :locale
44
+
45
+ def initialize
46
+ @mode = :fast
47
+ @ner_backend = :informers
48
+ @ner_model = "distilbert"
49
+ @vault_store = :memory
50
+ @audit_log = :none
51
+ @locale = "en"
52
+ end
53
+ end
54
+
55
+ # ── Global helpers ──────────────────────────────────────────────────────────
56
+
57
+ class << self
58
+ def configuration
59
+ @configuration ||= Configuration.new
60
+ end
61
+
62
+ # PromptSanitizer.configure do |config|
63
+ # config.mode = :smart
64
+ # end
65
+ def configure
66
+ yield configuration
67
+ end
68
+
69
+ # Returns (and memoises) a Sanitizer built from the global configuration.
70
+ # Safe to call from multiple threads once initialised.
71
+ def sanitizer
72
+ @sanitizer ||= Sanitizer.new(
73
+ mode: configuration.mode,
74
+ ner_backend: configuration.ner_backend,
75
+ ner_model: configuration.ner_model,
76
+ audit_log: configuration.audit_log,
77
+ locale: configuration.locale
78
+ )
79
+ end
80
+
81
+ # Reset global state — intended for use in tests only.
82
+ def reset!
83
+ @configuration = nil
84
+ @sanitizer = nil
85
+ end
86
+ end
87
+ end
88
+
89
+ # Auto-require remaining library files (loaded after the module is defined
90
+ # so they can reference PromptSanitizer constants without forward-ref errors).
91
+ require_relative "prompt_sanitizer/entities"
92
+ require_relative "prompt_sanitizer/modes"
93
+ require_relative "prompt_sanitizer/result"
94
+ require_relative "prompt_sanitizer/vault"
95
+ require_relative "prompt_sanitizer/engines/regex_engine"
96
+ require_relative "prompt_sanitizer/engines/secrets_engine"
97
+ require_relative "prompt_sanitizer/engines/ner_engine"
98
+ require_relative "prompt_sanitizer/synthetic"
99
+ require_relative "prompt_sanitizer/audit/base"
100
+ require_relative "prompt_sanitizer/audit/memory_audit_log"
101
+ require_relative "prompt_sanitizer/session"
102
+ require_relative "prompt_sanitizer/sanitizer"
103
+
104
+ # Rails integrations — loaded only when Rails is present.
105
+ if defined?(Rails)
106
+ require_relative "prompt_sanitizer/railtie"
107
+ require_relative "prompt_sanitizer/integrations/middleware"
108
+ require_relative "prompt_sanitizer/integrations/action_controller"
109
+ require_relative "prompt_sanitizer/integrations/active_job"
110
+ end
metadata ADDED
@@ -0,0 +1,131 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: prompt-sanitizer
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Jeslor
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2026-05-22 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rspec
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '3.13'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '3.13'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '13.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '13.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rack
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '3.0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '3.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: faker
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '3.0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '3.0'
69
+ description: |
70
+ A lightweight, production-ready PII sanitizer built specifically for LLM
71
+ pipelines. Detects and redacts emails, phone numbers, SSNs, credit cards,
72
+ API keys, JWTs, AWS credentials, and more before prompts reach any model
73
+ API. Supports bidirectional sanitization (strip before, restore after) and
74
+ multi-turn session vaults. Zero cloud calls. GDPR & HIPAA ready.
75
+ email:
76
+ - hi@jeslor.com
77
+ executables: []
78
+ extensions: []
79
+ extra_rdoc_files: []
80
+ files:
81
+ - CHANGELOG.md
82
+ - README.md
83
+ - lib/generators/prompt_sanitizer/install_generator.rb
84
+ - lib/generators/prompt_sanitizer/templates/initializer.rb
85
+ - lib/prompt_sanitizer.rb
86
+ - lib/prompt_sanitizer/audit/base.rb
87
+ - lib/prompt_sanitizer/audit/memory_audit_log.rb
88
+ - lib/prompt_sanitizer/engines/ner_engine.rb
89
+ - lib/prompt_sanitizer/engines/regex_engine.rb
90
+ - lib/prompt_sanitizer/engines/secrets_engine.rb
91
+ - lib/prompt_sanitizer/entities.rb
92
+ - lib/prompt_sanitizer/integrations/action_controller.rb
93
+ - lib/prompt_sanitizer/integrations/active_job.rb
94
+ - lib/prompt_sanitizer/integrations/middleware.rb
95
+ - lib/prompt_sanitizer/modes.rb
96
+ - lib/prompt_sanitizer/railtie.rb
97
+ - lib/prompt_sanitizer/result.rb
98
+ - lib/prompt_sanitizer/sanitizer.rb
99
+ - lib/prompt_sanitizer/session.rb
100
+ - lib/prompt_sanitizer/synthetic.rb
101
+ - lib/prompt_sanitizer/vault.rb
102
+ - lib/prompt_sanitizer/version.rb
103
+ homepage: https://www.jeslor.com/prompt-sanitizer
104
+ licenses:
105
+ - MIT
106
+ metadata:
107
+ homepage_uri: https://www.jeslor.com/prompt-sanitizer
108
+ source_code_uri: https://github.com/jeslor/prompt-sanitizer/tree/main/packages/ruby
109
+ changelog_uri: https://github.com/jeslor/prompt-sanitizer/blob/main/packages/ruby/CHANGELOG.md
110
+ bug_tracker_uri: https://github.com/jeslor/prompt-sanitizer/issues
111
+ documentation_uri: https://rubydoc.info/gems/prompt-sanitizer
112
+ post_install_message:
113
+ rdoc_options: []
114
+ require_paths:
115
+ - lib
116
+ required_ruby_version: !ruby/object:Gem::Requirement
117
+ requirements:
118
+ - - ">="
119
+ - !ruby/object:Gem::Version
120
+ version: '3.1'
121
+ required_rubygems_version: !ruby/object:Gem::Requirement
122
+ requirements:
123
+ - - ">="
124
+ - !ruby/object:Gem::Version
125
+ version: '0'
126
+ requirements: []
127
+ rubygems_version: 3.5.22
128
+ signing_key:
129
+ specification_version: 4
130
+ summary: Bidirectional PII sanitizer for LLM pipelines — Ruby edition
131
+ test_files: []