Commit 62587c7
committed
task tool: parallel fan-out, robust subagent loop, proper card UI
The `task` tool was serialised and fragile — the opposite of its purpose.
PARALLELISM (the headline): task carries Effect::Exec for PERMISSION
(a subagent can run bash, must gate like bash), and the scheduler read
the same effects — Exec means "exclusive", so every task ran alone and
blocked all sibling tools. New spec::sched_effects() splits the two
questions: task SCHEDULES as {ReadFs, Net} (composable with reads,
other tasks, disjoint-path writers) while its permission gate stays
Exec. A fan-out of subagents now genuinely runs concurrently — the
whole point of the tool. scheduler_path_test +3 cases (fan-out all
parallel, task+reads compose, bash still excludes task).
ROBUSTNESS (the "fails a lot"):
• Provider-agnostic: the runner drove provider::anthropic::
run_stream_sync directly — every task 400'd on OpenAI-compat/
Ollama (wrong wire, wrong auth) and fresh_auth_header would clobber
a non-Anthropic key with Anthropic credentials. Config gains the
SAME stream seam Deps::stream uses (routes on provider::active()
at call time); main.cpp installs it. fresh_auth_header now gated
on Kind::Anthropic. Null seam falls back to the old transport.
• Transient stream errors (429/529, TLS reset) RETRY with 1/2/4s
backoff (3 attempts, reset on success) instead of killing the
whole subagent; the partial assistant turn is dropped before
retry so the wire pairing stays valid.
• Truncated tool-args JSON is SALVAGED via close_partial_json
(guarded by ended_inside_string so a half-written body never
silently runs), and a bad-args call now counts as a tool
round-trip — the model sees the error and re-emits, instead of
the loop breaking out and the task dying on the first parse hiccup.
• Repeat-failure breaker inside the loop: identical call failed 3×
→ stop and report, same rule as the parent's doom-loop breaker.
• Progress pump throttled to ~12 fps (was per-delta) so a parallel
fan-out doesn't flood the UI msg queue.
UI: task is now "Agent" with its own identity hue (bright magenta) and
"agent" category chip; detail line = "type · description" (agent type
leads — it's the discriminator in a fan-out; falls back to the prompt's
first line, UTF-8-safe clamp); settled detail keeps just "N turns"
(type no longer duplicated). Live activity feed shows ✓/✗ with the
tool's target (path/pattern/command) instead of bare names, plus ↻
retry lines; live card body grew to 8 rows (report stays a 5-row
glance, full text in transcript + Ctrl+O viewer).1 parent d91ff7b commit 62587c7
8 files changed
Lines changed: 255 additions & 50 deletions
File tree
- include/agentty/tool
- src
- runtime
- app
- view/thread/turn/agent_timeline
- tool
- tests
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
229 | 229 | | |
230 | 230 | | |
231 | 231 | | |
| 232 | + | |
| 233 | + | |
| 234 | + | |
| 235 | + | |
| 236 | + | |
| 237 | + | |
| 238 | + | |
| 239 | + | |
| 240 | + | |
| 241 | + | |
| 242 | + | |
| 243 | + | |
| 244 | + | |
| 245 | + | |
| 246 | + | |
| 247 | + | |
| 248 | + | |
| 249 | + | |
| 250 | + | |
| 251 | + | |
| 252 | + | |
| 253 | + | |
| 254 | + | |
| 255 | + | |
| 256 | + | |
232 | 257 | | |
233 | 258 | | |
234 | 259 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
8 | 8 | | |
9 | 9 | | |
10 | 10 | | |
| 11 | + | |
11 | 12 | | |
12 | 13 | | |
13 | 14 | | |
| 15 | + | |
14 | 16 | | |
15 | 17 | | |
16 | 18 | | |
| |||
19 | 21 | | |
20 | 22 | | |
21 | 23 | | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
22 | 34 | | |
23 | 35 | | |
24 | 36 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
774 | 774 | | |
775 | 775 | | |
776 | 776 | | |
| 777 | + | |
| 778 | + | |
| 779 | + | |
| 780 | + | |
777 | 781 | | |
778 | | - | |
| 782 | + | |
| 783 | + | |
779 | 784 | | |
780 | 785 | | |
781 | 786 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
397 | 397 | | |
398 | 398 | | |
399 | 399 | | |
400 | | - | |
| 400 | + | |
401 | 401 | | |
402 | 402 | | |
403 | | - | |
| 403 | + | |
| 404 | + | |
| 405 | + | |
| 406 | + | |
404 | 407 | | |
405 | 408 | | |
406 | 409 | | |
407 | 410 | | |
408 | 411 | | |
409 | 412 | | |
410 | 413 | | |
411 | | - | |
| 414 | + | |
412 | 415 | | |
413 | 416 | | |
414 | 417 | | |
| |||
Lines changed: 10 additions & 8 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
568 | 568 | | |
569 | 569 | | |
570 | 570 | | |
571 | | - | |
572 | | - | |
573 | | - | |
574 | | - | |
575 | | - | |
| 571 | + | |
| 572 | + | |
| 573 | + | |
| 574 | + | |
| 575 | + | |
| 576 | + | |
| 577 | + | |
576 | 578 | | |
577 | 579 | | |
578 | 580 | | |
579 | 581 | | |
580 | 582 | | |
581 | 583 | | |
582 | | - | |
| 584 | + | |
583 | 585 | | |
584 | 586 | | |
585 | 587 | | |
| |||
598 | 600 | | |
599 | 601 | | |
600 | 602 | | |
601 | | - | |
602 | | - | |
| 603 | + | |
| 604 | + | |
603 | 605 | | |
604 | 606 | | |
605 | 607 | | |
| |||
Lines changed: 32 additions & 8 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
9 | 9 | | |
10 | 10 | | |
11 | 11 | | |
| 12 | + | |
12 | 13 | | |
13 | 14 | | |
14 | 15 | | |
| |||
33 | 34 | | |
34 | 35 | | |
35 | 36 | | |
| 37 | + | |
36 | 38 | | |
37 | 39 | | |
38 | 40 | | |
| |||
58 | 60 | | |
59 | 61 | | |
60 | 62 | | |
| 63 | + | |
61 | 64 | | |
62 | 65 | | |
63 | 66 | | |
| |||
66 | 69 | | |
67 | 70 | | |
68 | 71 | | |
| 72 | + | |
69 | 73 | | |
70 | 74 | | |
71 | 75 | | |
| |||
384 | 388 | | |
385 | 389 | | |
386 | 390 | | |
387 | | - | |
388 | | - | |
389 | | - | |
390 | | - | |
391 | | - | |
392 | | - | |
| 391 | + | |
| 392 | + | |
| 393 | + | |
| 394 | + | |
| 395 | + | |
| 396 | + | |
| 397 | + | |
| 398 | + | |
| 399 | + | |
| 400 | + | |
| 401 | + | |
| 402 | + | |
| 403 | + | |
| 404 | + | |
| 405 | + | |
| 406 | + | |
| 407 | + | |
| 408 | + | |
| 409 | + | |
| 410 | + | |
393 | 411 | | |
394 | 412 | | |
395 | 413 | | |
396 | | - | |
397 | | - | |
| 414 | + | |
| 415 | + | |
| 416 | + | |
| 417 | + | |
| 418 | + | |
| 419 | + | |
| 420 | + | |
| 421 | + | |
398 | 422 | | |
399 | 423 | | |
400 | 424 | | |
| |||
0 commit comments