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