100 Commits
Author SHA1 Message Date
MervinPraison c6284268f6 docs: auto-update feature parity trackers [skip ci] 2026-11-05 19:33:04 +00:00
MervinPraison b146d40b62 docs: auto-update api.md [skip ci] 2026-11-05 17:58:28 +00:00
MervinPraisonandClaude Opus 5.5 68c12d15e7 fix: ImageResult passes through 'in'/iteration, workflow output: saves b64 images via .save()
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-11-05 17:41:46 +00:00
MervinPraisonandClaude Opus 5.5 15d4dd5e7b test: drop markup from ImageResult edit test now that main rejects it (#6259)
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-11-05 17:38:25 +00:00
MervinPraisonandClaude Opus 5.5 1072ab2fd5 fix: annotate ImageAgent returns as ImageResult and cover URL/index save paths
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-11-05 17:28:51 +00:00
MervinPraisonandClaude Opus 5.5 3fcc3628ac fix: ImageAgent results gain .save() so images need no manual base64 decoding (fixes #6260)
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-11-05 17:28:51 +00:00
MervinPraisonandClaude Opus 5.5 58ccedae91 test: assert Images 2.6 params reach the HTTP body via real LiteLLM (#6259)
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-11-05 17:01:39 +00:00
MervinPraisonandClaude Opus 5.5 de017b1fbf fix: default to gpt-image-2.5-flare, forward quality for gpt-image, reject unsendable markup (fixes #6259)
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-11-05 16:51:06 +00:00
MervinPraison 8d807c9b8d docs: auto-update feature parity trackers [skip ci] 2026-11-05 11:11:50 +00:00
MervinPraisonandClaude Opus 5.5 63b836c4c2 fix: drop unconsumed set_refs/refs from session manifest; correct abandoned-run docstring
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-11-05 09:54:45 +00:00
MervinPraisonandClaude Opus 5.5 2efc491479 fix: store only a digest of the run prompt in the session manifest; drop unused session_manager persistence
Addresses merge-gate findings on #6251:
- the manifest no longer writes the user prompt to disk in plaintext; it
  keeps a SHA-256 digest (run_digest) used only to recognise retries
- revert SessionManagerMixin._save/_load_session_state to main: no callers,
  so the new plaintext state write had no live consumer
- tests: prompt never reaches disk; absolute/backslash/'..' ids stay inside
  the manifest directory

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-11-05 09:51:23 +00:00
MervinPraisonandClaude Opus 5.5 86c96fc217 fix: step-cache key covers the agent wrapped in a Task step
AgentFlow normalises an Agent step to Task(agent=...), so editing the
agent's instructions or model under the same name was served a stale
durable result. Include the wrapped agent's config and agent_config.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-11-05 09:45:59 +00:00
MervinPraisonandClaude Opus 5.5 3e2881c1bb fix: stable step-cache fingerprint across processes; cover closures, defaults, helpers and agent config
- Encode set/frozenset constants (and set-valued variables) in sorted order so
  a key no longer depends on PYTHONHASHSEED and durable resume hits.
- Step definition now includes immutable defaults/closure values, module-level
  Python helpers the handler calls, and an agent's role/goal/instructions/llm/
  tool names, so a same-name edit misses instead of serving a stale result.
- Docstring states what is not covered; tests edit steps under the same name.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-11-05 09:42:43 +00:00
MervinPraisonandClaude Opus 5.5 f6294923d0 fix: keep session manifests separate per id and project; end_run releases only its own run
- manifest filenames use the conversation store's injective naming (a:b vs a_b)
- end_run(run_id=...) leaves another run's marker alone; read-modify-write is
  guarded by the store's cross-process FileLock
- praisonai run scopes manifests under the project sessions dir

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-11-05 09:24:13 +00:00
MervinPraisonandClaude Opus 5.5 a0f908ac1f fix: FileStepCache re-runs edited handlers, rejects lossy values, merges writers
- Step keys include a fingerprint of the handler's code, so an edited
  handler kept under the same name is not served its old result.
- set() rejects values that change in a JSON round trip (int dict keys,
  tuples) instead of resuming with different data.
- set() uses the locked update_json read-modify-write so two caches on
  one path no longer erase each other's entries.
- Docstring now states that agent steps are keyed by name only.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-11-05 09:06:58 +00:00
MervinPraisonandClaude Opus 5.5 063b7c6d0b fix: add session manifest with write-ahead run-in-flight marker (fixes #6248)
Adds a per-session manifest that stores references to each of a session's
storage areas, plus a write-ahead run-in-flight marker with a limit on retry
attempts. Replaces the session_manager.py placeholders with code that uses the
manifest, and makes `praisonai run --continue/--session` report a run that was
interrupted.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-11-05 09:02:33 +00:00
MervinPraisonandClaude Opus 5.5 c83b735fba fix: add durable FileStepCache so an interrupted AgentFlow resumes (fixes #6249)
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-11-05 09:00:24 +00:00
MervinPraisonandClaude Opus 5.5 6980ec13e2 fix: only fail closed on active safety gates (keep --trust working on crewai/autogen)
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-11-05 08:38:13 +00:00
MervinPraisonandClaude Opus 5.5 85922f349d fix: fail loudly on unknown provider prefix and dropped safety fields (fixes #6245)
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-11-05 08:17:57 +00:00
MervinPraisonandClaude Opus 5.5 50a0949063 fix: bound safe_join filename length and keep non-ASCII names unescaped (#6238)
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-11-05 08:16:24 +00:00
MervinPraisonandClaude Opus 5.5 8da80d1890 fix: let explicit --push override config ollama_push and test caller paths (#6242)
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-11-05 08:09:17 +00:00
MervinPraisonandClaude Opus 5.5 861584bab4 fix: mention 'messages' chat shape in empty-dataset error
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-11-05 08:09:02 +00:00
MervinPraisonandClaude Opus 5.5 79669e7a7d fix: reversible safe_join encoding and stop tests leaking a global ConsoleBackend (#6238)
- safe_join now percent-encodes names (bijective), so distinct names such as
  'a/b' and 'a_b~c14cddc033f6' can no longer share one file; list_todos()
  decodes filenames so listed names round-trip through load/delete_todo.
- Legacy <name>.json fallback skips names containing '%' to avoid aliasing.
- Tests restoring the approval backend snapshotted get_backend(), whose
  ConsoleBackend fallback was then installed globally on restore and leaked
  into tests/unit/skills/test_approval_scoping.py under xdist. Snapshot
  _global_backend directly instead.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-11-05 08:08:46 +00:00
MervinPraisonandClaude Opus 5.5 ffa3068203 fix: add --no-push / ollama_push: false to keep Ollama exports local (fixes #6242)
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-11-05 08:03:53 +00:00
MervinPraisonandClaude Opus 5.5 82d066299b fix: accept OpenAI-style 'messages' chat datasets in praisonai-train llm (fixes #6241)
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-11-05 08:03:21 +00:00
MervinPraisonandClaude Opus 5.5 42e0695bbe fix: keep listed/legacy todo names and custom plan filenames loadable (#6238)
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-11-05 07:46:30 +00:00
MervinPraisonandClaude Opus 5.5 f024f6b3a1 fix: confine caller-supplied names to storage dirs and use shared async bridge (fixes #6238)
- utils/atomic_io.safe_join: injective, separator-free filename stems
  (same scheme as session store); legacy safe names are unchanged.
- PlanStorage save/load/delete_todo and save_plan use safe_join, so
  names like '../../x' can no longer escape todos_dir/plans_dir.
- ContextAgent creates PRPs/ and writes PRPs atomically via safe_join.
- generate_title and crawl4ai_*_sync use run_coroutine_from_any_context,
  so they work inside a running event loop instead of crashing or
  silently returning the fallback.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-11-05 07:29:53 +00:00
MervinPraison 9a84e99ecf docs: auto-update feature parity trackers [skip ci] 2026-11-04 17:40:37 +00:00
MervinPraisonandClaude Opus 5.5 71de7217fd fix: hide permission-denied tools from bridge tool_search/tool_describe
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-11-04 16:36:23 +00:00
MervinPraisonandClaude Opus 5.5 3d7ed12a3c fix: cache unpruned formatted tools so lifted denials take effect
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-11-04 15:34:37 +00:00
MervinPraisonandClaude Opus 5.5 45019589cf fix: re-prune permission-denied tools on formatted-tools cache hits
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-11-04 14:36:43 +00:00
MervinPraisonandClaude Opus 5.5 09c443a71f fix: count only function-schema dicts in nested lists for the edit hint
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-11-04 13:48:09 +00:00
MervinPraisonandClaude Opus 5.5 a0ad968af0 fix: skip the edit hint for permission-denied edit tools
_prune_denied_tools drops denied tools from the payload, so the hint must
not name them. Tests now record the formatted tool payload, which also
checks that a nested edit schema is actually sent.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-11-04 13:39:58 +00:00
MervinPraison 8d9b32de91 docs: auto-update feature parity trackers [skip ci] 2026-11-04 13:04:25 +00:00
MervinPraisonandClaude Opus 5.5 5baea8dc57 fix: gate explicit Ollama agents on their declared base_url, not OLLAMA_HOST
Addresses review on #6229: run --agent with llm.base_url probed the env/default
host instead of the server the agent actually calls.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-11-04 13:03:30 +00:00
MervinPraisonandClaude Opus 5.5 b284b67011 fix: let explicit ollama/ models run keyless and make local probe tolerant (fixes #6228)
- Gate explicit ollama/ and ollama_chat/ models on the server answering
  /api/tags (OLLAMA_API_BASE, OLLAMA_HOST, or 127.0.0.1:11434) instead of
  requiring OLLAMA_HOST as a credential.
- Unreachable Ollama now says to start it with `ollama serve` rather than
  asking for an API key.
- Raise the local probe timeout from 0.15s to 1s; a running Ollama can take
  ~0.35s on its first call.
- Only print the 'would be used automatically' hint when auto-detection
  actually ran; name the model when one was given.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-11-04 12:56:04 +00:00
MervinPraisonandClaude Opus 5.5 dc35781e2f fix(benchmarks): rotate framework order each timed round
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-11-04 12:24:53 +00:00
MervinPraison 16f148d6c2 docs: auto-update feature parity trackers [skip ci] 2026-11-04 12:18:10 +00:00
MervinPraison e05b16b366 docs: auto-update feature parity trackers [skip ci] 2026-11-04 12:01:04 +00:00
MervinPraisonandClaude Opus 5.5 d67a39ec40 fix: mention secret kind in server_reply handler comments (#6223)
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-11-04 11:47:45 +00:00
MervinPraisonandClaude Opus 5.5 bcba4110ff fix: add model-isolated 'secret' gateway request kind (fixes #6223)
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-11-04 11:36:40 +00:00
MervinPraisonandClaude Opus 5.5 4c3eecfb8f fix(benchmarks): time only the execution call and keep frameworks after a failed warm-up
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-11-04 11:34:01 +00:00
MervinPraisonandClaude Opus 5.5 d41f427f59 fix: detect edit tools inside nested tool lists for the edit hint
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-11-04 11:18:20 +00:00
MervinPraisonandClaude Opus 5.5 d01c37d434 fix: key API rate budget only on a validated bearer, never fall back to client-chosen session id (#6215)
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-11-03 11:42:45 +00:00
MervinPraisonandClaude Opus 5.5 831490316f fix: start() keeps the state lock owned by start_with_config until channels stop; make concurrent-claim test deterministic
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-11-03 11:18:32 +00:00
MervinPraisonandClaude Opus 5.5 d20762ea11 fix: stable per-caller rate key, reload-applied and validated per-user budget, bounded pruning (#6215)
- API/WebSocket turns charge the budget to a stable caller identity
  (bearer-token digest or peer IP) so a new session id cannot reset it.
- gateway.per_user_per_minute changes now take effect on config reload
  (validated before cutover; restored on rollback).
- Fractional/boolean/negative budgets are rejected instead of truncated.
- Stale-identity pruning runs at most every 5s instead of on every request.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-11-03 11:05:38 +00:00
MervinPraisonandClaude Opus 5.5 8528cf3da5 fix: enforce optional per-user inbound request budget at bot/gateway admission (fixes #6215)
Wires the existing core SlidingWindowRateLimitPolicy into the shared
AdmissionGate so a single user cannot start unbounded turns. Configured
via gateway.per_user_per_minute (YAML) or BotOS(per_user_per_minute=...);
default 0 keeps ingress unlimited.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-11-03 10:56:28 +00:00
MervinPraisonandClaude Opus 5.5 de3a1df83b fix: make gateway state lock an exclusive claim taken before channel recovery and released on any startup failure
- port_utils: serialise claim with flock + exclusive link()/O_EXCL so racing starts cannot both win
- key state lock on ~/.praisonai (where the stores actually live), not PRAISONAI_HOME
- server: acquire state lock in start_with_config before start_channels (journal replay)
- server: release both locks on any failure after claim, not only serve() errors

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-11-03 10:38:46 +00:00
MervinPraisonandClaude Opus 5.5 0b4cb4db60 fix: BotOS.from_config warns instead of crashing on non-string unknown YAML keys
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-11-03 10:32:13 +00:00
MervinPraisonandClaude Opus 5.5 2c8dd09aa5 fix: lock gateway single-instance guard on shared state dir, not just host:port (fixes #6208)
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-11-03 10:29:53 +00:00
MervinPraisonandClaude Opus 5.5 25729bec08 fix: BotOS.from_config rejects gateway-only YAML instead of silently dropping it (fixes #6210)
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-11-03 10:28:34 +00:00
MervinPraisonandClaude Opus 5.5 60495e8d26 fix: atomic_write refuses read-only targets like open(path, 'w') instead of replacing them via inode swap
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-11-03 09:41:23 +00:00
MervinPraisonandClaude Opus 5.5 dfa448d57b fix: create atomic_write temp file with target's permission bits so private files are never exposed mid-write
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-11-03 09:39:26 +00:00
MervinPraisonandClaude Opus 5.5 e128c541d5 fix: surface budget stops in sync chat, keep execution in roles YAML, validate --max-budget
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-11-03 09:07:53 +00:00
MervinPraisonandClaude Opus 5.5 91f0cc7727 fix: expose max-budget on praisonai loop and pass YAML execution block through (fixes #6206)
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-11-03 08:58:57 +00:00
MervinPraisonandClaude Opus 5.5 41acf94def fix: atomic_write writes through symlinks instead of replacing the link
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-11-03 08:53:47 +00:00
MervinPraisonandClaude Opus 5.5 40e04fdf44 fix: create atomic_write temp file with 0o666 instead of reading process-wide umask
os.umask() is process-wide, so the read-and-restore window could make files
created by other threads world-writable. The temp file is now created via
os.open(O_CREAT|O_EXCL, 0o666) so the kernel applies the current umask.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-11-03 08:51:47 +00:00
MervinPraisonandClaude Opus 5.5 d21d60600f fix: keep umask-based mode for new files and locale encoding in multiedit atomic writes
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-11-03 08:17:07 +00:00
MervinPraisonandClaude Opus 5.5 0b04d2f017 fix: write praisonai.code edit tools atomically so interrupts keep the original file (fixes #6204)
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-11-03 08:11:56 +00:00
MervinPraisonandClaude Opus 5.5 6b0a5b40d1 fix: keep text sent with tool calls when stream fallback hits the tool-call cap
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-11-03 07:38:04 +00:00
MervinPraisonandClaude Opus 5.5 cf479e12b1 fix: apply tool-call cap before recording assistant turn and label Responses tool results correctly (fixes #6202)
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-11-03 07:22:22 +00:00
MervinPraisonandClaude Opus 5.5 f4203597ba fix: accept mapping form of top-level YAML llm in schema validation
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-11-02 09:30:30 +00:00
MervinPraisonandClaude Opus 5.5 8e1d980b89 fix: honour top-level YAML llm as crew default model (fixes #6200)
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-11-02 09:22:43 +00:00
MervinPraisonandClaude Opus 5.5 d7f424d900 fix: drop stdin paste fallback so OAuth never consumes host stdin; headless consent via SSH forward or curl to loopback
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-11-01 11:48:20 +00:00
MervinPraisonandClaude Opus 5.5 7b7c4139b3 fix: use one shared terminal reader for headless OAuth pastes; assert per-state routing in tests
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-11-01 11:15:02 +00:00
MervinPraisonandClaude Opus 5.5 c2bab77861 fix: share OAuth loopback callback across concurrent flows and support headless consent (fixes #6179)
- One process-wide loopback callback server (ref-counted) instead of each
  flow binding 127.0.0.1:19876, so concurrent flows no longer collide; the
  state-keyed OAuthCallbackHandler routes codes per flow.
- When no browser can be opened, print the authorization URL to stderr so
  the operator can consent from any device, and on a TTY accept the pasted
  redirect URL (state-checked) to complete the flow.
- InteractiveAuthRequired now points to `praisonai mcp auth <name>`.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-11-01 11:08:55 +00:00
MervinPraisonandClaude Opus 5.5 08855b1cec fix: count quick_ratio prefilter against closest-match hint budget (#6175)
The quick_ratio() prefilter is a pure-Python pass over each window and was
not charged to the comparison budget, so a failed edit on a 20k-line file
could spend ~4s (with the file lock held) before returning the hint.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-11-01 09:49:45 +00:00
MervinPraisonandClaude Opus 5.5 b9f3445e35 fix: drop 'already applied' shortcut on edit no-match to avoid false success (#6175)
Similarity ties could pick an unrelated site containing new_string and
report the edit as applied while the intended target was unchanged.
The closest-match hint already shows retried edits, so keep only that.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-11-01 09:47:19 +00:00
MervinPraisonandClaude Opus 5.5 2aa603da4d fix: bound closest-match hint search, truncate hint lines, location-check idempotent no-op (#6175)
- Only report 'No change needed' when the unique new_string sits inside the
  region most similar to old_string; unrelated occurrences elsewhere now
  return the normal no-match error with a hint.
- Skip hint for old_string > 2000 chars and cap total SequenceMatcher work so
  long/minified lines cannot stall failed edits while file locks are held.
- Truncate each displayed hint line to 200 chars.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-11-01 09:18:43 +00:00
MervinPraisonandClaude Opus 5.5 127932eafc fix: self-correcting no-match errors in edit_file/apply_patch (fixes #6175)
- edit_file: when old_string is absent but new_string occurs exactly once
  (and is not a substring of old_string), report a no-op success
  instead of 'String not found' so retried edits do not loop.
- edit_file / apply_patch: on a miss, include the most similar region
  of the file with line numbers so the agent can fix old_string
  without re-reading the whole file. Falls back to the existing
  concise error when nothing is similar enough.

Stdlib difflib only; no new params, modules or exports.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-11-01 08:58:55 +00:00
MervinPraisonandClaude Opus 5.5 1c896cb4db fix: join wrapper exceptions to core PraisonAIError hierarchy (fixes #6173)
Every praisonai.* exception subclassed stdlib Exception/RuntimeError/
ValueError/TimeoutError directly, so callers could not catch "any
PraisonAI error" with one except, despite core's
praisonaiagents.PraisonAIError documenting itself as the base for all
PraisonAI errors.

Re-parent the 15 root wrapper exceptions on a private _WrapperError
(a PraisonAIError subclass). Stdlib parents are kept via multiple
inheritance, and str(e)/args/custom attributes are unchanged, so
existing except sites and CLI messages behave exactly as before.

No new public exports: users catch the existing
praisonaiagents.PraisonAIError.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-11-01 08:40:07 +00:00
MervinPraisonandClaude Opus 5.5 5636a416fb fix: harden Agent.output_file, bound git calls, atomic learn archive (fixes #6171)
- Agent._save_output_to_file now routes through utils.output_file.write_output_file
  (O_NOFOLLOW + hardlink-safe), matching AgentTeam/Workflow.
- FileSnapshot._run_git and GitWorktreeAdapter._git get a 60s timeout and
  GIT_TERMINAL_PROMPT=0; worktree treats a timeout as git unavailable.
- BaseStore._archive writes atomically under a FileLock and quarantines a
  corrupt archive so eviction keeps working.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-11-01 07:29:25 +00:00
MervinPraison e8b4ab18b7 docs: auto-update feature parity trackers [skip ci] 2026-10-31 18:55:32 +00:00
MervinPraisonandClaude Opus 5.5 5b1d79eb31 fix: add fresh-process regression test for lazy opt-in imports (#6167)
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-31 18:41:49 +00:00
MervinPraisonandClaude Opus 5.5 f8768debb4 fix: lazy-load server_registry, goal judge and encrypted session store (fixes #6167)
Move three opt-in-only imports off module top level:
- agent/execution_mixin.py: _server_registry now imported in the launch
  path and cleanup_launch_registration().
- goal/loop.py: judge_goal/_tail imported inside _goal_gate().
- session/__init__.py: EncryptedSessionStore & co. served via __getattr__.

Tests now patch praisonaiagents.goal.judge.judge_goal (the lookup site).

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-31 18:29:27 +00:00
MervinPraisonandClaude Opus 5.5 1b632227d6 fix: clear status line on finalize and apply rate limit/flood backoff to status updates (#6162)
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-31 10:54:45 +00:00
MervinPraisonandClaude Opus 5.5 bb6e6849e8 fix: route streaming progress to a textual status line on edit-less channels (fixes #6162)
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-31 10:50:44 +00:00
MervinPraisonandClaude Opus 5.5 332dccad78 fix: recheck turn liveness before each attachment upload (#6160)
/stop only sets the InterruptController flag and does not cancel an
in-flight send(), so remaining media uploads now re-check liveness and
stop fail-closed, reporting the unsent attachments as skipped.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-31 10:24:29 +00:00
MervinPraisonandClaude Opus 5.5 790776d40c fix: bind gateway outbound effects to originating turn liveness (fixes #6160)
BotOutboundMessenger accepts an optional liveness predicate (same contract
as ApprovalRequest.liveness) and drops send/react/create_thread/edit/delete
fail-closed when the originating turn was stopped or superseded. The
session binds it to the run's per-turn InterruptController, so a retained
messenger handle from a cancelled turn cannot reach a user channel while
normal post-turn background deliveries keep working.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-31 10:17:39 +00:00
MervinPraisonandClaude Opus 5.5 32d4a708a4 fix: lock-safe, retryable tool_stats flush and per-tool latest timestamps (#6158)
- Merge tool_stats inside the store's locked read-modify-write so
  concurrent CLI saves don't drop counts.
- Restore the drained tally when the write fails so a later flush retries.
- Record last_at/last_error_at per tool and pick latest values by tool
  time, not session updated_at.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-31 09:10:10 +00:00
MervinPraisonandClaude Opus 5.5 a9ae148544 fix: add local per-tool usage reporting via praisonai usage --by tool (fixes #6158)
Tally per-tool calls/errors/latency from the existing AFTER_TOOL hook
payload, persist it as session `tool_stats` metadata alongside token/cost
in accumulate_session_usage, and add a `tool` grouping (table + --json)
to `praisonai usage`. Core change is limited to surfacing `tool_stats` in
list_sessions. No new Agent params, exports or dependencies.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-31 09:04:09 +00:00
MervinPraisonandClaude Opus 5.5 cbbc7227b4 test: cover image download success, redirect refusal and size cap (#6156)
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-31 08:26:22 +00:00
MervinPraisonandClaude Opus 5.5 cbda44ec6f fix: harden wrapper code exec, image save SSRF, schedule runner race (fixes #6156)
- praisonai.code execute_command reuses core quote-aware shell-syntax
  rejection and secret-scrubbed subprocess env
- ImageResult.save() screens URL scheme/host, refuses redirects, adds
  timeout and size cap
- schedules_runner: lock around start, executor bound in closure, add
  idempotent stop_schedule_runner()

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-31 08:18:23 +00:00
MervinPraison 2980df14b5 docs: auto-update feature parity trackers [skip ci] 2026-10-31 07:44:11 +00:00
MervinPraisonandClaude Opus 5.5 27eb2dadfb test: cover RAG.astream sync-stream fallback (offload + single retrieval)
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-31 07:31:26 +00:00
MervinPraisonandClaude Opus 5.5 0a93c294db fix: honour early tasks/cancel and clean up on early stream close in A2A message/stream
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-31 07:30:09 +00:00
MervinPraisonandClaude Opus 5.5 f34aa853be test: cover model-middleware context copy in AG-UI run isolation (#6150)
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-31 07:25:37 +00:00
MervinPraisonandClaude Opus 5.5 8e1b7d3bc1 fix: offload blocking work in RAG.astream, EscalationPipeline and SubQuestionEngine.aquery (fixes #6152)
- RAG.astream runs retrieval/rerank via asyncio.to_thread and pumps the sync
  LLM stream fallback from a worker thread (no double retrieval)
- RAG.aretrieve/aquery use asyncio.to_thread so contextvars propagate
- EscalationPipeline runs agent.chat in a worker thread and passes heuristic
  tools per call instead of mutating the shared agent.tools
- SubQuestionEngine.aquery offloads the sync query (LLM decomposition)

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-31 07:23:24 +00:00
MervinPraisonandClaude Opus 5.5 95bb0a880e fix: run A2A message/stream off the event loop and track its task lifecycle (fixes #6151)
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-31 07:23:01 +00:00
MervinPraisonandClaude Opus 5.5 405665e92a fix: isolate AG-UI stream events per run to stop cross-user token leak (fixes #6150)
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-31 07:20:22 +00:00
MervinPraisonandClaude Opus 5.5 f864f1567b test: assert newest entries retained in maxEntries eviction test
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-31 02:33:53 +00:00
MervinPraisonandClaude Opus 5.5 ddda6cb7e2 fix: reject negative maxEntries in TS Memory/FileMemory to prevent add() hang (fixes #6146)
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-31 02:29:28 +00:00
MervinPraisonandClaude Opus 5.5 0049425726 fix: remove unreferenced get_tool_definitions/discover_plugins free wrappers in tools/registry.py (fixes #6144)
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-30 17:27:00 +00:00
MervinPraisonandClaude Opus 5.5 77ead9867b fix: kill command-hook subprocess when hook execution is cancelled (#6140)
The gateway_stop deadline bound cancels HookRunner.execute via
asyncio.wait_for; the command hook's child process was left running.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-30 10:29:37 +00:00
MervinPraisonandClaude Opus 5.5 ccb70184d6 fix: regenerate gateway schema, bound gateway_stop hooks by shutdown deadline, fire on serve unwind (#6140)
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-30 10:21:32 +00:00
MervinPraisonandClaude Opus 5.5 d85dc3afdb fix: fire gateway_stop/message_undelivered on gateway outbound hooks and unregister on stop (#6140)
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-30 10:10:23 +00:00
MervinPraisonandClaude Opus 5.5 b34dc3090b fix: add config-only gateway.hooks_outbound lifecycle sinks (fixes #6140)
Each entry {command, events, timeout} registers a core CommandHook on the
default hook registry, so lifecycle events (session_end, message_undelivered,
job_completed, gateway_stop, ...) reach a shell command with the event JSON
on stdin. Reload-safe, skipped in safe mode, schema-validated.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-30 10:02:25 +00:00
MervinPraisonandClaude Opus 5.5 4ca149f9d6 fix: apply notification prefs on reload, reject unknown timezones, validate in from_config_file (#6138)
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-30 09:40:31 +00:00
MervinPraisonandClaude Opus 5.5 a4605a9c44 fix: enforce core notification policy on categorised proactive sends (fixes #6138)
Wire praisonaiagents.push.policy.evaluate into DeliveryRouter.deliver via a
small NotificationGate configured from gateway.notifications (YAML) or
DeliveryRouter(notifications=...) (Python). Scheduled results are tagged
agent_finished so categories, quiet hours (recipient timezone) and detail-level
redaction now apply. Unconfigured routers and uncategorised sends are unchanged.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-30 09:31:43 +00:00
MervinPraisonandClaude Opus 5.5 39c254eca8 fix: stop praisonai.tools.multiedit submodule import from shadowing the multiedit function regardless of import order
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-30 08:39:38 +00:00