antigravity-sdk 0.2.0 → 0.3.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: fbeafe860899a22961b7c19a418337cb456594d683708d49b06b293711429c57
4
- data.tar.gz: 7e0caad86e9aa6dd49e2f541ddb041ee9fc0518a21575bfe634b43cb3e879e94
3
+ metadata.gz: 665ab001fa484b0bc5ba97c2e7feb960712b0f8e5070ed521f0caf5ad0f16a58
4
+ data.tar.gz: 3f556321b1083daadea10792632ac216ba168abb26708fc5cc3a81824301d460
5
5
  SHA512:
6
- metadata.gz: 624c1c92b64d248113fd1ef0bd02367c84097666a873b0cecda4063107719406533861faa4cd9baf401afe91ae91e7f2fe185d811027adc7521a09e4e51fa1ae
7
- data.tar.gz: def792e62ad5f0c2b0c7198022453c5d28ccdf7b9c70668ce79207b81589e778310cd0779a58d13301902663b6c0b59e2db15ef57fcb99cc92105b41c505dbb8
6
+ metadata.gz: d60ff58a66fec4ed17a85ad51015568e743363f313eb1a27b9e6512a767ae5a7abca062796ae0bc19edbe59545202828415b693f6551b77a22d8a1ff5cca99ea
7
+ data.tar.gz: 9e09ed8b23e59d29f644d10f421b73d70f357c7d9fd601ba67ba429df8c2814768d0264084e5e6439cd9161d2f8c13313f6890bcd11faf6f66f7e43e3ea2578f
@@ -1,8 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Antigravity
4
- class Agent
5
- include Emojifiable
4
+ class Agent < Base
6
5
 
7
6
  attr_accessor :model, :system_instruction, :api_key
8
7
  attr_reader :tools, :skills, :hooks, :sidecars, :client, :logger_guard
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Antigravity
4
+ # Base class for all Antigravity domain objects.
5
+ # Subclasses automagically get .emoji / #emoji via Emojifiable.
6
+ #
7
+ # ⚠️ Keep this class SUPER thin!
8
+ # Every SDK class inherits from it, so any weight here
9
+ # is carried by Agent, Tool, Skill, Message, Sidecar::Runner, etc.
10
+ class Base
11
+ include Emojifiable
12
+
13
+ def self.inherited(subclass)
14
+ super
15
+ subclass.include(Emojifiable) unless subclass < Emojifiable
16
+ end
17
+ end
18
+ end
@@ -3,7 +3,7 @@
3
3
  module Antigravity
4
4
  EMOJIS = {
5
5
  gem: "💎",
6
- agent: "💎",
6
+ agent: "🕵️‍♂️",
7
7
  prompt: "💬",
8
8
  response: "🤖",
9
9
  thinking: "🤔",
@@ -13,35 +13,60 @@ module Antigravity
13
13
  sidecar: "🚗",
14
14
  logger: "🪵",
15
15
  skill: "📁",
16
+ message: "💬",
16
17
  guard: "🛡️",
17
18
  test: "🧪",
18
- success: "✅"
19
+ success: "✅",
20
+ unknown: "🤷"
21
+ }.freeze
22
+
23
+ # Name fragments we recognise in the class hierarchy
24
+ EMOJI_CLASS_MAP = {
25
+ "Agent" => :agent,
26
+ "Tool" => :tool,
27
+ "Sidecar" => :sidecar,
28
+ "Runner" => :sidecar,
29
+ "Skill" => :skill,
30
+ "Message" => :message,
31
+ "Chunk" => :message,
32
+ "Guard" => :guard,
33
+ "Logger" => :logger
19
34
  }.freeze
20
35
 
21
36
  class << self
22
37
  def emoji(key)
23
- EMOJIS[key.to_sym] || "💎"
38
+ EMOJIS[key.to_sym] || EMOJIS[:unknown]
24
39
  end
25
40
 
26
41
  def emoji_for(target)
27
- key = case target
28
- when Message, Chunk
29
- target.respond_to?(:role) && target.role == :user ? :prompt : :response
30
- when Symbol, String
31
- target
32
- else
33
- klass = target.is_a?(Class) || target.is_a?(Module) ? target : target.class
34
- matched_part = klass.name&.split("::")&.reverse&.find do |part|
35
- %w[Agent Tool Sidecar Skill Message Guard Logger].include?(part)
36
- end
37
- matched_part ? matched_part.downcase.to_sym : :gem
38
- end
39
-
42
+ key = resolve_emoji_key(target)
40
43
  emoji(key)
41
44
  end
45
+
46
+ private
47
+
48
+ def resolve_emoji_key(target)
49
+ # Message/Chunk: role-aware
50
+ if target.is_a?(Message) || (defined?(Chunk) && target.is_a?(Chunk))
51
+ return target.respond_to?(:role) && target.role == :user ? :prompt : :response
52
+ end
53
+
54
+ # Direct symbol/string lookup
55
+ return target if target.is_a?(Symbol) || target.is_a?(String)
56
+
57
+ # Class hierarchy reflection
58
+ klass = target.is_a?(Class) || target.is_a?(Module) ? target : target.class
59
+ parts = klass.name&.split("::") || []
60
+ parts.reverse_each do |part|
61
+ return EMOJI_CLASS_MAP[part] if EMOJI_CLASS_MAP.key?(part)
62
+ end
63
+
64
+ :unknown
65
+ end
42
66
  end
43
67
 
44
- # Mixin providing polymorphic .emoji class and instance methods
68
+ # Mixin providing polymorphic .emoji class and #emoji instance methods.
69
+ # Auto-included by Antigravity::Base via inherited hook.
45
70
  module Emojifiable
46
71
  def emoji
47
72
  Antigravity.emoji_for(self)
@@ -1,8 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Antigravity
4
- class Message
5
- include Emojifiable
4
+ class Message < Base
6
5
 
7
6
  attr_accessor :role, :content, :thinking, :tool_calls, :model_id, :tokens
8
7
 
@@ -6,9 +6,9 @@ require "fileutils"
6
6
 
7
7
  module Antigravity
8
8
  module Sidecar
9
- # Base class for non-blocking agent sidecars
10
- class Base
11
- include Emojifiable
9
+ # Abstract runner for non-blocking agent sidecars.
10
+ # Subclass and implement #process_event.
11
+ class Runner < Antigravity::Base
12
12
 
13
13
  attr_reader :name, :queue, :worker_thread
14
14
 
@@ -52,7 +52,7 @@ module Antigravity
52
52
  end
53
53
 
54
54
  # Async Audit Logger Sidecar
55
- class AuditLogger < Base
55
+ class AuditLogger < Runner
56
56
  attr_reader :log_file
57
57
 
58
58
  def initialize(log_file = "log/agent_audit.jsonl")
@@ -72,7 +72,7 @@ module Antigravity
72
72
  end
73
73
 
74
74
  # Async Vulnerability & Code Quality Scanner Sidecar
75
- class VulnerabilityScanner < Base
75
+ class VulnerabilityScanner < Runner
76
76
  attr_reader :scanned_events
77
77
 
78
78
  def initialize
@@ -90,5 +90,7 @@ module Antigravity
90
90
  @scanned_events << { tool: tool_name, params: params, verified: true }
91
91
  end
92
92
  end
93
+ # Backward-compatible alias
94
+ Base = Runner
93
95
  end
94
96
  end
@@ -3,8 +3,7 @@
3
3
  require "yaml"
4
4
 
5
5
  module Antigravity
6
- class Skill
7
- include Emojifiable
6
+ class Skill < Base
8
7
 
9
8
  attr_reader :name, :description, :instructions, :path
10
9
 
@@ -1,18 +1,15 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Antigravity
4
- class Tool
5
- include Emojifiable
6
-
4
+ class Tool < Base
7
5
  class << self
8
6
  def inherited(subclass)
7
+ super
9
8
  subclass.extend(ClassMethods)
10
9
  end
11
10
  end
12
11
 
13
12
  module ClassMethods
14
- include Emojifiable::ClassMethods
15
-
16
13
  def name(val = nil, desc: nil)
17
14
  if val
18
15
  @tool_name = val.to_s
data/lib/antigravity.rb CHANGED
@@ -8,6 +8,7 @@ end
8
8
 
9
9
  require_relative "antigravity/version"
10
10
  require_relative "antigravity/emojis"
11
+ require_relative "antigravity/base"
11
12
  require_relative "antigravity/config"
12
13
  require_relative "antigravity/message"
13
14
  require_relative "antigravity/harness"
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.2.0
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Riccardo Carlesso
@@ -61,6 +61,7 @@ extra_rdoc_files: []
61
61
  files:
62
62
  - lib/antigravity.rb
63
63
  - lib/antigravity/agent.rb
64
+ - lib/antigravity/base.rb
64
65
  - lib/antigravity/client.rb
65
66
  - lib/antigravity/config.rb
66
67
  - lib/antigravity/emojis.rb