antigravity-sdk 0.1.2 → 0.1.4

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 5fc78b32cbc7cf1f01aa9dde4e53637d3de9ed140337ed461fde3639b8e73559
4
- data.tar.gz: 78a973c5dff6151ccd0485b75556b6e984c980676e9702a044b7df42221824ef
3
+ metadata.gz: afe9c665bf383ac5f2b9e0cf07ea94f085373c0c2a0d0b10c135a56a639e0eac
4
+ data.tar.gz: d2cf2720c77a9d6d854c8415c2113c13f3ca91c5aabd86d413cb39422e47cf31
5
5
  SHA512:
6
- metadata.gz: c853db9ef0827378e9c9e37482df51e815814fd257c03b5b0449f322056a3c07c281e3fa57d984cf61abfa773fa9e06b3624f8615ec85de9b6597f11c7c1a593
7
- data.tar.gz: 3a5fb1474f5d45351f73321eae75ee1e239bf7e10cf85d5e192fa451b0298a1be38a3609b808420dd7294fb6fa771eb2fe33227b5833d66fbb5e9cb26189955a
6
+ metadata.gz: b730d5312a05e57473a765d8398cc3e2b80edcbcf931bf802541ca72f0962b7600c6dbeac7761b4815da34caae823e1b1f6dacd993eb9550d156173aac797a39
7
+ data.tar.gz: 7cedb00e25e9e8d17d00a6e94588301b75f126c107e4a06fd145db7c87c08fb5d2ea8cc0f78aa3a39577263b5067e0bc7e84e0f4176ec35931a95d7bdbba36d0
@@ -35,6 +35,12 @@ module Antigravity
35
35
  sidecar
36
36
  end
37
37
 
38
+ def attach_logger(log_target = "log/antigravity.log", level: ::Logger::INFO)
39
+ logger_guard = Guards::AgentLogger.new(log_target, level: level)
40
+ logger_guard.attach_to(self)
41
+ logger_guard
42
+ end
43
+
38
44
  def load_skill(skill_path)
39
45
  skill = Skill.load(skill_path)
40
46
  @skills << skill
@@ -0,0 +1,128 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "logger"
4
+ require "fileutils"
5
+
6
+ module Antigravity
7
+ module Guards
8
+ # Configurable opt-in logger guard supporting file loggers and Rails.logger
9
+ class AgentLogger
10
+ attr_reader :logger
11
+
12
+ def initialize(log_target = "log/antigravity.log", level: Logger::INFO)
13
+ if log_target.is_a?(String)
14
+ FileUtils.mkdir_p(File.dirname(log_target)) rescue nil
15
+ @logger = ::Logger.new(log_target)
16
+ elsif log_target.respond_to?(:info)
17
+ @logger = log_target
18
+ else
19
+ @logger = ::Logger.new($stdout)
20
+ end
21
+ @logger.level = level if @logger.respond_to?(:level=)
22
+ end
23
+
24
+ def before_prompt(prompt_text)
25
+ @logger.info("[Antigravity::Prompt] User: '#{prompt_text}'")
26
+ end
27
+
28
+ def after_response(response)
29
+ @logger.info("[Antigravity::Response] Assistant (#{response.model_id}): #{response.content.strip}")
30
+ end
31
+
32
+ def before_tool_call(tool_name, params)
33
+ @logger.info("[Antigravity::Tool] Executing '#{tool_name}' with params: #{params.inspect}")
34
+ end
35
+
36
+ def after_tool_call(tool_name, params, result)
37
+ @logger.info("[Antigravity::Tool] Result for '#{tool_name}': #{result}")
38
+ result
39
+ end
40
+
41
+ def attach_to(agent)
42
+ logger_guard = self
43
+ agent.before_prompt { |p| logger_guard.before_prompt(p) }
44
+ agent.after_response { |r| logger_guard.after_response(r) }
45
+ agent.before_tool_call { |t, p| logger_guard.before_tool_call(t, p) }
46
+ agent.after_tool_call { |t, p, r| logger_guard.after_tool_call(t, p, r) }
47
+ end
48
+ end
49
+
50
+ # Configurable opt-in file protection guard
51
+ class FileProtection
52
+ DEFAULT_FILES = [
53
+ /\.env(\..*)?$/i,
54
+ /Gemfile(\.lock)?$/i,
55
+ /config\/secrets\.yml$/i,
56
+ /config\/database\.yml$/i
57
+ ].freeze
58
+
59
+ attr_reader :protected_files
60
+
61
+ def initialize(files: nil, add: [], remove: [])
62
+ initial_patterns = files ? Array(files) : DEFAULT_FILES
63
+ patterns = initial_patterns.map { |f| f.is_a?(Regexp) ? f : /#{Regexp.escape(f.to_s)}$/i }
64
+ patterns += Array(add).map { |f| f.is_a?(Regexp) ? f : /#{Regexp.escape(f.to_s)}$/i }
65
+ patterns -= Array(remove).map { |f| f.is_a?(Regexp) ? f : /#{Regexp.escape(f.to_s)}$/i }
66
+ @protected_files = patterns.freeze
67
+ end
68
+
69
+ def call(_tool_name, params)
70
+ path = extract_path(params)
71
+ return :allow unless path
72
+
73
+ if protected_path?(path)
74
+ { status: :deny, reason: "FileProtection Guard: Modifications to '#{path}' are restricted." }
75
+ else
76
+ :allow
77
+ end
78
+ end
79
+
80
+ def to_proc
81
+ method(:call).to_proc
82
+ end
83
+
84
+ private
85
+
86
+ def extract_path(params)
87
+ return nil unless params.is_a?(Hash)
88
+ params[:path] || params["path"] || params[:file] || params["file"] || params[:target]
89
+ end
90
+
91
+ def protected_path?(path)
92
+ filename = File.basename(path)
93
+ @protected_files.any? { |pattern| path =~ pattern || filename =~ pattern }
94
+ end
95
+ end
96
+
97
+ # Configurable opt-in secret masking filter
98
+ class SecretMasker
99
+ DEFAULT_PATTERNS = [
100
+ /(AIzaSy[A-Za-z0-9_-]{25,45})/, # Google API Keys
101
+ /(sk-[A-Za-z0-9]{25,50})/, # OpenAI API Keys
102
+ /(ghp_[A-Za-z0-9]{25,45})/, # GitHub Tokens
103
+ /(bearer\s+[A-Za-z0-9\._-]{20,})/i # Bearer Tokens
104
+ ].freeze
105
+
106
+ attr_reader :patterns, :replacement
107
+
108
+ def initialize(patterns: nil, replacement: "[REDACTED_SECRET]")
109
+ @patterns = (patterns ? Array(patterns) : DEFAULT_PATTERNS).freeze
110
+ @replacement = replacement
111
+ end
112
+
113
+ def call(_tool_name, _params, result)
114
+ return result unless result.is_a?(String)
115
+
116
+ sanitized = result.dup
117
+ @patterns.each do |pattern|
118
+ sanitized.gsub!(pattern, @replacement)
119
+ end
120
+ sanitized
121
+ end
122
+
123
+ def to_proc
124
+ method(:call).to_proc
125
+ end
126
+ end
127
+ end
128
+ end
data/lib/antigravity.rb CHANGED
@@ -5,6 +5,7 @@ require_relative "antigravity/config"
5
5
  require_relative "antigravity/message"
6
6
  require_relative "antigravity/harness"
7
7
  require_relative "antigravity/hooks"
8
+ require_relative "antigravity/guards"
8
9
  require_relative "antigravity/sidecar"
9
10
  require_relative "antigravity/tool"
10
11
  require_relative "antigravity/skill"
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: antigravity-sdk
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.1.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Riccardo Carlesso
@@ -37,6 +37,20 @@ dependencies:
37
37
  - - ">="
38
38
  - !ruby/object:Gem::Version
39
39
  version: '2.6'
40
+ - !ruby/object:Gem::Dependency
41
+ name: logger
42
+ requirement: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ version: '1.5'
47
+ type: :runtime
48
+ prerelease: false
49
+ version_requirements: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ version: '1.5'
40
54
  description: An elegant, Ruby-like SDK for building autonomous AI agents with Google
41
55
  Antigravity.
42
56
  email:
@@ -49,6 +63,7 @@ files:
49
63
  - lib/antigravity/agent.rb
50
64
  - lib/antigravity/client.rb
51
65
  - lib/antigravity/config.rb
66
+ - lib/antigravity/guards.rb
52
67
  - lib/antigravity/harness.rb
53
68
  - lib/antigravity/hooks.rb
54
69
  - lib/antigravity/message.rb