agent-harness 0.27.0 → 0.28.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: c88e49fef781a9b839029456b728f0f0bc99f0678a507084e044d9583d6a1220
4
- data.tar.gz: 55d80c399dca1371e95346ac51aa2b83523a6c18a075f325d1eedf6f75e2839f
3
+ metadata.gz: 364b92c9ed4ab4f3b1bb7414d8272030587282ddb5a333ef6bab44ef898b8012
4
+ data.tar.gz: 07c7b8036efd8f1d5711429ce618ed4ed273d34651b6592ab3ff6c220fdcc657
5
5
  SHA512:
6
- metadata.gz: 4f2b742d3b20a8499cff4480e89e6d0f519626de0c752a8a837af33f2a3bacd65d1a4dfaff499846964c128c240176c1f70824d00e89cfc653bc1d1d4eb79ff5
7
- data.tar.gz: 73d8251bc434bc664486759fa84f07e6b27eaa693bc16d98e48522b09b732c3053f3f5e3682aa25980d5cd7b622c247861a01d8ae2a4a50d40d3da9e589be9c8
6
+ metadata.gz: f7e6a6ca4e672810c62e0fd33e7cd2e597f696bec48e65e486ee0a9958ea7a512e2188331441abb80da2bcfd1114f7484710adca1d607760558c59ef64652475
7
+ data.tar.gz: eecbd525f8d1dac9a89679c99bbad0b206b164238a506baf68f0cc0fddc3501b884fccc73a3cec3d1639edadca4ecac02efe7fa4c49c405e8afdcf8ad4501e75
@@ -1,3 +1,3 @@
1
1
  {
2
- ".": "0.27.0"
2
+ ".": "0.28.0"
3
3
  }
data/CHANGELOG.md CHANGED
@@ -6,6 +6,20 @@
6
6
  * **auth:** add provider-owned PKCE code-exchange API for Claude OAuth (`AgentHarness::Authentication.exchange_code`). Takes an authorization code plus PKCE verifier (and `redirect_uri`/`client_id`), posts an `authorization_code` grant to the Claude token endpoint, and persists the resulting access/refresh tokens in the native `claudeAiOauth` shape. Adds `exchange_code_supported?` and a `code_exchange` key to `auth_capabilities` ([#266](https://github.com/viamin/agent-harness/issues/266)).
7
7
 
8
8
 
9
+ ## [0.28.0](https://github.com/viamin/agent-harness/compare/agent-harness/v0.27.1...agent-harness/v0.28.0) (2026-07-08)
10
+
11
+
12
+ ### Features
13
+
14
+ * allow OpenCode tmp scratch access ([#278](https://github.com/viamin/agent-harness/issues/278)) ([886437f](https://github.com/viamin/agent-harness/commit/886437f6d8429a487d043eb2242cb3f60ab604f6))
15
+
16
+ ## [0.27.1](https://github.com/viamin/agent-harness/compare/agent-harness/v0.27.0...agent-harness/v0.27.1) (2026-07-07)
17
+
18
+
19
+ ### Dependencies
20
+
21
+ * **deps:** bump standard from 1.54.0 to 1.55.0 in the minor-updates group across 1 directory ([#258](https://github.com/viamin/agent-harness/issues/258)) ([541c2da](https://github.com/viamin/agent-harness/commit/541c2da27dc291402d989edf7a1d81396bc1dc66))
22
+
9
23
  ## [0.27.0](https://github.com/viamin/agent-harness/compare/agent-harness/v0.26.0...agent-harness/v0.27.0) (2026-06-27)
10
24
 
11
25
 
@@ -27,7 +27,7 @@ module AgentHarness
27
27
  PREPARATION_LOCK_ROOT = File.join(Dir.tmpdir, "agent-harness-preparation-locks")
28
28
 
29
29
  # Result of a command execution
30
- Result = Struct.new(:stdout, :stderr, :exit_code, :duration, keyword_init: true) do
30
+ Result = Struct.new(:stdout, :stderr, :exit_code, :duration) do
31
31
  def success?
32
32
  exit_code == 0
33
33
  end
@@ -9,7 +9,7 @@ module AgentHarness
9
9
  class ExecutionPreparation
10
10
  # Declarative file write request that executors can materialize in their
11
11
  # own runtime environment.
12
- FileWrite = Struct.new(:path, :content, :mode, keyword_init: true) do
12
+ FileWrite = Struct.new(:path, :content, :mode) do
13
13
  def initialize(path:, content:, mode: nil)
14
14
  raise ArgumentError, "path must be a non-empty String" unless path.is_a?(String) && !path.empty?
15
15
  raise ArgumentError, "content must be a String" unless content.is_a?(String)
@@ -61,8 +61,7 @@ module AgentHarness
61
61
  :cli_version_requirement,
62
62
  :fallback_model_id,
63
63
  :source,
64
- :details,
65
- keyword_init: true
64
+ :details
66
65
  ) do
67
66
  # @return [Boolean] true when compatibility is known to be supported
68
67
  def supported? = supported == true
@@ -14,8 +14,7 @@ module AgentHarness
14
14
  include McpConfigFileSupport
15
15
 
16
16
  StreamingEvent = Struct.new(
17
- :type, :turn, :tokens, :error_message, :tool_name, :raw_event,
18
- keyword_init: true
17
+ :type, :turn, :tokens, :error_message, :tool_name, :raw_event
19
18
  )
20
19
 
21
20
  SUPPORTED_CLI_VERSION = "0.122.0"
@@ -13,6 +13,11 @@ module AgentHarness
13
13
  SUPPORTED_CLI_VERSION = "1.3.2"
14
14
  SUPPORTED_CLI_REQUIREMENT = Gem::Requirement.new(">= #{SUPPORTED_CLI_VERSION}", "< 1.4.0").freeze
15
15
  INSTALL_COMMAND_PREFIX = ["npm", "install", "-g", "--ignore-scripts"].freeze
16
+ DEFAULT_PERMISSION_CONFIG = {
17
+ "external_directory" => {
18
+ "/tmp/**" => "allow"
19
+ }
20
+ }.freeze
16
21
  SUPPORTED_CLI_VERSIONS = [SUPPORTED_CLI_VERSION].freeze
17
22
  POSTINSTALL_COMMAND = "node $(npm root -g)/opencode-ai/postinstall.mjs"
18
23
  VERSION_REQUIREMENT_STRINGS = SUPPORTED_CLI_REQUIREMENT.requirements
@@ -256,6 +261,7 @@ module AgentHarness
256
261
  end
257
262
 
258
263
  payload = stringify_keys(config_extras)
264
+ payload["permission"] ||= DEFAULT_PERMISSION_CONFIG
259
265
  payload["model"] = runtime.model if runtime.model
260
266
  payload["provider"] = runtime.api_provider if runtime.api_provider
261
267
  payload["baseURL"] = runtime.base_url if runtime.base_url
@@ -22,8 +22,7 @@ module AgentHarness
22
22
  # Token usage event structure
23
23
  TokenEvent = Struct.new(
24
24
  :provider, :model, :input_tokens, :output_tokens, :total_tokens,
25
- :timestamp, :request_id,
26
- keyword_init: true
25
+ :timestamp, :request_id
27
26
  )
28
27
 
29
28
  def initialize
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module AgentHarness
4
- VERSION = "0.27.0"
4
+ VERSION = "0.28.0"
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: agent-harness
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.27.0
4
+ version: 0.28.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Bart Agapinan