Commit Graph
10725 Commits
Author SHA1 Message Date
praisonai-triage-agent[bot] ea1bca27b0 Merge pull request #5796 from MervinPraison/claude/issue-5795-20261013
fix: stop tool/MCP queue wait from timing out healthy calls
2026-10-27 09:32:36 +00:00
MervinPraisonandClaude Opus 5.5 a177d6bef4 fix: MCP calls cancelled after transport loss report the real cause
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-27 08:56:36 +00:00
MervinPraisonandClaude Opus 5.5 df529e839a fix: align #5795 changes with main's spill pool and structured MCP timeouts
Main (#6072, #5848) already runs timed async-path sync tools on the bounded
per-agent pool with overflow spill, and returns structured MCP transport
timeouts with cancellation. Drop the now-redundant transport timeout hunks
and update tests to main's fail-fast/structured contracts.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-27 08:51:54 +00:00
MervinPraisonandClaude Opus 5.5 992a1d5453 fix: cancelled queued async tools never start; used agents can be deepcopied
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-27 08:47:40 +00:00
MervinPraisonandClaude Opus 5.5 c10e9f306a fix: sync hooks no longer hang or falsely deny parallel tool calls
HookRunner guarded its stuck-hook slot with one asyncio.Lock, but
execute_sync() drives each call on its own event loop per thread, so
parallel tool calls with a sync BEFORE_TOOL hook could hang until the
bridge timeout. Any still-running invocation also filled the slot, so
concurrent healthy calls were denied as 'still running past its timeout'.

Use a threading.Lock, run the hook via a concurrent Future, and mark
the slot only once a worker actually times out. The #5795 tests now use
their own HookRegistry (with an allow-all sync hook) so hooks leaked
into the global registry by other tests can't block them.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-27 08:47:28 +00:00
MervinPraisonandClaude Opus 5.5 e0374be6da fix: start async tool timeout when the worker starts
- execution_mixin: sync tools on the async path bound queue wait and
  execution separately (parity with tool_execution.py), so calls queued
  for the 5-worker pool are no longer timed out while healthy.
- Middleware worker bound covers both phases.
- Tests: async parallel queue-wait regression and a fake-session test of
  the stdio runner's concurrent dispatch and shutdown cancellation.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-27 08:47:28 +00:00
MervinPraisonandClaude Opus 5.5 0c73f6354d fix: stop tool/MCP queue wait from timing out healthy calls (fixes #5795)
- Sync tool path: charge tool_timeout from when the body starts, not from
  submit; size the per-agent pool to the parallel executor width (5).
- Async tool path: run sync tools on a dedicated bounded per-agent pool
  instead of the loop's shared default executor, so hung tools cannot
  starve other to_thread users or wedge later calls.
- MCP stdio runner: run each request as its own task with a blocking
  queue read instead of a serial 10ms poll loop.
- MCP HTTP-stream/SSE/WebSocket: cancel the in-flight call on timeout
  and return a descriptive error instead of a blank 'Error: '.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-27 08:47:20 +00:00
MervinPraison 0e6861e910 docs: auto-update feature parity trackers [skip ci] 2026-10-27 08:41:27 +00:00
praisonai-triage-agent[bot] 78e7e59dbd Merge pull request #6073 from MervinPraison/claude/issue-6072-20261027
fix: harden backend stream bridge, async tool pool and tool circuit breaker
2026-10-27 08:40:39 +00:00
praisonai-triage-agent[bot] 2eea6c6dcc Merge pull request #6075 from MervinPraison/claude/issue-6074-20261027
fix: MongoDBStateStore reuses storage adapter driver and fixes TTL TypeError
2026-10-27 08:32:10 +00:00
MervinPraisonandClaude Opus 5.5 7ff7041e62 fix: cap overflow spill threads for timed async tools
Spill threads started when every pool worker is busy were uncounted, so
hung calls leaked threads in proportion to concurrency. Count them per
agent, cap at _MAX_SPILL_TOOL_THREADS (8) and refuse fast with
tool_pool_exhausted once reached; decrement when each thread exits.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-27 08:28:34 +00:00
MervinPraisonandClaude Opus 5.5 98096d82d8 fix: honour MongoDB URI options over MongoDBStorageAdapter defaults
Explicit URI options (e.g. ?retryWrites=false, maxPoolSize) were overridden
by the adapter's hard-coded MongoClient kwargs, which now also affected
MongoDBStateStore. Drop any default the URI already sets.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-27 08:19:20 +00:00
MervinPraisonandClaude Opus 5.5 a805ae7d83 fix: MongoDBStateStore reuses MongoDBStorageAdapter driver and fixes TTL comparison (fixes #6074)
- Obtain the pymongo client from MongoDBStorageAdapter (same template as
  RedisStateStore) instead of a second independent MongoClient init.
  Document layout and TTL index are unchanged.
- Fix get()/exists() raising TypeError when a key has a TTL (datetime
  compared with float) and ttl() mis-reading naive UTC datetimes as local.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-27 08:13:46 +00:00
MervinPraisonandClaude Opus 5.5 da0202a017 fix: close backend stream on early exit and avoid queueing parallel timed tools
- Await the backend generator's aclose() and shutdown_asyncgens() on the
  private loop so backend cleanup runs when the consumer closes the stream.
- When every pool worker is busy, run a timed sync tool on its own daemon
  thread instead of queueing it (wait time counted against the timeout).
  Overflow is still refused once the orphan cap is hit.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-27 07:34:56 +00:00
MervinPraisonandClaude Opus 5.5 ce6bf2cb54 fix: harden backend stream bridge, async tool pool and tool circuit breaker (fixes #6072)
- Streaming: one bounded/cancellable daemon-thread bridge for both the
  running-loop and no-loop cases; closing the generator stops the producer
  and a backend RuntimeError can no longer re-run the stream.
- Async tools: with a tool timeout, sync tools run on the bounded per-agent
  tool pool (shared _submit_to_tool_pool/_retire_tool_executor helpers) so
  timed-out tools no longer strand threads in the default executor.
- Circuit breaker: input errors (LookupError, FileNotFoundError,
  PermissionError, ...) are neutral and non-retryable; sync and async paths
  share one breaker config; remediation text reads the live
  recovery_timeout; drop the unused timeout=30.0.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-27 07:23:00 +00:00
praisonai-triage-agent[bot] e7076d0949 Release v4.7.19 v4.7.19 2026-10-26 22:19:43 +00:00
Mervin Praison 6aabf3a856 Merge pull request #6067 from MervinPraison/chore/aiui-floor-0.3.148
chore(deps): require aiui>=0.3.148 for PraisonAI Replay embed
2026-10-26 23:16:09 +01:00
Mervin Praison 5fe1a61697 Merge branch 'main' into chore/aiui-floor-0.3.148 2026-10-26 22:25:29 +01:00
MervinPraison cd5f61d14c docs: auto-update feature parity trackers [skip ci] 2026-10-26 21:22:28 +00:00
153e4c8078 fix: make completion promise the only autonomy success signal (#6064)
* fix: make completion promise the only autonomy success signal (fixes #6027)

When a completion_promise is configured, the tool_completion, keyword,
direct-stage and no_tool_calls heuristics no longer end the run with
success=True in run_autonomous/run_autonomous_async. Promise-less runs are
unchanged. The async tool path now increments _autonomy_turn_tool_count for
sync/async parity, and `praisonai loop` sets mode="iterative" so
--completion-promise/--max-iterations take effect without --level full_auto.

Co-Authored-By: Claude Opus 5.5 <[email protected]>

* fix: tell the model the completion promise and only count executed async tools

Addresses review on #6064: SDK autonomy loops now append the expected
<promise> tag to the prompt (unless already present in the prompt or
instructions), and the async per-turn tool count is incremented only after
the tool runs so BEFORE_TOOL-blocked calls cannot trigger tool_completion.

Co-Authored-By: Claude Opus 5.5 <[email protected]>

---------

Co-authored-by: MervinPraison <[email protected]>
Co-authored-by: Claude Opus 5.5 <[email protected]>
2026-10-26 22:20:59 +01:00
4be3be0797 fix: require approval for GitHub write tools and scope git to repo_path (#6063)
* fix: require approval for GitHub write tools and scope git to repo_path (fixes #6023)

- Register github_create_branch/commit_and_push/create_pull_request as
  high-risk and add them to the default deny preset, so unattended agents
  need an explicit allow (same as execute_command).
- Add optional repo_path (cwd for every git/gh call) and paths args.
- Stage with 'git add -u' (+ explicit paths) after the branch-safety
  checks, so untracked files are not swept in and a refusal leaves the
  index untouched.

Co-Authored-By: Claude Opus 5.5 <[email protected]>

* fix: scope github_commit_and_push staging to the working directory

git add -u with no pathspec stages tracked edits across the whole
repository, so a call from a subdirectory could publish unrelated sibling
changes. Use 'git add -u -- .' and scope the no-changes status check the
same way.

Co-Authored-By: Claude Opus 5.5 <[email protected]>

---------

Co-authored-by: MervinPraison <[email protected]>
Co-authored-by: Claude Opus 5.5 <[email protected]>
2026-10-26 22:20:54 +01:00
ebf0a1b275 fix: run kanban dispatcher git work off the event loop (#6059)
* fix: run kanban dispatcher git work off the event loop (fixes #6039)

- dispatch_once / _spawn_worker / _shutdown hand _cleanup_completed_tasks
  and _prepare_worktree to a worker thread, serialised by a class-level
  lock so integrations never run git concurrently in the base checkout.
- Workers start in their own session; shutdown SIGTERMs every worker
  group first, waits for all of them off the loop, then SIGKILLs groups
  that are still alive.
- Sync helpers are unchanged, so the CLI one-shot dispatch path keeps
  working.

Co-Authored-By: Claude Opus 5.5 <[email protected]>

* fix: clean up cancelled worktree prep and always SIGKILL worker groups on shutdown

- Cancelling dispatch during worktree preparation now waits for the git
  thread, discards the unused worktree/branch, closes the run and releases
  the claim before re-raising.
- Shutdown SIGKILLs every worker's process group even when the worker
  itself already exited, so SIGTERM-ignoring descendants cannot survive.
- Tests: new cancellation test; descendant test uses a marker file and a
  SIGTERM-ignoring child instead of os.kill(pid, 0), which zombies pass.

Co-Authored-By: Claude Opus 5.5 <[email protected]>

---------

Co-authored-by: MervinPraison <[email protected]>
Co-authored-by: Claude Opus 5.5 <[email protected]>
2026-10-26 22:20:46 +01:00
c25c5f042d fix: make loop-guard turn time limit configurable and raise the default (fixes #6026) (#6057)
* fix: make loop-guard turn time limit configurable via ExecutionConfig.max_execution_time (fixes #6026)

Co-Authored-By: Claude Opus 5.5 <[email protected]>

* fix: clarify that only ExecutionConfig.max_execution_time=0 disables the turn time limit

Co-Authored-By: Claude Opus 5.5 <[email protected]>

---------

Co-authored-by: MervinPraison <[email protected]>
Co-authored-by: Claude Opus 5.5 <[email protected]>
2026-10-26 22:20:41 +01:00
58fbee09e4 fix: walk fallback_models on the custom-LLM chat/achat path (#6053)
* fix: walk fallback_models on the custom-LLM chat/achat path (fixes #6030)

provider/model, dict, base_url and model-object agents call
LLM.get_response* directly and turned any primary-model outage into a
None turn without trying a single fallback model. Wrap that call so a
fallback-class error (per classify_llm_error) moves to the next entry in
fallback_models via a throwaway per-call LLM, emitting MODEL_FALLBACK.
self.llm_instance is never mutated, so concurrent turns keep the primary.

Co-Authored-By: Claude Opus 5.5 <[email protected]>

* fix: keep base_url for bare-name fallbacks and skip fallback after a tool ran

Co-Authored-By: Claude Opus 5.5 <[email protected]>

---------

Co-authored-by: MervinPraison <[email protected]>
Co-authored-by: Claude Opus 5.5 <[email protected]>
2026-10-26 22:20:36 +01:00
7c64856641 fix: kanban dispatcher re-runs healthy long tasks and orphans workers (#6048)
* fix: kanban dispatcher heartbeats its live workers instead of re-running them (fixes #6025)

The dispatcher stamped a worker's heartbeat only at spawn, so any task
running longer than claim TTL + stale timeout (~30 min by default) was
reclaimed while healthy, re-dispatched, and the first worker orphaned.

- Renew lease/heartbeat for every live child before the reclaim sweep;
  terminate a child whose claim was lost.
- Never overwrite a running worker's handle in running_tasks.
- Close a reclaimed task's open run as 'crashed' and count the failure.

Co-Authored-By: Claude Opus 5.5 <[email protected]>

* fix: close reclaimed kanban run atomically and keep lost-claim worktree tracking

Co-Authored-By: Claude Opus 5.5 <[email protected]>

* fix: log run_closed when reclaim closes a run; scope headless output_file test to its project root

The reclaim sweep now records the usual run_closed event in the same
transaction that closes the abandoned run. test_output_file_and_metrics_json
writes under tmp_path, which the #5770 project-root guard rejects; point
PRAISONAI_PROJECT_ROOT at tmp_path so the test checks the written files
without loosening the guard. This test already fails the same way on main.

Co-Authored-By: Claude Opus 5.5 <[email protected]>

---------

Co-authored-by: MervinPraison <[email protected]>
Co-authored-by: Claude Opus 5.5 <[email protected]>
2026-10-26 22:20:32 +01:00
ee454013b0 fix: keep gateway scheduler tick alive on errors (#6047)
* fix: keep gateway scheduler tick alive on errors (fixes #6035)

A tick that raises (store lock I/O such as EMFILE, a malformed scheduler:
block) is now logged and retried with capped backoff instead of ending
_scheduler_task for good. _build_run_policy tolerates a non-mapping
scheduler: block by warning and using the fail-closed defaults.

Co-Authored-By: Claude Opus 5.5 <[email protected]>

* fix: cap scheduler backoff exponent and scope headless output_file test to its project root

Co-Authored-By: Claude Opus 5.5 <[email protected]>

* fix: whitespace in headless output_file test

Co-Authored-By: Claude Opus 5.5 <[email protected]>

---------

Co-authored-by: MervinPraison <[email protected]>
Co-authored-by: Claude Opus 5.5 <[email protected]>
2026-10-26 22:20:27 +01:00
Mervin PraisonandClaude Opus 5.5 f4ac213ae2 test: set the project root for headless YAML output_file tests (#6071)
#5770 contains task output_file writes to the project root (cwd or
PRAISONAI_PROJECT_ROOT), matching Agent.output_file. These tests write under
tmp_path, which is outside the cwd, so main's test-core (root) failed with
'output_file not written'. Point the project root at tmp_path.

Co-authored-by: Claude Opus 5.5 (1M context) <[email protected]>
2026-10-26 22:18:24 +01:00
MervinPraisonandClaude Opus 5.5 ec978dd399 chore(deps): require aiui>=0.3.148 for PraisonAI Replay embed (watch / replay_app)
aiui 0.3.148 ships create_replay_app (PraisonAIUI#317), which
praisonai.replay.watch() and replay_app() (#6017) need.

Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
2026-10-26 19:38:01 +00:00
Mervin Praison a5f35a7a9e Merge pull request #6016 from MervinPraison/fix/replay-rerun-prefix-variables
fix(replay): restore handler step variables on re-run; reject steps inserted before the target
2026-10-26 19:46:09 +01:00
MervinPraison 597868883f docs: auto-update feature parity trackers [skip ci] 2026-10-26 18:42:35 +00:00
56c34fd055 fix(ts): send maxOutputTokens so the AI SDK output-token cap applies (#6013)
* fix(ts): send maxOutputTokens to the AI SDK so the output-token cap applies

AI SDK 5 renamed generateText/streamText's `maxTokens` to `maxOutputTokens`
and ignores the old key. The package pins ai@^6, so AISDKBackend (and
src/ai/generate-text.ts) passed a key the SDK drops: neither
SAFE_DEFAULTS.maxOutputTokens (4096) nor a caller's maxTokens reached the
model on any AI SDK-backed provider (Anthropic, Google, ...).

Send maxOutputTokens, and keep maxTokens for the ai@4 peer range.
Found with SoreqAI (soreqai.com).

Co-Authored-By: Claude Opus 5.5 <[email protected]>

* test(ts): cover maxOutputTokens on all five changed AI SDK calls

Per review: generateText alone left four calls untested. Adds
AISDKBackend.streamText (stream drained so the SDK call runs) and
generateObject, plus the generateText/streamText helpers in
src/ai/generate-text.ts, each checking the default cap and a caller override.

Co-Authored-By: Claude Opus 5.5 <[email protected]>

* fix(ts): send maxOutputTokens from the generateObject/streamObject helpers too

Per CodeRabbit: src/ai/generate-object.ts passed only the old maxTokens key
to sdk.generateObject and sdk.streamObject, the same dropped-cap bug. Adds
maxOutputTokens there and a test for each helper.

Co-Authored-By: Claude Opus 5.5 <[email protected]>

---------

Co-authored-by: Shaked Yacoby <[email protected]>
Co-authored-by: Claude Opus 5.5 <[email protected]>
2026-10-26 19:42:01 +01:00
Swapnil Yadav 13d02e41d1 fix(context-agent): write saved artifacts as UTF-8 (#5989)
* fix(context-agent): write saved artifacts as UTF-8

ContextAgent saved its PRP, analysis summary, and results/interaction
files with the platform default encoding, while other writers in the same
file already pass encoding="utf-8". Writing a PRP or summary that contains
non-ASCII (any non-English content) raised UnicodeEncodeError on Windows,
and the JSON results escaped non-ASCII to \uXXXX. Open every ContextAgent
output file as UTF-8 and dump JSON with ensure_ascii=False so the saved
artifacts are readable and portable, matching the rest of the module.

* test(context-agent): keep the regression test's files inside tmp_path

* test(context-agent): cover all result JSON writers for UTF-8

Populate non-ASCII in every result field and assert each saved file
(comprehensive_analysis, pattern_library, validation_framework,
all_agent_interactions) round-trips as readable UTF-8, not just
comprehensive_analysis.json.
2026-10-26 19:41:56 +01:00
Swapnil Yadav e4b1088f68 fix(memory): use timezone-aware UTC timestamps in the learn store (#5988)
* fix(memory): use timezone-aware UTC timestamps in the learn store

The learn store built timestamps with the deprecated datetime.utcnow(),
which returns a naive datetime. Retention pruning subtracted a naive now
from timestamps parsed back from storage, and datetime.utcnow().timestamp()
computed the wrong epoch by treating the naive UTC value as local time.

Use datetime.now(timezone.utc) everywhere, and when parsing a stored
timestamp that predates this change (naive, no offset), treat it as UTC so
pruning keeps working on existing stores instead of raising "can't subtract
offset-naive and offset-aware datetimes".

* test(memory): add docstrings to learn-store timestamp tests

* fix(memory): normalize timestamps before sorting in the learn store

list_all() and the excess-entry pruning sorted raw ISO strings, so a
stored timestamp with a non-UTC offset could order against a UTC value in
the wrong direction. Add a shared sort key that parses each timestamp,
treats naive values as UTC, and buckets unparseable ones last. Covers the
updated_at ordering and the last_used/created_at pruning tie-breakers.

Also add an end-to-end prune() test and a list ordering test for mixed
offsets.

* fix(memory): sort missing/malformed timestamps as oldest in the learn store

Bucketing unparseable values last flipped prune()'s eviction order: an
entry never used (last_used=None, which parses as empty) sorted after used
ones, so it was evicted last instead of first. Bucket missing/malformed
values as the oldest instant instead. prune() (ascending) then evicts them
first, matching the previous raw-string behaviour, and list_all()
(descending) still lists them last. Add a regression test with two
use_count=0 entries where only one was ever used.
2026-10-26 19:41:49 +01:00
51accf43c6 fix: window doom-loop per-tool count and harden download_file SSRF/size cap (#5959)
* fix: window doom-loop per-tool count and route download_file through shared SSRF guard (fixes #5957)

Co-Authored-By: Claude Opus 5.5 <[email protected]>

* fix: keep download_file SSRF guard independent of ALLOW_LOCAL_CRAWL (#5957)

Co-Authored-By: Claude Opus 5.5 <[email protected]>

* fix: download_file writes to temp file so a rejected download keeps the existing destination (#5957)

Co-Authored-By: Claude Opus 5.5 <[email protected]>

---------

Co-authored-by: MervinPraison <[email protected]>
Co-authored-by: Claude Opus 5.5 <[email protected]>
2026-10-26 19:41:43 +01:00
64d3924985 fix: detect cancel_token support by signature instead of replaying on TypeError (fixes #5884) (#5885)
Co-authored-by: MervinPraison <[email protected]>
Co-authored-by: Claude Opus 5.5 <[email protected]>
2026-10-26 19:41:37 +01:00
abc3d72197 fix(security): contain Task and Workflow step output_file writes in project root (#5770)
* fix(security): contain Task and Workflow step output_file writes in project root

AgentTeam.save_output_to_file and both workflow step writers opened
output_file without the resolve_within_root check Agent.output_file
already applies, so a relative or {{input}}-templated path could write
anywhere on disk. Route all three through a shared write_output_file
helper that rejects paths outside the project root (PRAISONAI_PROJECT_ROOT
or cwd), honours create_directory and writes UTF-8.

Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
Signed-off-by: Stanley Shen <[email protected]>

* fix: preserve output_file permissions on overwrite

atomic_write_text replaces the destination with a mkstemp file (0600),
which silently made shared reports owner-only. Use plain open() like
Agent.output_file so existing modes and umask are kept.

Co-Authored-By: Claude Opus 5.5 <[email protected]>

* fix: replace existing output_file instead of truncating it

Truncating in place writes through a hardlink to a file outside the
project root. Create new files exclusively so umask applies, and replace
existing ones atomically, restoring their previous mode.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Signed-off-by: Stanley Shen <[email protected]>

* fix: overwrite output_file in place unless it is hardlinked

Replacing the file through a temp file needed write access to the parent
directory and changed the mode through the destination path afterwards.
Truncate the existing file in place when it has a single link, and only
unlink and recreate it (with the old mode) when it is hardlinked.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Signed-off-by: Stanley Shen <[email protected]>

* fix: swap in hardlinked output_file replacement after writing it

Unlinking first lost the old report if creating or writing the new one
failed, and the replacement's mode was masked by umask. Write a temp file
in the same directory, set the old mode on its descriptor, then
os.replace it over the hardlinked name.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Signed-off-by: Stanley Shen <[email protected]>

* fix: keep group on hardlinked output_file replacement or drop group bits

Co-Authored-By: Claude Opus 5.5 <[email protected]>

---------

Signed-off-by: Stanley Shen <[email protected]>
Co-authored-by: Claude Sonnet 5.5 <[email protected]>
Co-authored-by: MervinPraison <[email protected]>
2026-10-26 19:41:31 +01:00
MervinPraisonandClaude Opus 5.5 aef2f8ecee fix(replay): snapshot nested-step variables only when the step really runs, not when skipped or cached
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-26 17:38:25 +00:00
praisonai-triage-agent[bot] a28549c977 Merge pull request #6019 from MervinPraison/claude/issue-6018-20261026
fix: remove dead praisonaiagents/eval/utils.py (duplicate of BaseEvaluator._save_result)
2026-10-26 17:30:15 +00:00
MervinPraisonandClaude Opus 5.5 a62ae64398 fix: remove unreferenced eval/utils.py duplicating BaseEvaluator._save_result (fixes #6018)
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-26 17:17:07 +00:00
MervinPraisonandClaude Opus 5.5 3e73cfd68b fix(replay): copy nested-step variables per value so one uncopyable value does not disable change detection
Before, one variable that could not be deep-copied (a lock or a client, for
example) switched the whole snapshot to identity comparison, so a list another
variable's step changed in place was no longer recorded on step_end. Use the
existing _isolate_scope, which shares only the uncopyable values.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-26 16:38:18 +00:00
MervinPraison 629bc88a9c docs: auto-update feature parity trackers [skip ci] 2026-10-26 16:22:43 +00:00
praisonai-triage-agent[bot] bc3ed37841 Merge pull request #5981 from MervinPraison/claude/issue-5980-20261025
fix: re-runnable AgentTeam.start/astart, non-mutating RAG overrides, SmartRetriever filter/error contracts
2026-10-26 16:22:00 +00:00
MervinPraison b6a8ab1d46 docs: auto-update api.md [skip ci] 2026-10-26 16:13:16 +00:00
praisonai-triage-agent[bot] 783a940d11 Merge pull request #6017 from MervinPraison/feat/replay-show
feat(replay): watch() / replay_app(): a Run button that draws each run live, and embedding
2026-10-26 16:11:15 +00:00
MervinPraisonandClaude Opus 5.5 8eed25c3c2 fix: keep propagated-variable ownership across start_for_each so later runs pick up current team variables
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-26 16:03:32 +00:00
MervinPraisonandClaude Opus 5.5 693a3337b2 fix: keep caller-defined Task.variables on AgentTeam rerun, retain injected content across resume, deterministic race tests
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-26 15:58:49 +00:00
MervinPraisonandClaude Opus 5.5 fcf4bebc15 fix: re-runnable AgentTeam.start/astart, non-mutating RAG.retrieve overrides, and SmartRetriever filter/error contracts (fixes #5980)
- AgentTeam: a repeated start()/astart() resets per-task run state and the
  content the previous run injected, instead of skipping completed tasks and
  returning stale output. restore_session_state() still resumes.
- RAG.retrieve: resolve top_k/rerank per call instead of writing them to the
  shared RAGConfig (aretrieve runs concurrently in an executor).
- SmartRetriever: over-fetch before post-filtering, raise ValueError on an
  invalid path_filter regex, return store errors from _search instead of
  storing them on self.
- SubQuestionEngine: unwrap RetrievalResult.chunks from SmartRetriever.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-26 15:58:49 +00:00
MervinPraison 6f09f5e02f docs: auto-update feature parity trackers [skip ci] 2026-10-26 15:57:45 +00:00
Wu Shuwen f74706d573 fix: check failed workflow dependencies before dispatch (#5936) 2026-10-26 16:57:13 +01:00
Wu Shuwen 2f93c7bf82 fix: keep synchronous input guardrails off the async event loop (#5932)
* fix: offload synchronous input guardrails in achat

* perf: retain disabled input guardrail fast path

* perf: avoid thread dispatch for output-only guardrails
2026-10-26 16:57:07 +01:00