Replace the dual task/monitor model, NO_REPLY string protocol, and Agent
self-delivery with a single Scheduled Run path: claim-time JobRun snapshots,
isolated Root/named Agent execution, exactly-once complete_scheduled_run
termination, and Scheduler-owned policy delivery through a persistent outbox.
- SQLite v11: drop job_kind/model/delete_after_run, add job_runs with
status/outcome joint constraints and delivery lease columns; one-shot
BEGIN IMMEDIATE migration with atomic rollback.
- Non-blocking JoinSet event loop with bounded run/delivery concurrency;
terminal commit before any channel I/O; recover unfinished runs as unknown.
- ExecutionOrigin::Scheduled propagates to descendants, completion sink is
top-level only, background delegation downgrades to foreground.
- Typed delivery receipts, fixed target_session_id, idempotent
scheduled:<job_run_id> history insert.
- New cron_runs read-only tool; cron_add/update drop kind/model; WebUI and
Health consume the same JobRun projection.
- Bump version to 1.22.0.
- AgentCatalog now records per-definition load errors (bad YAML, unknown
provider/profile/model/tool/skill, or explicit delegate edge to an absent
target) and excludes only the failing definition, never failing gateway
startup or reload; config- and directory-trust-level errors stay fatal
- Explicit delegation to an absent target cascades to deactivate the
delegating agent; `*` and implicit general-purpose delegation do not
- GET /api/agents lists broken definitions with parse/load errors so they
can be fixed and re-enabled from the WebUI instead of disappearing
- WebUI shows an error banner on broken definitions, hides the enable switch,
pre-fills the editor via lenient parsing, and re-enables on save
- Bump version to 1.16.0
- Store default SQLite database at <config_dir>/data/picobot.db instead of
the workspace, keeping session data independent of the workspace; the
reload equivalence check and docs follow the new default
- Add per-skill enable/disable persisted in <config_dir>/skills_state.json;
skills default to enabled, disabled skills are excluded from prompts,
listings, and get_skill at load time
- Add mcp.servers[].enabled (default true); disabled servers are skipped
at activation and by health checks
- WebUI Tools page: switches for Skills and MCP servers, plus a concrete
MCP tool list with connection status and errors
- Add PUT /api/skills/{name} API and expose enabled/tool details in the
skills/status APIs
- Bump version to 1.15.0
- rename settings tab and editor labels (子代理定义 → 子代理, 可继续委托给 → 递归委托)
- show available sub-agents as selectable tags when delegation is a list
- fix edit button text wrapping next to the enable switch
- add hot reload button + phase status polling to the sub-agent pane
Remove the agent_orchestration enabled feature switch and root_delegates config; delegation edges now derive from the catalog's delegate_targets. Replace the four orchestration design/review docs with a single SUB_AGENT_DESIGN.md. Bump version to 1.13.0.
- drop agent_run_groups table and group_id/scope_kind/scope_id columns (schema v8)
- remove group_id from AgentExecutionContext and recovery group counters
- flatten TasksPage background tab into a per-run list
- add WebUI Agents page with definition CRUD and inline provider/model
- bump version to 1.11.0
- RunQuota now enforced: background admission acquires the run permit
(global→session) and the runner holds it until terminal commit;
foreground never takes run permits so nested limit=1 cannot deadlock
- RuntimeAdmission activity guard held by background runners for the
whole run; admission checked before any durable write
- signal_contract_json/signal_delivery persisted at run admission so
definition-level steer delivery actually takes effect (was silently
falling back to queue)
- terminal completion payload carries the run's emitted signal IDs
(design §12.3) so the main Agent can recognise duplicates
- ROOT caller_scope_id is the literal "ROOT" (design §9.6)
- legacy general delegation returns a deprecation/migration hint
Cleanup:
- remove unused AgentCaller enum and run_parallel wrapper
- remove unreachable http_get_only prompt machinery (http_request is
RootOnly and never enters sub-agent registries)
- drop never-read EmittedSignal fields; derive WakeupSource from
TurnInputSource instead of duplicating match arms
- replace the /stop oneshot compatibility bridge with a plain turn_busy
flag; the worker's forced-cancel path now selects on the cancellation
token (implementation doc §11.1)
Version 1.8.0
- AgentCatalog/definitions with strict Markdown frontmatter, delegation graph,
fail-closed tool scoping, and signal contracts
- structured cancellation (AgentError::Cancelled/TimedOut) across provider
streams, tool batches, and sleep; /stop drives the same terminal state
- schema v6 run/group/inbox persistence with execution-ID conditional
transitions and completion-slot reservations
- ExecutionGate separating run quota from provider/tool step permits
- background completion inbox with hidden-trigger continuation turns,
fairness scheduling, lease release, dead-lettering, and activation recovery
- typed TurnMailbox with two-phase steer admission and atomic consumption at
turn commit; /stop releases admitted steer events back to pending
- emit_signal tool with contract-enforced rate/dedupe/severity/size limits
- WS run/event projection (GetAgentRuns, AgentRunUpdated, AgentEventUpdated),
/api/agent-runs* management endpoints, /api/tasks union, WebUI run tree
and signal cards
- ChannelContext.durable_private persisted for continuation delivery reuse
Version 1.7.0
Resolve strict Clippy findings across all targets, preserve public API compatibility with scoped lint exceptions, and fix sourced messages retaining media references. Replace meval and its future-incompatible nom dependency with a bounded internal expression parser and regression tests.