Skip to main content
Smithers 0.24.1 makes Aspects budgets enforce at runtime, fixes a PiAgent reliability bug where JSON-mode runs could time out instead of completing, and regenerates the stale packages/smithers/src/index.d.ts. There are no breaking changes and no public API symbols were removed.

Aspects budgets are enforced

Aspects budget props (tokenBudget, costBudget, latencySlo) were type only: nothing consumed them at runtime, so wrapping an expensive agent fan-out in a budget gave no protection. The engine now enforces scope budgets at task dispatch.
  • The engine keeps a per-run usage accumulator seeded from persisted TokenUsageReported events and fed live from the event bus, so accumulated usage survives resume. Cost is estimated from token counts via a built-in model price table.
  • Scope totals are checked when a task is dispatched, on both the driver and the legacy scheduler. onExceeded controls the outcome: fail raises ASPECT_BUDGET_EXCEEDED and fails the run, warn logs and continues, and skip-remaining skips the task and the rest of the scope.
  • Per-task limits (perTask) are not enforced yet.

Agents

PiAgent could hang and fail with PROCESS_TIMEOUT whenever Smithers captured events. In JSON mode the process was launched without pi’s --print flag, so pi stayed open as an interactive session after emitting a complete answer; Smithers then killed it at the task timeout and discarded the finished output.
  • PiAgent now passes --print for every non-RPC mode, so json and stream-json runs process the prompt and exit instead of blocking until the timeout.
  • agent_end is treated as a terminal event: the final assistant answer is harvested and a completed event is emitted during streaming, with onExit deduping so a run completes exactly once.
  • pi token usage (per-message, turn_end, and agent_end) is attached to the completed event, so usage telemetry is reported instead of always reading zero.
  • pi diagnostics are now provider-aware. Google, OpenAI, or Anthropic auth and rate-limit checks are selected from the effective --provider, a provider/model prefix, or a bare model id, and an explicit apiKey maps to the right provider environment variable.

Type declarations

The published @smithers-orchestrator/smithers package now ships a declaration file that matches the actual dts build output.
  • Regenerated packages/smithers/src/index.d.ts so type consumers get accurate declarations without a local rebuild.
  • Corrected the export ordering on the @smithers-orchestrator/engine re-export line that shipped out of date in 0.24.0.
  • All exported symbols are identical to 0.24.0; only the generated file was refreshed.

Upgrade

bunx smithers-orchestrator@0.24.1
No configuration changes are required. Workflows that already set Aspects budgets will now have them enforced at dispatch.