active_harness 0.2.20 → 0.2.21

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: d1188ca468f31f46c40d118b7e719a849925aa11ddab3a4a87ea4df0fd9bdb84
4
- data.tar.gz: 1ed36314efd943e6f4e62bbc43b2ec00d0b0486bdbf015e6b590341d240ffcdc
3
+ metadata.gz: de49ac66334a5feb91a5d5f0314ab2b9b3460a5d3a549f08b77538677eae619b
4
+ data.tar.gz: 0bffb6e77d1b8def25121b144dbc956c2c1b0c684826910e3dd0a66ab595a73e
5
5
  SHA512:
6
- metadata.gz: 37e82033bddd4069f26619d2bfc5faec831c32618216bedb6cb9ce19ca7fbbaac1057e829809ee15f1d88d1a6fc3b3832cd2c02d1f112c850a974a26205d3727
7
- data.tar.gz: 3a4fafd8184d55f116689e28c4f411d102f7279d290093c9cc32dafabfc9eafe9aa55abde59a04cec37985e74da94a8ddb14153febce35aa41c2eb0404eed2c6
6
+ metadata.gz: e51c5ab8c3911d2597f6269f695c2f4992f960d771b4284fdd27121939aca14dfea53e568ecbfc069af26b405725106c18b3beebf0232e751ed8144b3134cea7
7
+ data.tar.gz: ea95a9f48993b4dc930addeee4260e6056815ec48d3c2534a6bf6f5001168cad2104fcd988c98e442f940f32faa4161f9b59a4692bc6fa3adf7655a221d5d56b
@@ -0,0 +1,77 @@
1
+ module ActiveHarness
2
+ class Pipeline
3
+ VALID_HOOKS = %i[before_step after_step stopped complete].freeze
4
+ VALID_STEP_HOOKS = %i[before_step after_step].freeze
5
+
6
+ class << self
7
+ # Register a global or per-step hook.
8
+ #
9
+ # Global hooks fire on every step:
10
+ # on :before_step do |step_name, payload| ... end
11
+ # on :after_step do |step_name, result| ... end
12
+ # on :stopped do |step_name, result| ... end
13
+ # on :complete do |last_result| ... end
14
+ #
15
+ # Per-step hooks fire only for the named step (no step_name passed):
16
+ # on :before_step, :translate do |payload| ... end
17
+ # on :after_step, :translate do |result| ... end
18
+ def on(event, step_name = nil, &block)
19
+ if step_name
20
+ unless VALID_STEP_HOOKS.include?(event)
21
+ raise ArgumentError,
22
+ "Per-step hooks support: #{VALID_STEP_HOOKS.join(", ")}. Got :#{event}"
23
+ end
24
+ pipeline_config[:step_hooks][step_name] ||= {}
25
+ pipeline_config[:step_hooks][step_name][event] = block
26
+ else
27
+ unless VALID_HOOKS.include?(event)
28
+ raise ArgumentError,
29
+ "Unknown Pipeline hook :#{event}. Valid: #{VALID_HOOKS.join(", ")}"
30
+ end
31
+ pipeline_config[:hooks][event] = block
32
+ end
33
+ end
34
+
35
+ # Rails-style aliases for +on+:
36
+ #
37
+ # Global:
38
+ # before :step do |name, payload| end # → on :before_step
39
+ # after :step do |name, result| end # → on :after_step
40
+ # callback :stopped do |name, result| end # → on :stopped
41
+ # callback :complete do |result| end # → on :complete
42
+ #
43
+ # Per-step:
44
+ # after :step, :translate do |result| end
45
+ # before :step, :translate do |payload| end
46
+ def before(event, step_name = nil, &block)
47
+ on(:"before_#{event}", step_name, &block)
48
+ end
49
+
50
+ def after(event, step_name = nil, &block)
51
+ on(:"after_#{event}", step_name, &block)
52
+ end
53
+
54
+ def callback(event, &block)
55
+ on(event, &block)
56
+ end
57
+ end
58
+
59
+ private
60
+
61
+ # Fires global hook AND pipeline_event_stream. Consistent with Agent#fire and Tribunal#fire.
62
+ def fire(event, step_name, data, config)
63
+ blk = config[:hooks][event]
64
+ instance_exec(step_name, data, &blk) if blk
65
+ @pipeline_event_stream&.call(event, step_name, data)
66
+ rescue IOError, ActionController::Live::ClientDisconnected
67
+ nil
68
+ end
69
+
70
+ # Per-step hook: receives (data) only — not forwarded to pipeline_event_stream
71
+ # (global fire already covers the step event with step_name context).
72
+ def fire_step(event, step_name, data, config)
73
+ blk = config[:step_hooks][step_name]&.dig(event)
74
+ instance_exec(data, &blk) if blk
75
+ end
76
+ end
77
+ end
@@ -32,9 +32,6 @@ module ActiveHarness
32
32
  # pipeline.step_results # => { translate: <Result>, ... }
33
33
  #
34
34
  class Pipeline
35
- VALID_HOOKS = %i[before_step after_step stopped complete].freeze
36
- VALID_STEP_HOOKS = %i[before_step after_step].freeze
37
-
38
35
  # -------------------------------------------------------------------------
39
36
  # Class-level DSL
40
37
  # -------------------------------------------------------------------------
@@ -53,57 +50,6 @@ module ActiveHarness
53
50
  pipeline_config[:steps] << Pipeline::Step.new(name, agent_class, &block)
54
51
  end
55
52
 
56
- # Register a global or per-step hook.
57
- #
58
- # Global hooks fire on every step:
59
- # on :before_step do |step_name, payload| ... end
60
- # on :after_step do |step_name, result| ... end
61
- # on :stopped do |step_name, result| ... end
62
- # on :complete do |last_result| ... end
63
- #
64
- # Per-step hooks fire only for the named step (no step_name passed):
65
- # on :before_step, :translate do |payload| ... end
66
- # on :after_step, :translate do |result| ... end
67
- def on(event, step_name = nil, &block)
68
- if step_name
69
- unless VALID_STEP_HOOKS.include?(event)
70
- raise ArgumentError,
71
- "Per-step hooks support: #{VALID_STEP_HOOKS.join(", ")}. Got :#{event}"
72
- end
73
- pipeline_config[:step_hooks][step_name] ||= {}
74
- pipeline_config[:step_hooks][step_name][event] = block
75
- else
76
- unless VALID_HOOKS.include?(event)
77
- raise ArgumentError,
78
- "Unknown Pipeline hook :#{event}. Valid: #{VALID_HOOKS.join(", ")}"
79
- end
80
- pipeline_config[:hooks][event] = block
81
- end
82
- end
83
-
84
- # Rails-style aliases for +on+:
85
- #
86
- # Global:
87
- # before :step do |name, payload| end # → on :before_step
88
- # after :step do |name, result| end # → on :after_step
89
- # callback :stopped do |name, result| end # → on :stopped
90
- # callback :complete do |result| end # → on :complete
91
- #
92
- # Per-step:
93
- # after :step, :translate do |result| end
94
- # before :step, :translate do |payload| end
95
- def before(event, step_name = nil, &block)
96
- on(:"before_#{event}", step_name, &block)
97
- end
98
-
99
- def after(event, step_name = nil, &block)
100
- on(:"after_#{event}", step_name, &block)
101
- end
102
-
103
- def callback(event, &block)
104
- on(event, &block)
105
- end
106
-
107
53
  def pipeline_config
108
54
  @pipeline_config ||= { steps: [], hooks: {}, step_hooks: {} }
109
55
  end
@@ -219,23 +165,8 @@ module ActiveHarness
219
165
  ).call.result
220
166
  end
221
167
  end
222
-
223
- # Fires global hook AND pipeline_event_stream. Consistent with Agent#fire and Tribunal#fire.
224
- def fire(event, step_name, data, config)
225
- blk = config[:hooks][event]
226
- instance_exec(step_name, data, &blk) if blk
227
- @pipeline_event_stream&.call(event, step_name, data)
228
- rescue IOError, ActionController::Live::ClientDisconnected
229
- nil
230
- end
231
-
232
- # Per-step hook: receives (data) only — not forwarded to pipeline_event_stream
233
- # (global fire already covers the step event with step_name context).
234
- def fire_step(event, step_name, data, config)
235
- blk = config[:step_hooks][step_name]&.dig(event)
236
- instance_exec(data, &blk) if blk
237
- end
238
168
  end
239
169
  end
240
170
 
171
+ require_relative "pipeline/hooks"
241
172
  require_relative "pipeline/step"
@@ -29,7 +29,7 @@ require_relative "active_harness/pipeline"
29
29
  require_relative "active_harness/railtie" if defined?(Rails::Railtie)
30
30
 
31
31
  module ActiveHarness
32
- VERSION = "0.2.20"
32
+ VERSION = "0.2.21"
33
33
 
34
34
  class << self
35
35
  # Configure ActiveHarness.
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: active_harness
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.20
4
+ version: 0.2.21
5
5
  platform: ruby
6
6
  authors:
7
7
  - the-teacher
@@ -51,6 +51,7 @@ files:
51
51
  - lib/active_harness/memory/adapter/base.rb
52
52
  - lib/active_harness/memory/adapter/file.rb
53
53
  - lib/active_harness/pipeline.rb
54
+ - lib/active_harness/pipeline/hooks.rb
54
55
  - lib/active_harness/pipeline/step.rb
55
56
  - lib/active_harness/providers/PROVIDER_CONTRACT.md
56
57
  - lib/active_harness/providers/anthropic.rb