Releases: edspencer/herdctl
Release list
@herdctl/core@5.22.1
Patch Changes
-
#391
15c20beThanks @edspencer! - Re-establish injected MCP servers on session wake-fired turns (#390).Under session drive-mode, in-process
injectedMcpServerswere dropped on every
wake-driven turn (ScheduleWakeup//loop/CronCreatere-fires): the reaper
closes the idle session and the wake registry re-opens it without the in-process
servers, so the resumed subprocess still lists the injectedmcp__…__*patterns
in--allowedToolsbut has no server behind them — the tools vanish from the
model's catalog for the whole autonomous stretch (durably so across restarts).-
@herdctl/core: add an optional
resolveInjectedMcpServers(entry)factory to
SessionLifecycleManagerOptions(and asetResolveInjectedMcpServerssetter on
bothSessionLifecycleManagerandFleetManager). When registered, the wake
fire()path consults it and threads the resolved servers into the resumed
session via a new optionalinjectedMcpServersfield on
SessionWakeChatOptions. Injection policy stays in the consumer; herdctl owns
the wiring. Fully backward-compatible — with no resolver registered, wakes fire
with no injection exactly as before, and a throwing resolver is logged and
degrades to no-injection rather than wedging the wake. -
@herdctl/core (secondary): stop
allowedToolsfrom accumulating duplicate
mcp__…__*wildcards across turns.toSDKOptionsnow copies the agent's
allowed_toolsarray instead of aliasing it, and the SDK runtime de-dupes
injected tool patterns before appending them.
-
@herdctl/web@0.10.1
Patch Changes
- Updated dependencies [
ba61918]:- @herdctl/core@5.22.0
- @herdctl/chat@0.7.0
@herdctl/slack@1.2.32
Patch Changes
- Updated dependencies [
ba61918]:- @herdctl/core@5.22.0
- @herdctl/chat@0.7.0
@herdctl/discord@1.2.19
Patch Changes
- Updated dependencies [
ba61918]:- @herdctl/core@5.22.0
- @herdctl/chat@0.7.0
@herdctl/core@5.22.0
Minor Changes
-
#383
ba61918Thanks @edspencer! - Stream partial assistant-text deltas on the SDK runtime.- @herdctl/core: add an opt-in
includePartialMessagesflag on
ChatSessionOptions/RuntimeExecuteOptions(andSDKQueryOptions), threaded
fromopenChatSessiondown to the SDKquery(). When set, the SDK emits
stream_event/text_deltachunks so callers can stream assistant text
token-by-token. Default off — batch/one-shot and non-opting session callers are
unchanged. - @herdctl/chat:
SDKMessageTranslatornow handlesstream_eventmessages,
emitting incrementalonText(delta)calls forcontent_block_delta/
text_deltaevents, and suppresses the terminal whole-assistanttext re-emit
when its text already streamed as deltas (theonTextcontract stays "deltas,
in order"). Boundary and tool-call semantics are preserved; the partials-off
path is byte-for-byte unchanged (oneonTextper assistant content block).
- @herdctl/core: add an opt-in
@herdctl/chat@0.7.0
Minor Changes
-
#383
ba61918Thanks @edspencer! - Stream partial assistant-text deltas on the SDK runtime.- @herdctl/core: add an opt-in
includePartialMessagesflag on
ChatSessionOptions/RuntimeExecuteOptions(andSDKQueryOptions), threaded
fromopenChatSessiondown to the SDKquery(). When set, the SDK emits
stream_event/text_deltachunks so callers can stream assistant text
token-by-token. Default off — batch/one-shot and non-opting session callers are
unchanged. - @herdctl/chat:
SDKMessageTranslatornow handlesstream_eventmessages,
emitting incrementalonText(delta)calls forcontent_block_delta/
text_deltaevents, and suppresses the terminal whole-assistanttext re-emit
when its text already streamed as deltas (theonTextcontract stays "deltas,
in order"). Boundary and tool-call semantics are preserved; the partials-off
path is byte-for-byte unchanged (oneonTextper assistant content block).
- @herdctl/core: add an opt-in
Patch Changes
- Updated dependencies [
ba61918]:- @herdctl/core@5.22.0
herdctl@1.5.27
@herdctl/web@0.10.0
Minor Changes
-
#380
822fdfbThanks @edspencer! - Addspawnedtrigger type (#377)Extend
TriggerTypeSchemawith an explicitspawnedvalue so a host (e.g. paddock)
can persist run provenance for agent-spawned jobs as a first-class enum rather than
inferring it. Additive and backward-compatible — existing headless fleets are
unchanged.- core:
spawnedadded toTriggerTypeSchema(and therefore theTriggerType
type).schedulealready covers scheduled runs, so no separatescheduledvalue
is introduced. - web: the job-history trigger-type icon/label map renders
spawnedwith a
Boticon labelled "Spawned".
Supports paddock#267 (provenance badges).
- core:
Patch Changes
@herdctl/core@5.21.0
Minor Changes
-
#379
247d452Thanks @edspencer! - Scheduler: host-execution seam + runtime schedule mutation (additive, backward-compatible)Make the scheduler embeddable so a host can own execution and mutate schedules at
runtime. Existing headless fleets are unchanged — every new capability is opt-in.- Host-execution seam (#375):
FleetManager.setScheduleTriggerHandler(handler)
mirrorssetSessionWakeHandler. When set, a fired schedule routes to the host
handler (which can resume/stream the turn on its own hub) instead of the built-in
headlessScheduleExecutor; when unset, schedules run headless exactly as before.
Cron/interval timing is untouched. Every scheduler-fired trigger — including a
forced immediate fire — funnels through this seam. - Relative-wake timezone hardening (#311):
resolveSystemTimeZone()centralizes
the host-timezone lookup used bycalculateNextCronTrigger/
calculatePreviousCronTrigger, falling back toUTCwhen an ICU-less runtime
reports no timezone (which could otherwise revive the 24h-idle bug). - Runtime schedule mutation (#376):
FleetManager.setAgentSchedule(agent, name, schedule)andremoveAgentSchedule(agent, name)add/remove a single schedule on a
registered agent without a whole-agentaddAgent(replace).setAgentSchedulealso
normalizes a lingering persisteddisabledstatus toidle(via the new
armScheduleStatehelper) so a set-after-disable is actually eligible to fire.
Removal prunes persisted state via the newdeleteScheduleStatehelper. - Concurrency-safe mutation: schedule-state read-modify-writes are now serialized
per state file (no lost sibling updates); a removed schedule with an in-flight run is
tombstoned so that run's trailing write can't resurrect deleted state; and the
in-flight run's running-set entry is retained (only warn-once bookkeeping is cleared)
so a same-name re-add can't start a second concurrent execution. The tombstone is
coordinated with the active execution generation so it is neither left set nor cleared
too early:setAgentslifts it for a re-armed schedule only when no run for that key
is in flight — soreload()/addAgent({replace})/setAgentSchedulere-arm a
removed name cleanly (no runaway per-tick firing from a stuck tombstone) while a still
in-flight removed generation's trailingnext_run_at/last_errorwrite stays
suppressed (can't contaminate the freshly re-added schedule); the tombstone is then
lifted by that run's ownexecuteJobfinally on completion, or immediately by the
remover when no run is in flight.removeAgentScheduleis in-memory-only (like
addAgent/removeAgent): it does not rewriteherdctl.yaml, so a laterreload()
legitimately brings the schedule back. - Mutation gate: a new
allowScheduleMutationFleetManager option (default
false) gates the two mutation methods; when disabled they throw the new
ScheduleMutationDisabledError. Enable/disable of existing schedules stays ungated.
- Host-execution seam (#375):
-
#380
822fdfbThanks @edspencer! - Addspawnedtrigger type (#377)Extend
TriggerTypeSchemawith an explicitspawnedvalue so a host (e.g. paddock)
can persist run provenance for agent-spawned jobs as a first-class enum rather than
inferring it. Additive and backward-compatible — existing headless fleets are
unchanged.- core:
spawnedadded toTriggerTypeSchema(and therefore theTriggerType
type).schedulealready covers scheduled runs, so no separatescheduledvalue
is introduced. - web: the job-history trigger-type icon/label map renders
spawnedwith a
Boticon labelled "Spawned".
Supports paddock#267 (provenance badges).
- core:
@herdctl/web@0.9.31
Patch Changes
- Updated dependencies [
5af6326]:- @herdctl/chat@0.6.0