23#include <asio/awaitable.hpp>
35struct ToolExecutionContext;
56 CancellationRequested,
61 ReconciliationRequired,
65NEOGRAPH_API std::string_view to_string(ToolTerminalStatus status)
noexcept;
66NEOGRAPH_API ToolTerminalStatus tool_terminal_status_from_string(std::string_view value);
73 return status == ToolTerminalStatus::CancelledBeforeStart ||
74 status == ToolTerminalStatus::Expired || status == ToolTerminalStatus::Rejected;
82 bool retryable =
false;
83 bool effect_uncertain =
false;
89 bool output_truncated =
false;
95 [[nodiscard]]
bool succeeded() const noexcept {
96 return status == ToolTerminalStatus::Succeeded;
140 [[nodiscard]]
virtual bool retryable() const noexcept = 0;
148 [[nodiscard]]
bool retryable() const noexcept
override {
return retryable_; }
163enum class ToolIdempotency : std::uint8_t {
199 std::string program_version_id;
200 std::string operation_id;
201 std::string grant_id;
203 std::uint64_t attempt = 0;
204 std::string binding_fingerprint;
216 static constexpr std::uint32_t SCHEMA_VERSION = 2;
218 static constexpr std::size_t DEFAULT_ERROR_LIMIT_BYTES = 2048;
220 std::uint32_t schema_version = SCHEMA_VERSION;
221 std::string policy_id;
222 std::string policy_source{
"host-default"};
223 std::string policy_hash;
226 std::uint32_t capacity = 1;
227 std::uint32_t max_pending = 128;
228 std::chrono::milliseconds queue_timeout{60'000};
229 std::chrono::milliseconds execution_timeout{0};
230 bool cancellable =
true;
232 ToolIdempotency idempotency = ToolIdempotency::Unknown;
233 std::uint32_t retry_max_attempts = 1;
234 std::chrono::milliseconds retry_backoff{0};
235 std::size_t output_limit_bytes = 16U * 1024U * 1024U;
241 std::size_t error_limit_bytes = DEFAULT_ERROR_LIMIT_BYTES;
242 std::string resource_key_template{
"tool:{tool}"};
249 std::uint8_t host_priority = 0;
250 std::uint8_t priority_ceiling = 255;
251 std::uint8_t fairness_weight = 1;
259 std::string resource_key;
260 std::string owner_scope;
261 std::uint32_t capacity = 1;
262 std::uint32_t max_pending = 128;
263 std::chrono::milliseconds queue_timeout{60'000};
264 std::uint8_t priority = 0;
265 std::uint8_t fairness_weight = 1;
269class ResourceArbiterImpl;
277 std::size_t output_limit_bytes, std::chrono::milliseconds timeout);
290 [[nodiscard]]
bool held()
const noexcept;
291 [[nodiscard]] std::string_view resource_key()
const noexcept;
292 void release()
noexcept;
296 friend class detail::ResourceArbiterImpl;
297 ResourceLease(std::shared_ptr<detail::ResourceArbiterImpl> impl,
298 std::string resource_key)
noexcept;
300 std::shared_ptr<detail::ResourceArbiterImpl> impl_;
301 std::string resource_key_;
318 asio::awaitable<ResourceLease> acquire_async(
320 std::shared_ptr<graph::CancelToken> cancel_token = {});
323 std::shared_ptr<detail::ResourceArbiterImpl> impl_;
336 void erase(std::string_view tool_name);
342 std::unique_ptr<Impl> impl_;
345struct ToolExecutionControllerConfig {
346 std::shared_ptr<ToolExecutionPolicyRegistry> policies;
347 std::shared_ptr<ResourceArbiter> arbiter;
353 std::shared_ptr<HostAdmissionController> host_admission;
398 [[nodiscard]] std::shared_ptr<ToolExecutionPolicyRegistry> policies()
const;
399 [[nodiscard]] std::shared_ptr<ResourceArbiter> arbiter()
const;
400 [[nodiscard]] std::shared_ptr<HostAdmissionController> host_admission()
const;
407 asio::awaitable<ToolExecutionResult> execute_hook_target_async(
409 asio::awaitable<ToolExecutionResult> execute_result_async(
413 std::unique_ptr<Impl> impl_;
NEOGRAPH_API export/import macro for shared-library builds.
Native-only execution bridge.
Thread-safe FIFO resource arbiter.
RAII proof that the caller owns one ResourceArbiter capacity slot.
Bounded host-resource admission for Program and external work.
Thin C++ RAII wrapper around yyjson with nlohmann-compatible API.
Vector of independently reserved host resources.
One admission request to the fair resource arbiter.
Per-invocation context for a cooperative asynchronous tool.