summaryrefslogtreecommitdiff
path: root/subagents
AgeCommit message (Collapse)Author
2026-08-18Persist and replay subagent progress across sessionst
Record durable child-turn metadata, restore bounded progress cards during startup replay, and keep settled cards attached to transcript entries. Add workflow-local Lua profiles and expose discovered agents and workflows in the session header.
2026-08-18Validation-pass fixes; DESIGN.md describes the shipped seamt
jobs: a child whose wake pipe cannot be armed is refused up front instead of started into a state nothing can wake (the luv-less drain loop survives only for hosts without a loop); a closing child keeps its concurrency slot and its id's exclusivity until the pump actually exits, so teardown can no longer over-admit new children or let two turns share one session file. Resume-metadata reads honor the plain-error contract on a malformed store. workflow: the built-in schema subset validator is the only validator — the jsonschema probe made behavior depend on an undeclared rock (see rockspec: that dependency is deliberately rejected); dead exports and the unreachable half of the structured-output guard are gone, keeping the empty-arguments provider case. DESIGN.md's seam sections now describe the shipped division: binding-level async jobs and tool control, host-level resolve_model/ExtHost/turn events/ component handles, rock-level policy; protocol bodies run to completion on the loop thread and cannot yield, cancellation is scoped to the stream that opened it, and a child's compaction leaves protocol sessions alone.
2026-08-17jobs: only settle may close; e2e proof harnesst
close_all no longer joins pump threads from the owner thread: job:close() joins the pump, and a pump parked in an owner-posted tool batch needs the owner back in the loop, so a synchronous close at turn_end could deadlock. close_all now cancels everything, closes only already-settled jobs, and defers the rest to their own settle; jobs.active() ignores closing children so the next turn can resume the id. e2e/ reconstructs the end-to-end proof against the real binary in print mode: a scripted fixture protocol plays primary and children, and the suite asserts the product surface from process output and JSONL bytes on disk — parallel batch with unknown-agent error, lane identity, tool inheritance minus subagents.*, resume with manifest re-identification, workflow diamond, sandbox fan-out with an ephemeral structured worker, catalog round-trip, child-store isolation from the session picker. mise run e2e; check stays independent.
2026-08-17subagents extension on the generic host surfacest
The rock now owns all subagent policy on top of libpanto-lua's generic APIs: children are ordinary panto.agent instances over rock-constructed stores, started with agent:run_async and awaited by arming uv.new_poll on each job's wake_fd from the tool handler's coroutine. subagents/jobs.lua carries the session policy the host used to own: the concurrency gate (4 running, FIFO queue, cancel-while-queued never starts), the await contract (results in input order; "first" returns settled plus remaining by identity), and settle-time shaping. subagents/spawn.lua seeds new children (primary system context, child role, profile body with manifest metadata), resolves model/reasoning through panto.ext.resolve_model, filters subagents.* out of the inherited tool set via agent:set_tools, and reads resume defaults back from stored message metadata. One-shot structured workers are a null_store agent with a declaration-only output tool, tool_choice forced, dispatch_tools=false. subagents/progress.lua renders per-tool-entry cards through the component handle's invalidate seam; turn_interrupt cancels live children, turn_end closes them. Spec suite rewritten against fakes of the new surfaces (98 cases), including gate/queue/cancel bounds, resume-default extraction, one-shot capture via unresolved tool calls, tool filtering, and manifest seeding.