agent-harness 0.11.1 → 0.11.3
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 +4 -4
- data/.release-please-manifest.json +1 -1
- data/CHANGELOG.md +14 -0
- data/lib/agent_harness/configuration.rb +68 -1
- data/lib/agent_harness/errors.rb +11 -0
- data/lib/agent_harness/extensions.rb +644 -0
- data/lib/agent_harness/mcp_config_loader.rb +62 -0
- data/lib/agent_harness/mcp_config_translator.rb +85 -0
- data/lib/agent_harness/mcp_server.rb +40 -14
- data/lib/agent_harness/providers/anthropic.rb +3 -79
- data/lib/agent_harness/providers/base.rb +212 -9
- data/lib/agent_harness/providers/codex.rb +32 -1
- data/lib/agent_harness/providers/mcp_config_file_support.rb +76 -0
- data/lib/agent_harness/version.rb +1 -1
- data/lib/agent_harness.rb +45 -0
- metadata +5 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: a00dc60851ef15dfa731370add2fb28ac8af98975d61194801afb8a34afc5623
|
|
4
|
+
data.tar.gz: 3422826728017a83203ab285d0e733b2958dd77bf8832c9c57dc16eead4e2a5d
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 32065b807ea92963f0694f28517ca0ad17fe860ac73da96d96a1b51090450cad1324f99bd761f28f55b915c0ca14d59731e10166a4ef7f206b2887a5fdfb1a81
|
|
7
|
+
data.tar.gz: 7d4d571e6b98f2769e05ab637938cc41f7ea2ee1bbe2b73b8a8fed9a6c4d6c1a85aca58cf38578b0f81b983818e3df98251bc1e59f0d14e08d69f486429a8ee1
|
data/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,19 @@
|
|
|
1
1
|
## [Unreleased]
|
|
2
2
|
|
|
3
|
+
## [0.11.3](https://github.com/viamin/agent-harness/compare/agent-harness/v0.11.2...agent-harness/v0.11.3) (2026-04-28)
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
### Bug Fixes
|
|
7
|
+
|
|
8
|
+
* 164: Support provider-agnostic extensions across compatible providers ([#168](https://github.com/viamin/agent-harness/issues/168)) ([2880ae4](https://github.com/viamin/agent-harness/commit/2880ae4f150d1d5574f259b931bbee14ebe0ed04))
|
|
9
|
+
|
|
10
|
+
## [0.11.2](https://github.com/viamin/agent-harness/compare/agent-harness/v0.11.1...agent-harness/v0.11.2) (2026-04-27)
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
### Bug Fixes
|
|
14
|
+
|
|
15
|
+
* 162: Support provider-agnostic MCP configuration ([#165](https://github.com/viamin/agent-harness/issues/165)) ([27f4814](https://github.com/viamin/agent-harness/commit/27f48146e99d8fdba0346235a3e5f19138266652))
|
|
16
|
+
|
|
3
17
|
## [0.11.1](https://github.com/viamin/agent-harness/compare/agent-harness/v0.11.0...agent-harness/v0.11.1) (2026-04-26)
|
|
4
18
|
|
|
5
19
|
|
|
@@ -23,7 +23,7 @@ module AgentHarness
|
|
|
23
23
|
attr_writer :command_executor
|
|
24
24
|
|
|
25
25
|
attr_reader :providers, :orchestration_config, :callbacks, :custom_provider_classes
|
|
26
|
-
attr_reader :sub_agents, :tool_registry, :mcp_servers
|
|
26
|
+
attr_reader :sub_agents, :tool_registry, :mcp_servers, :extension_registry
|
|
27
27
|
|
|
28
28
|
def initialize
|
|
29
29
|
@logger = nil # Will use null logger if not set
|
|
@@ -40,6 +40,7 @@ module AgentHarness
|
|
|
40
40
|
@sub_agents = {}
|
|
41
41
|
@tool_registry = ToolRegistry.new
|
|
42
42
|
@mcp_servers = {}
|
|
43
|
+
@extension_registry = Extensions::Registry.new
|
|
43
44
|
end
|
|
44
45
|
|
|
45
46
|
# Get or lazily initialize the command executor
|
|
@@ -78,6 +79,22 @@ module AgentHarness
|
|
|
78
79
|
@custom_provider_classes[name.to_sym] = klass
|
|
79
80
|
end
|
|
80
81
|
|
|
82
|
+
# Set MCP servers from an array of server definitions.
|
|
83
|
+
#
|
|
84
|
+
# @param servers [Array<Hash, McpServer>] server definitions
|
|
85
|
+
def mcp_servers=(servers)
|
|
86
|
+
normalized = McpConfigTranslator.normalize_servers(servers)
|
|
87
|
+
@mcp_servers = normalized.each_with_object({}) { |s, h| h[s.name.to_sym] = s }
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
# Load MCP server definitions from a configuration file.
|
|
91
|
+
#
|
|
92
|
+
# @param path [String] file path
|
|
93
|
+
def load_mcp_servers_file(path)
|
|
94
|
+
loaded = McpConfigLoader.load_file(path)
|
|
95
|
+
@mcp_servers = loaded.each_with_object({}) { |s, h| h[s.name.to_sym] = s }
|
|
96
|
+
end
|
|
97
|
+
|
|
81
98
|
# Configure a provider-agnostic sub-agent definition.
|
|
82
99
|
#
|
|
83
100
|
# @param name [Symbol, String] sub-agent name
|
|
@@ -131,6 +148,56 @@ module AgentHarness
|
|
|
131
148
|
@mcp_servers[name.to_sym] = server
|
|
132
149
|
end
|
|
133
150
|
|
|
151
|
+
# Register a provider-agnostic runtime extension.
|
|
152
|
+
#
|
|
153
|
+
# @param extension [Extensions::Base] extension instance
|
|
154
|
+
# @param as [Symbol, String, nil] optional registry key override
|
|
155
|
+
# @return [Extensions::Base]
|
|
156
|
+
def register_extension(extension, as: nil)
|
|
157
|
+
@extension_registry.register(extension, as: as)
|
|
158
|
+
extension
|
|
159
|
+
end
|
|
160
|
+
|
|
161
|
+
# Load one or more extensions from disk through an adapter.
|
|
162
|
+
#
|
|
163
|
+
# @param path [String] extension file, directory, or package root
|
|
164
|
+
# @param adapter [Symbol, String, nil] optional explicit adapter name
|
|
165
|
+
# @return [Array<Extensions::Base>]
|
|
166
|
+
def load_extensions(path, adapter: nil)
|
|
167
|
+
Extensions::Loader.load(path, adapter: adapter).each do |extension|
|
|
168
|
+
register_extension(extension)
|
|
169
|
+
end
|
|
170
|
+
end
|
|
171
|
+
|
|
172
|
+
# Discover and register all extensions found in a directory.
|
|
173
|
+
#
|
|
174
|
+
# Each child entry (subdirectory or file) is loaded through the
|
|
175
|
+
# appropriate adapter; entries that cannot be parsed are silently
|
|
176
|
+
# skipped.
|
|
177
|
+
#
|
|
178
|
+
# @param directory [String] directory to scan
|
|
179
|
+
# @return [Array<Extensions::Base>]
|
|
180
|
+
def discover_extensions(directory)
|
|
181
|
+
Extensions::Loader.discover(directory).each do |extension|
|
|
182
|
+
register_extension(extension)
|
|
183
|
+
end
|
|
184
|
+
end
|
|
185
|
+
|
|
186
|
+
# Resolve a registered or inline extension reference.
|
|
187
|
+
#
|
|
188
|
+
# @param reference [Symbol, String, Extensions::Base, nil]
|
|
189
|
+
# @return [Extensions::Base, nil]
|
|
190
|
+
def resolve_extension(reference)
|
|
191
|
+
case reference
|
|
192
|
+
when nil
|
|
193
|
+
nil
|
|
194
|
+
when Extensions::Base
|
|
195
|
+
reference
|
|
196
|
+
else
|
|
197
|
+
@extension_registry.fetch(reference)
|
|
198
|
+
end
|
|
199
|
+
end
|
|
200
|
+
|
|
134
201
|
# Resolve a named or inline sub-agent definition.
|
|
135
202
|
#
|
|
136
203
|
# @param reference [Symbol, String, Hash, SubAgentConfig, nil] sub-agent reference
|
data/lib/agent_harness/errors.rb
CHANGED
|
@@ -72,6 +72,17 @@ module AgentHarness
|
|
|
72
72
|
# Configuration errors
|
|
73
73
|
class ConfigurationError < Error; end
|
|
74
74
|
|
|
75
|
+
class ExtensionCompatibilityError < ConfigurationError
|
|
76
|
+
attr_reader :provider, :extension, :report
|
|
77
|
+
|
|
78
|
+
def initialize(message = nil, provider: nil, extension: nil, report: nil, **kwargs)
|
|
79
|
+
@provider = provider
|
|
80
|
+
@extension = extension
|
|
81
|
+
@report = report
|
|
82
|
+
super(message, **kwargs)
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
|
|
75
86
|
# MCP-specific errors
|
|
76
87
|
class McpConfigurationError < ConfigurationError; end
|
|
77
88
|
|