Skip to main content
A capability flag describes what an engine can report, not what it can do.

Quick Start

1

Read a capability before rendering

Capabilities are a property, so the UI decides what to render before the first token.
2

Print the unsupported scenarios

The conformance suite prints every scenario an engine cannot produce.

The Capability Matrix

What each shipped engine can report.

Closed Gaps

The rows kept from the old gap report so a reader arriving from an old bug can find where they went.

Why tools: false For praisonai-ts

praisonai-ts executes tools normally; it just never announces them. Upstream Agent.streamEvents() emits a three-variant union — text, finish, error — and none of those carry a tool call, so the engine cannot report one.
The flag describes what the engine can report. A UI that renders tool rows off a true flag would render nothing and look broken — and a tool call that silently failed would be indistinguishable from a normal answer, which is exactly what tool_result.ok was introduced to prevent.

How Each Gap Closed

Gap 4 was “mechanism landed, not wired”: createSession was called and RunPersistence.record was called, and nothing connected them — the two signatures did not even line up (record(prompt, answer) against record(request, answer)).
Gap 5 was “property added, snapshot not seeded”: keyboardHeightPx was declared = 0 and only updated by an event, so a component mounting while the keyboard was already up laid out at 0 for one frame and then jumped.
Both are verified by a positive control: reverting either makes a named test fail. Gap 6 was also “mechanism landed, not wired”: the Dropped type, the view-model row and the seven user-facing strings all existed with no producer. remote-http was the only production caller of decodeEvent and discarded every rejection, so a malformed frame made its tool vanish and the turn rendered as a clean answer.
A carry field fixed the cross-turn contamination: apply(start) no longer carries the previous turn’s entire dropped list, so one refusal on turn 1 no longer paints every later turn as damaged. Two composition tests pin the two wiring hops — createApp and the real enginesFor — because removing the sink from createRunController or dropping the registry’s forward each left the suite green in isolation. See Dropped Events.
showDiagnostics (labelled “Show dropped events”) is now meaningful: dropped events exist in the transcript for it to hide or show. It is declared but not yet consumed — dropped rows currently render unconditionally until a settings screen reads the flag.

The 5 Unsupported Scenarios

From src/praisonai-mobile/docs/gaps.md, the conformance scenarios praisonai-ts declares unsupported. Each is printed on every run, so a contract that quietly shrinks is visible rather than silently green.
Closing the gap needs an upstream change: AgentEvent gaining tool and approval variants, mirroring Python’s StreamEventType. Until then, use remote-http for tool visibility.

Roadmap

Closing the TurnState interleave gap is the prerequisite to remote-http becoming the default. Two Node-only imports on the Agent graph (crypto in agent/simple.ts, events in ai/tool-approval.ts) still block the in-process device build — tracked as PraisonAI PR #4438.

Best Practices

Check capabilities.tools before drawing tool rows; the flag is the contract the conformance suite enforces in both directions.
An honest unsupported entry keeps the suite meaningful; a faked scenario hides a defect it exists to catch.
remote-http speaks the full vocabulary because the desktop server already emits it.
A mechanism existing is not the same as a mechanism working. Gaps 4 and 5 each landed a type or a function before the wiring, and read as closed from either end until re-audited.
The Gap-4 and Gap-5 rows stay in the matrix, linked to PR #4552, so a reader coming from an old bug report can find where they went rather than assuming they were dropped.
The remote-http exclusion is deliberate. Documenting it up front stops a future reader from filing the empty local session as a regression.

Agent Engine Port

The port and its conformance harness.

The 11 Events

The full event vocabulary.

Mobile Engines

Which engine owns the write.

Shell & Adapters

The keyboard snapshot and its guard.

Dropped Events

The closed decode-rejection gap, end to end.