11065 Commits
Author SHA1 Message Date
praisonai-triage-agent[bot] 97aaee119b Release v4.7.24 v4.7.24 2026-11-05 19:47:08 +00:00
e41a23e040 fix: confine gateway operators to specific agents via auth_scopes (#6254)
* fix: confine gateway operators to specific agents via auth_scopes (fixes #6253)

A token's auth_scopes entry may now be {scopes: [...], agents: [...]}.
GatewayConfig.resolve_agents(token) returns the confinement (None =
every agent, so existing token -> [scopes] policies are unchanged). The
bot gateway enforces it where a WS client binds to an agent (hello/join,
including session resume via join) and withholds broadcast events
sourced from agents outside the grant.

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

* fix: apply YAML operator policy at gateway startup; fail closed on unknown grant keys

- start_with_config now stamps gateway.auth_scopes / gateway.auth.tokens onto
  self.config, so YAML agent confinement (and scopes) actually take effect.
- Grant mappings reject unknown keys (core parser + typed OperatorGrantSchema),
  so a typo like 'agnts' cannot silently remove a confinement.
- Document that HTTP approval endpoints are not yet agent-filtered (#5151).

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

* fix: expand ${VAR} auth_scopes keys at gateway startup; tolerate older core

- start_with_config(): load_gateway_config resolves ${VAR} in values only, so
  auth_scopes keys stayed literal placeholders. Expand them, drop keys that
  resolve to empty, and refuse to start if a declared policy ends up empty
  (an empty policy means "no policy" and would fail open).
- Guard the private _parse_auth_scopes import and the resolve_agents call so
  an older praisonaiagents keeps pre-#6253 behaviour instead of ImportError.
- Tests for placeholder expansion, all-unset fail-closed (both YAML forms)
  and the older-core fallback.

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

* fix: reject scalar 'agents' in gateway operator grants (#6253)

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

* fix: refuse gateway startup when declared operator policy cannot be enforced by older core (#6253)

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

* fix: fail closed on unknown auth.tokens[] keys; check join agent reach before session resume (#6253)

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

* fix: refuse attaching a confined operator to another agent's shared session (#6253)

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-11-05 19:34:39 +00:00
MervinPraison c6284268f6 docs: auto-update feature parity trackers [skip ci] 2026-11-05 19:33:04 +00:00
a72f170a17 fix: guardrail without name=, OPENAI_TIMEOUT, visible rules notice (#6257) (#6258)
* fix: guardrail without name=, OPENAI_TIMEOUT for plain-model path, visible rules notice (fixes #6257)

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

* fix: show rules notice by default and list only active rules (#6257)

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-11-05 19:32:20 +00:00
MervinPraison b146d40b62 docs: auto-update api.md [skip ci] 2026-11-05 17:58:28 +00:00
praisonai-triage-agent[bot] c8d0dd3251 Merge pull request #6261 from MervinPraison/claude/issue-6260-20261105
fix: ImageAgent results gain .save() (no manual base64 decoding)
2026-11-05 17:58:00 +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
praisonai-triage-agent[bot] 749c6d868a Merge pull request #6262 from MervinPraison/claude/issue-6259-20261105
fix: replace retired dall-e defaults, forward quality for gpt-image, reject unsendable markup
2026-11-05 17:27:43 +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
bf78a76ffd fix: send reasoning_effort as reasoning.effort on the Responses API path (#6132)
* fix: send reasoning_effort as reasoning.effort on the Responses API path

OpenAI reasoning models go to the Responses API by default, but neither
Responses request builder applied the unified reasoning_effort (#4452):
LLM._build_responses_params never read self.reasoning_effort, and the
agent's non-streaming dispatch never forwarded it to the native OpenAI
client, whose _build_responses_input had no mapping for it. The request
went out without any effort.

Resolve the level with resolve_reasoning_params and send it as
reasoning: {"effort": ...}; forward the native level from the agent's
non-streaming dispatch to the OpenAI client. Unset, off and models without
a reasoning control stay no-ops.

* fix: read reasoning_effort and the dispatcher model defensively

Some callers and tests build LLM or Agent objects without the full __init__,
or with a dispatcher stub that has no model attribute. Use getattr with a
None default so the Responses API path does not raise there.

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

---------

Co-authored-by: swf1996120 <[email protected]>
Co-authored-by: Claude Opus 5.5 <[email protected]>
2026-11-05 12:10:59 +01:00
praisonai-triage-agent[bot] 25d3b289ee Merge pull request #6251 from MervinPraison/claude/issue-6248-20261105
fix: session manifest with write-ahead run-in-flight marker (#6248)
2026-11-05 10:15:24 +00:00
praisonai-triage-agent[bot] 9a5824e0b9 Merge pull request #6250 from MervinPraison/claude/issue-6249-20261105
fix: durable FileStepCache for AgentFlow resume (fixes #6249)
2026-11-05 10:15:07 +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
Poppy (AI agent)andpoppy-mogmachine 6bed06cdd1 fix: video_generate sends seconds instead of duration, omits unset aspect_ratio (#5923)
Co-authored-by: poppy-mogmachine <[email protected]>
2026-11-05 10:40:17 +01: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
Mervin PraisonandClaude Opus 5.5 68435ca03a fix(gateway): stop GitGuardian flagging the DeviceAuth lazy-import tuple (#6252)
GitGuardian reads ("praisonaiagents.gateway.protocols", "DeviceAuth") as an
'Authentication Tuple'. Every PR that merges main carries that line and fails
the GitGuardian check, which the merge gate treats as failed CI. Use a
module-path constant instead; DeviceAuth still resolves lazily.

Co-authored-by: Claude Opus 5.5 (1M context) <[email protected]>
2026-11-05 10:04:07 +01: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
praisonai-triage-agent[bot] 20d023a864 Merge pull request #6247 from MervinPraison/docs/readme-exam-wording
docs(readme): say what the handover test tests
2026-11-05 08:57:04 +00:00
praisonai-triage-agent[bot] b05518baed Merge pull request #6246 from MervinPraison/claude/issue-6245-20261105
fix: fail loudly on unknown provider prefix and dropped safety YAML fields
2026-11-05 08:49:45 +00:00
MervinPraisonandClaude Opus 5.5 740a887ade docs(readme): say what the handover test tests
Step 2 now says the model takes an exam made from real past work it never
studied, matching the website and docs.

Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
2026-11-05 08:43:59 +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
praisonai-triage-agent[bot] a362afc899 Merge pull request #6239 from MervinPraison/claude/issue-6238-20261105
fix: confine caller-supplied names to storage dirs and use shared async bridge
2026-11-05 08:31:38 +00:00
praisonai-triage-agent[bot] 4d9b514106 Merge pull request #6243 from MervinPraison/claude/issue-6241-20261105
fix: accept OpenAI-style 'messages' chat datasets in praisonai-train llm
2026-11-05 08:27:30 +00:00
praisonai-triage-agent[bot] d3ecf23533 Merge pull request #6244 from MervinPraison/claude/issue-6242-20261105
fix: add --no-push / ollama_push: false to keep Ollama exports local
2026-11-05 08:27: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
25f8d93a4c docs(readme): say what "your own AI" is in the handover section (#6240)
* docs(readme): say what "your own AI" is in the handover section

The five handover steps never said where the own model comes from. Add one
line: an open model you run yourself, used as it is or trained on your own
past work with PraisonAI Train, and only after it passes the test.

Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>

* fix: match handover wording to the Test step ("its tests")

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

---------

Co-authored-by: Claude Opus 5.5 (1M context) <[email protected]>
Co-authored-by: MervinPraison <[email protected]>
2026-11-05 08:05:23 +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
Elon-Jiang 87bf746dba fix(ts): release hook deadline timers after settlement (#6195) 2026-11-05 08:59:33 +01:00
Wu Shuwen 2b78ce8804 fix: discover compute backends on first placement lookup (#6237) 2026-11-05 08:59:26 +01:00
Wu Shuwen c244c4db7e test: read Python source consistently on Windows (#6235)
* test: read Python source using its declared encoding

* test: read Python source using its declared encoding

* test: read Python source using its declared encoding
2026-11-05 08:59:21 +01: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
7d26272fa0 fix(ts): honor the configured FileCache TTL (#6180)
Co-authored-by: Elon-Jiang <[email protected]>
Co-authored-by: MervinPraison <[email protected]>
Co-authored-by: Claude Opus 5.5 (1M context) <[email protected]>
2026-11-04 21:33:53 +01:00
Elon-Jiang 85c01743c8 fix(ts): re-enter downstream tool middleware on retry (#6196)
* fix(ts): re-enter downstream tool middleware on retry

* fix(tools): stop middleware retries after cancellation
2026-11-04 21:04:36 +01:00
Elon-Jiang 8420d1f93f fix(ts): preserve sentence chunk content and source offsets (#6188) 2026-11-04 21:04:31 +01:00