smith-agents 0.6.1 → 0.8.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.
Files changed (122) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +264 -1
  3. data/README.md +71 -1
  4. data/docs/CONFIGURATION.md +22 -1
  5. data/docs/PERSISTENCE.md +27 -1
  6. data/docs/TOOLS_AND_GUARDRAILS.md +293 -2
  7. data/lib/smith/agent/chat_construction.rb +112 -0
  8. data/lib/smith/agent/completion.rb +46 -0
  9. data/lib/smith/agent/completion_usage_recording.rb +25 -0
  10. data/lib/smith/agent/dynamic_configuration.rb +69 -0
  11. data/lib/smith/agent/fallback_configuration.rb +26 -0
  12. data/lib/smith/agent/invocation_preparation.rb +104 -0
  13. data/lib/smith/agent/lifecycle.rb +7 -276
  14. data/lib/smith/agent/model_reference.rb +76 -0
  15. data/lib/smith/agent/provider_attempt.rb +28 -0
  16. data/lib/smith/agent/provider_candidate_sequence.rb +55 -0
  17. data/lib/smith/agent/provider_completion.rb +130 -0
  18. data/lib/smith/agent/provider_failure_handling.rb +93 -0
  19. data/lib/smith/agent/provider_usage.rb +28 -0
  20. data/lib/smith/agent/reserved_input_bridge.rb +40 -0
  21. data/lib/smith/agent/usage_entry_recording.rb +43 -0
  22. data/lib/smith/agent/usage_tracking.rb +113 -0
  23. data/lib/smith/agent.rb +31 -177
  24. data/lib/smith/context/observation_masking.rb +28 -4
  25. data/lib/smith/context/session.rb +7 -2
  26. data/lib/smith/diagnostic_text.rb +67 -0
  27. data/lib/smith/doctor/checks/configuration.rb +16 -3
  28. data/lib/smith/doctor/checks/models_registry.rb +75 -17
  29. data/lib/smith/errors.rb +34 -1
  30. data/lib/smith/models/ambiguous_profile_error.rb +9 -0
  31. data/lib/smith/models/collision_error.rb +9 -0
  32. data/lib/smith/models/inference.rb +14 -0
  33. data/lib/smith/models/normalizer.rb +11 -67
  34. data/lib/smith/models/provider_qualified_registry.rb +101 -0
  35. data/lib/smith/models/tool_routing.rb +140 -0
  36. data/lib/smith/models.rb +24 -78
  37. data/lib/smith/persisted_failure_invalid.rb +7 -0
  38. data/lib/smith/pricing.rb +138 -17
  39. data/lib/smith/pricing_configuration_error.rb +7 -0
  40. data/lib/smith/provider_permanent_failure.rb +16 -0
  41. data/lib/smith/tool/argument_container_reader.rb +97 -0
  42. data/lib/smith/tool/argument_scalar_snapshot.rb +99 -0
  43. data/lib/smith/tool/argument_snapshot.rb +19 -0
  44. data/lib/smith/tool/argument_snapshot_accounting.rb +69 -0
  45. data/lib/smith/tool/argument_snapshot_result.rb +15 -0
  46. data/lib/smith/tool/argument_snapshot_traversal.rb +119 -0
  47. data/lib/smith/tool/bounded_completion_context.rb +131 -0
  48. data/lib/smith/tool/bounded_completion_controls.rb +113 -0
  49. data/lib/smith/tool/bounded_completion_guard.rb +101 -0
  50. data/lib/smith/tool/bounded_completion_installation.rb +20 -0
  51. data/lib/smith/tool/bounded_completion_state.rb +57 -0
  52. data/lib/smith/tool/budget_enforcement.rb +17 -11
  53. data/lib/smith/tool/call_admission.rb +44 -0
  54. data/lib/smith/tool/call_allowance.rb +134 -0
  55. data/lib/smith/tool/call_allowance_counter.rb +43 -0
  56. data/lib/smith/tool/call_batch.rb +47 -0
  57. data/lib/smith/tool/call_budget.rb +51 -0
  58. data/lib/smith/tool/call_reservation.rb +42 -0
  59. data/lib/smith/tool/capture.rb +60 -4
  60. data/lib/smith/tool/capture_configuration.rb +20 -0
  61. data/lib/smith/tool/chat_execution_callbacks.rb +58 -0
  62. data/lib/smith/tool/chat_execution_context.rb +24 -0
  63. data/lib/smith/tool/execution_authority.rb +42 -0
  64. data/lib/smith/tool/execution_authorization.rb +17 -0
  65. data/lib/smith/tool/execution_batch.rb +100 -0
  66. data/lib/smith/tool/execution_batch_admission.rb +56 -0
  67. data/lib/smith/tool/execution_batch_builder.rb +122 -0
  68. data/lib/smith/tool/execution_batch_collection.rb +70 -0
  69. data/lib/smith/tool/execution_batch_invocations.rb +28 -0
  70. data/lib/smith/tool/execution_batch_lifecycle.rb +91 -0
  71. data/lib/smith/tool/execution_batch_registry.rb +99 -0
  72. data/lib/smith/tool/execution_batch_requests.rb +59 -0
  73. data/lib/smith/tool/execution_batch_source_call.rb +36 -0
  74. data/lib/smith/tool/execution_batch_source_metadata.rb +107 -0
  75. data/lib/smith/tool/execution_batch_sources.rb +32 -0
  76. data/lib/smith/tool/execution_batch_state.rb +110 -0
  77. data/lib/smith/tool/execution_dispatch.rb +78 -0
  78. data/lib/smith/tool/execution_failure_handling.rb +101 -0
  79. data/lib/smith/tool/execution_lifecycle.rb +28 -0
  80. data/lib/smith/tool/execution_tracker.rb +20 -0
  81. data/lib/smith/tool/fail_fast_completion.rb +24 -0
  82. data/lib/smith/tool/graceful_completion.rb +20 -0
  83. data/lib/smith/tool/invocation.rb +27 -0
  84. data/lib/smith/tool/invocation_request.rb +37 -0
  85. data/lib/smith/tool/invocation_sequence.rb +26 -0
  86. data/lib/smith/tool/legacy_call_allowance.rb +57 -0
  87. data/lib/smith/tool/scoped_context.rb +123 -0
  88. data/lib/smith/tool.rb +78 -57
  89. data/lib/smith/tool_capture_failed.rb +106 -0
  90. data/lib/smith/tool_execution_not_admitted.rb +7 -0
  91. data/lib/smith/tool_failure_notification_failed.rb +94 -0
  92. data/lib/smith/version.rb +2 -2
  93. data/lib/smith/workflow/agent_result.rb +4 -3
  94. data/lib/smith/workflow/artifact_integration.rb +2 -1
  95. data/lib/smith/workflow/composite/branch_failure.rb +34 -13
  96. data/lib/smith/workflow/composite/branch_outcome.rb +19 -2
  97. data/lib/smith/workflow/composite/effects.rb +3 -1
  98. data/lib/smith/workflow/composite/error.rb +53 -5
  99. data/lib/smith/workflow/composite/error_evidence.rb +10 -2
  100. data/lib/smith/workflow/deadline_enforcement.rb +20 -2
  101. data/lib/smith/workflow/execution.rb +2 -9
  102. data/lib/smith/workflow/failure_detail_snapshot.rb +33 -0
  103. data/lib/smith/workflow/failure_reconstructor.rb +79 -0
  104. data/lib/smith/workflow/failure_record.rb +139 -0
  105. data/lib/smith/workflow/failure_record_restore.rb +145 -0
  106. data/lib/smith/workflow/failure_record_text.rb +83 -0
  107. data/lib/smith/workflow/failure_record_validator.rb +113 -0
  108. data/lib/smith/workflow/fanout_execution.rb +12 -11
  109. data/lib/smith/workflow/guarded_step_execution.rb +39 -0
  110. data/lib/smith/workflow/parallel/cancellation_signal.rb +1 -1
  111. data/lib/smith/workflow/parallel/root_execution.rb +1 -1
  112. data/lib/smith/workflow/parallel.rb +17 -1
  113. data/lib/smith/workflow/persistence.rb +22 -19
  114. data/lib/smith/workflow/prepared_branch_execution.rb +9 -2
  115. data/lib/smith/workflow/retry_execution.rb +5 -0
  116. data/lib/smith/workflow/split_step_persistence/composite_branch_execution.rb +13 -4
  117. data/lib/smith/workflow/thread_context_snapshot.rb +6 -2
  118. data/lib/smith/workflow/transition.rb +11 -0
  119. data/lib/smith/workflow/usage_entry.rb +12 -2
  120. data/lib/smith/workflow.rb +17 -124
  121. data/lib/smith.rb +3 -0
  122. metadata +83 -5
@@ -3,11 +3,13 @@
3
3
  require "digest"
4
4
  require "json"
5
5
  require "securerandom"
6
- require "set"
7
6
  require "time"
8
7
 
9
8
  require_relative "workflow/agent_result"
10
9
  require_relative "workflow/branch_env"
10
+ require_relative "workflow/failure_record"
11
+ require_relative "workflow/failure_record_restore"
12
+ require_relative "workflow/failure_reconstructor"
11
13
  require_relative "workflow/run_result"
12
14
  require_relative "workflow/string_snapshot"
13
15
  require_relative "workflow/usage_entry"
@@ -30,48 +32,6 @@ module Smith
30
32
 
31
33
  DEFAULT_MAX_TRANSITIONS = 100
32
34
 
33
- # Reconstruct Smith error classes from `@last_failed_step` snapshots.
34
- # Order matters: more-specific subclasses first, so a real DSF doesn't
35
- # get caught by the WorkflowError handler. Each lambda preserves the
36
- # billing-critical attributes (`retryable`, `kind`, `details`) by
37
- # routing through the original constructor — Smith's retryable errors
38
- # expose `attr_reader :retryable` only, with no setter, so kwargs
39
- # MUST flow through `initialize`.
40
- KNOWN_RECONSTRUCTORS = {
41
- "Smith::ToolGuardrailFailed" => ->(s) {
42
- Smith::ToolGuardrailFailed.new(s[:error_message], retryable: s[:error_retryable])
43
- },
44
- "Smith::DeterministicStepFailure" => ->(s) {
45
- Smith::DeterministicStepFailure.new(
46
- s[:error_message],
47
- retryable: s[:error_retryable],
48
- kind: s[:error_kind],
49
- details: s[:error_details]
50
- )
51
- },
52
- "Smith::AgentError" => ->(s) { Smith::AgentError.new(s[:error_message]) },
53
- "Smith::DeadlineExceeded" => ->(s) { Smith::DeadlineExceeded.new(s[:error_message]) },
54
- "Smith::WorkflowError" => ->(s) { Smith::WorkflowError.new(s[:error_message]) },
55
- "Smith::Workflow::Composite::BranchFailure" => lambda { |s|
56
- Smith::Workflow::Composite::BranchFailure.from_details(s[:error_details])
57
- },
58
- # Smith errors with non-message constructors map to compatible
59
- # superclass — message preserved, original metadata (agent_name,
60
- # model_used, requested_name, workflow_class, origin_state) lossy
61
- # but `is_a?` classification round-trips via the superclass.
62
- "Smith::BlankAgentOutputError" => ->(s) { Smith::AgentError.new(s[:error_message]) },
63
- "Smith::UnresolvedTransitionError" => ->(s) { Smith::WorkflowError.new(s[:error_message]) }
64
- }.freeze
65
- private_constant :KNOWN_RECONSTRUCTORS
66
-
67
- # Families whose retryable/kind/details attributes are billing-critical.
68
- # For these, the reconstruction path bypasses `const_get(...).new(message)`
69
- # (which would succeed for unknown subclasses with message-only
70
- # constructors but discard the kwargs) and uses the family fallback
71
- # directly so the parent-class constructor preserves the attrs.
72
- RETRYABLE_BEARING_FAMILIES = %w[deterministic_step_failure tool_guardrail_failed].freeze
73
- private_constant :RETRYABLE_BEARING_FAMILIES
74
-
75
35
  attr_reader :state, :last_prepared_input, :ledger
76
36
 
77
37
  def session_messages
@@ -110,6 +70,7 @@ module Smith
110
70
  # seed_validation is :warn or :strict; nil when no seed builder
111
71
  # ran or its output was empty.
112
72
  @seed_digest = nil
73
+ @seed_message_count = 0
113
74
  # Idempotency marker stamped between persist-before-advance and
114
75
  # persist-after-advance under idempotency_mode :strict; restored
115
76
  # workflows with the marker set raise
@@ -200,7 +161,7 @@ module Smith
200
161
 
201
162
  def initial_persist_auto_seed
202
163
  manager = self.class.context_manager
203
- return [] unless manager && manager.respond_to?(:persist_mode) && manager.persist_mode == :auto
164
+ return [] unless manager.respond_to?(:persist_mode) && manager.persist_mode == :auto
204
165
 
205
166
  manager.persist_auto_seed.map(&:to_sym)
206
167
  end
@@ -220,30 +181,7 @@ module Smith
220
181
  return unless step_result
221
182
 
222
183
  if step_result[:error]
223
- err = step_result[:error]
224
- # error_family preserves classification across reconstruction
225
- # even when the exact class can't be rebuilt. Order matters:
226
- # specific subclasses first (DSF before WorkflowError, etc.)
227
- # so a real DSF doesn't get classified as workflow_error.
228
- error_family = case err
229
- when Smith::DeterministicStepFailure then "deterministic_step_failure"
230
- when Smith::ToolGuardrailFailed then "tool_guardrail_failed"
231
- when Smith::DeadlineExceeded then "deadline_exceeded"
232
- when Smith::AgentError then "agent_error"
233
- when Smith::WorkflowError then "workflow_error"
234
- else "other"
235
- end
236
- @last_failed_step = {
237
- transition: step_result[:transition],
238
- from: step_result[:from],
239
- to: step_result[:to],
240
- error_class: err.class.name,
241
- error_family: error_family,
242
- error_message: err.message,
243
- error_retryable: err.respond_to?(:retryable) ? err.retryable : nil,
244
- error_kind: err.respond_to?(:kind) ? err.kind : nil,
245
- error_details: err.respond_to?(:details) ? err.details : nil
246
- }
184
+ @last_failed_step = FailureRecord.capture(step_result)
247
185
  else
248
186
  # Successful step: clear any prior failed-step snapshot
249
187
  # (workflow handled the failure and continued) and capture
@@ -271,7 +209,7 @@ module Smith
271
209
  name = @next_transition_name
272
210
  @next_transition_name = nil
273
211
  transition = self.class.find_transition(name) ||
274
- raise(UnresolvedTransitionError.new(name, self.class, @state))
212
+ raise(UnresolvedTransitionError.new(name, self.class, @state))
275
213
  validate_transition_origin!(transition)
276
214
  transition
277
215
  else
@@ -312,10 +250,10 @@ module Smith
312
250
  # terminal state never produces a synthetic error even if the
313
251
  # snapshot wasn't cleared.
314
252
  effective_steps = if steps.empty? && failed? && @last_failed_step
315
- [reconstruct_failed_step]
316
- else
317
- steps
318
- end
253
+ [reconstruct_failed_step]
254
+ else
255
+ steps
256
+ end
319
257
 
320
258
  RunResult.new(
321
259
  state: @state,
@@ -332,57 +270,11 @@ module Smith
332
270
  end
333
271
 
334
272
  def reconstruct_failed_step
335
- snap = @last_failed_step
336
- builder = KNOWN_RECONSTRUCTORS[snap[:error_class]]
337
- error = if builder
338
- builder.call(snap)
339
- elsif RETRYABLE_BEARING_FAMILIES.include?(snap[:error_family])
340
- # Skip const_get for retryable-bearing families. An unknown
341
- # subclass with a message-only constructor would const_get
342
- # successfully but discard the snapshot's `retryable`/`kind`/
343
- # `details` (defaults to nil), and host retry classification
344
- # could misclassify a retryable failure as terminal.
345
- # Family fallback rebuilds the parent class with kwargs intact.
346
- family_fallback(snap)
347
- else
348
- # Unknown subclass without retryable-bearing semantics. Try
349
- # the exact class for shape preservation; fall back via family
350
- # if the constructor doesn't accept message-only args (or the
351
- # class doesn't exist).
352
- begin
353
- Kernel.const_get(snap[:error_class]).new(snap[:error_message])
354
- rescue NameError, ArgumentError
355
- family_fallback(snap)
356
- end
357
- end
358
-
359
- # Symbol coercion on the way out: live steps carry these as
360
- # symbols; JSON round-trip stringifies them; coerce back to
361
- # match fresh-run shape exactly.
362
- {
363
- transition: normalize_transition_name(snap[:transition]),
364
- from: normalize_state_name(snap[:from]),
365
- to: normalize_state_name(snap[:to]),
366
- error: error
367
- }
368
- end
369
-
370
- def family_fallback(snap)
371
- case snap[:error_family]
372
- when "deterministic_step_failure"
373
- Smith::DeterministicStepFailure.new(
374
- snap[:error_message],
375
- retryable: snap[:error_retryable],
376
- kind: snap[:error_kind],
377
- details: snap[:error_details]
378
- )
379
- when "tool_guardrail_failed"
380
- Smith::ToolGuardrailFailed.new(snap[:error_message], retryable: snap[:error_retryable])
381
- when "deadline_exceeded" then Smith::DeadlineExceeded.new(snap[:error_message])
382
- when "agent_error" then Smith::AgentError.new(snap[:error_message])
383
- when "workflow_error" then Smith::WorkflowError.new(snap[:error_message])
384
- else RuntimeError.new(snap[:error_message])
385
- end
273
+ FailureReconstructor.new(
274
+ snapshot: @last_failed_step,
275
+ transition_normalizer: method(:normalize_transition_name),
276
+ state_normalizer: method(:normalize_state_name)
277
+ ).call
386
278
  end
387
279
 
388
280
  def seed_initial_session_messages
@@ -390,6 +282,7 @@ module Smith
390
282
  return if messages.nil?
391
283
 
392
284
  @session_messages = messages
285
+ @seed_message_count = messages.length
393
286
  @seed_digest = compute_seed_digest(messages)
394
287
  end
395
288
 
data/lib/smith.rb CHANGED
@@ -177,6 +177,7 @@ end
177
177
  # Leaf modules (no internal dependencies)
178
178
  require_relative "smith/types"
179
179
  require_relative "smith/errors"
180
+ require_relative "smith/tool_failure_notification_failed"
180
181
  require_relative "smith/persistence_payload_conflict"
181
182
  require_relative "smith/exponential_backoff"
182
183
 
@@ -205,6 +206,7 @@ require_relative "smith/pricing"
205
206
  require_relative "smith/models/profile"
206
207
  require_relative "smith/models"
207
208
  require_relative "smith/models/inference"
209
+ require_relative "smith/models/tool_routing"
208
210
  require_relative "smith/models/normalizer"
209
211
 
210
212
  # OpenAI /v1/responses routing prepend. Dormant until
@@ -254,6 +256,7 @@ require_relative "smith/context/session"
254
256
 
255
257
  # Agent (depends on RubyLLM::Agent)
256
258
  require_relative "smith/agent"
259
+ require_relative "smith/agent/completion"
257
260
  require_relative "smith/agent/lifecycle"
258
261
  require_relative "smith/agent/registry_binding"
259
262
  require_relative "smith/agent/registry"
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: smith-agents
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.1
4
+ version: 0.8.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Samuel Ralak
@@ -117,16 +117,16 @@ dependencies:
117
117
  name: ruby_llm
118
118
  requirement: !ruby/object:Gem::Requirement
119
119
  requirements:
120
- - - "~>"
120
+ - - '='
121
121
  - !ruby/object:Gem::Version
122
- version: '1.15'
122
+ version: 1.16.0
123
123
  type: :runtime
124
124
  prerelease: false
125
125
  version_requirements: !ruby/object:Gem::Requirement
126
126
  requirements:
127
- - - "~>"
127
+ - - '='
128
128
  - !ruby/object:Gem::Version
129
- version: '1.15'
129
+ version: 1.16.0
130
130
  description: Smith is a workflow-first multi-agent orchestration library built on
131
131
  RubyLLM. It provides state machine modeling, typed contracts, budget enforcement,
132
132
  guardrails, and observability for agent workflows.
@@ -153,12 +153,27 @@ files:
153
153
  - lib/generators/smith/install/templates/smith.rb.tt
154
154
  - lib/smith.rb
155
155
  - lib/smith/agent.rb
156
+ - lib/smith/agent/chat_construction.rb
157
+ - lib/smith/agent/completion.rb
158
+ - lib/smith/agent/completion_usage_recording.rb
159
+ - lib/smith/agent/dynamic_configuration.rb
160
+ - lib/smith/agent/fallback_configuration.rb
161
+ - lib/smith/agent/invocation_preparation.rb
156
162
  - lib/smith/agent/lifecycle.rb
163
+ - lib/smith/agent/model_reference.rb
164
+ - lib/smith/agent/provider_attempt.rb
165
+ - lib/smith/agent/provider_candidate_sequence.rb
166
+ - lib/smith/agent/provider_completion.rb
167
+ - lib/smith/agent/provider_failure_handling.rb
168
+ - lib/smith/agent/provider_usage.rb
157
169
  - lib/smith/agent/registry.rb
158
170
  - lib/smith/agent/registry/execution_binding_capture.rb
159
171
  - lib/smith/agent/registry/introspection.rb
160
172
  - lib/smith/agent/registry/mutation_boundary.rb
161
173
  - lib/smith/agent/registry_binding.rb
174
+ - lib/smith/agent/reserved_input_bridge.rb
175
+ - lib/smith/agent/usage_entry_recording.rb
176
+ - lib/smith/agent/usage_tracking.rb
162
177
  - lib/smith/artifacts.rb
163
178
  - lib/smith/artifacts/file.rb
164
179
  - lib/smith/artifacts/memory.rb
@@ -179,6 +194,7 @@ files:
179
194
  - lib/smith/context/observation_masking.rb
180
195
  - lib/smith/context/session.rb
181
196
  - lib/smith/context/state_injection.rb
197
+ - lib/smith/diagnostic_text.rb
182
198
  - lib/smith/doctor.rb
183
199
  - lib/smith/doctor/check.rb
184
200
  - lib/smith/doctor/checks/baseline.rb
@@ -208,9 +224,14 @@ files:
208
224
  - lib/smith/guardrails/runner.rb
209
225
  - lib/smith/guardrails/url_verifier.rb
210
226
  - lib/smith/models.rb
227
+ - lib/smith/models/ambiguous_profile_error.rb
228
+ - lib/smith/models/collision_error.rb
211
229
  - lib/smith/models/inference.rb
212
230
  - lib/smith/models/normalizer.rb
213
231
  - lib/smith/models/profile.rb
232
+ - lib/smith/models/provider_qualified_registry.rb
233
+ - lib/smith/models/tool_routing.rb
234
+ - lib/smith/persisted_failure_invalid.rb
214
235
  - lib/smith/persistence_adapters.rb
215
236
  - lib/smith/persistence_adapters/active_record_connection_errors.rb
216
237
  - lib/smith/persistence_adapters/active_record_exact_predicate.rb
@@ -230,17 +251,67 @@ files:
230
251
  - lib/smith/persistence_adapters/version_expectation.rb
231
252
  - lib/smith/persistence_payload_conflict.rb
232
253
  - lib/smith/pricing.rb
254
+ - lib/smith/pricing_configuration_error.rb
255
+ - lib/smith/provider_permanent_failure.rb
233
256
  - lib/smith/providers/openai/responses.rb
234
257
  - lib/smith/providers/openai/routing.rb
235
258
  - lib/smith/providers/openai/tools_extensions.rb
236
259
  - lib/smith/railtie.rb
237
260
  - lib/smith/tasks/doctor.rake
238
261
  - lib/smith/tool.rb
262
+ - lib/smith/tool/argument_container_reader.rb
263
+ - lib/smith/tool/argument_scalar_snapshot.rb
264
+ - lib/smith/tool/argument_snapshot.rb
265
+ - lib/smith/tool/argument_snapshot_accounting.rb
266
+ - lib/smith/tool/argument_snapshot_result.rb
267
+ - lib/smith/tool/argument_snapshot_traversal.rb
268
+ - lib/smith/tool/bounded_completion_context.rb
269
+ - lib/smith/tool/bounded_completion_controls.rb
270
+ - lib/smith/tool/bounded_completion_guard.rb
271
+ - lib/smith/tool/bounded_completion_installation.rb
272
+ - lib/smith/tool/bounded_completion_state.rb
239
273
  - lib/smith/tool/budget_enforcement.rb
274
+ - lib/smith/tool/call_admission.rb
275
+ - lib/smith/tool/call_allowance.rb
276
+ - lib/smith/tool/call_allowance_counter.rb
277
+ - lib/smith/tool/call_batch.rb
278
+ - lib/smith/tool/call_budget.rb
279
+ - lib/smith/tool/call_reservation.rb
240
280
  - lib/smith/tool/capability_builder.rb
241
281
  - lib/smith/tool/capture.rb
282
+ - lib/smith/tool/capture_configuration.rb
283
+ - lib/smith/tool/chat_execution_callbacks.rb
284
+ - lib/smith/tool/chat_execution_context.rb
242
285
  - lib/smith/tool/compatibility.rb
286
+ - lib/smith/tool/execution_authority.rb
287
+ - lib/smith/tool/execution_authorization.rb
288
+ - lib/smith/tool/execution_batch.rb
289
+ - lib/smith/tool/execution_batch_admission.rb
290
+ - lib/smith/tool/execution_batch_builder.rb
291
+ - lib/smith/tool/execution_batch_collection.rb
292
+ - lib/smith/tool/execution_batch_invocations.rb
293
+ - lib/smith/tool/execution_batch_lifecycle.rb
294
+ - lib/smith/tool/execution_batch_registry.rb
295
+ - lib/smith/tool/execution_batch_requests.rb
296
+ - lib/smith/tool/execution_batch_source_call.rb
297
+ - lib/smith/tool/execution_batch_source_metadata.rb
298
+ - lib/smith/tool/execution_batch_sources.rb
299
+ - lib/smith/tool/execution_batch_state.rb
300
+ - lib/smith/tool/execution_dispatch.rb
301
+ - lib/smith/tool/execution_failure_handling.rb
302
+ - lib/smith/tool/execution_lifecycle.rb
303
+ - lib/smith/tool/execution_tracker.rb
304
+ - lib/smith/tool/fail_fast_completion.rb
305
+ - lib/smith/tool/graceful_completion.rb
306
+ - lib/smith/tool/invocation.rb
307
+ - lib/smith/tool/invocation_request.rb
308
+ - lib/smith/tool/invocation_sequence.rb
309
+ - lib/smith/tool/legacy_call_allowance.rb
243
310
  - lib/smith/tool/policy.rb
311
+ - lib/smith/tool/scoped_context.rb
312
+ - lib/smith/tool_capture_failed.rb
313
+ - lib/smith/tool_execution_not_admitted.rb
314
+ - lib/smith/tool_failure_notification_failed.rb
244
315
  - lib/smith/tools.rb
245
316
  - lib/smith/tools/think.rb
246
317
  - lib/smith/tools/url_fetcher.rb
@@ -303,6 +374,12 @@ files:
303
374
  - lib/smith/workflow/execution_binding_resolution.rb
304
375
  - lib/smith/workflow/execution_frame.rb
305
376
  - lib/smith/workflow/execution_result_snapshot.rb
377
+ - lib/smith/workflow/failure_detail_snapshot.rb
378
+ - lib/smith/workflow/failure_reconstructor.rb
379
+ - lib/smith/workflow/failure_record.rb
380
+ - lib/smith/workflow/failure_record_restore.rb
381
+ - lib/smith/workflow/failure_record_text.rb
382
+ - lib/smith/workflow/failure_record_validator.rb
306
383
  - lib/smith/workflow/fanout_execution.rb
307
384
  - lib/smith/workflow/graph.rb
308
385
  - lib/smith/workflow/graph/contract_helpers.rb
@@ -337,6 +414,7 @@ files:
337
414
  - lib/smith/workflow/graph/transition_snapshot.rb
338
415
  - lib/smith/workflow/graph/validator.rb
339
416
  - lib/smith/workflow/graph_dsl.rb
417
+ - lib/smith/workflow/guarded_step_execution.rb
340
418
  - lib/smith/workflow/guardrail_integration.rb
341
419
  - lib/smith/workflow/identifier.rb
342
420
  - lib/smith/workflow/message_admission.rb