Repository navigation
Conversation
Compose one Messages lifecycle across model turns and retain tool execution, usage, and continuation state through a public stream result.
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 33fd3373d0
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 8ab9740222
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Summary
Successive tool-runner messages can leave the official Anthropic stream consumer with an empty final answer. Messages now emits one logical lifecycle and retains the run's tool results and continuation history.
Closes #563.
Goal
Provide a coherent Messages stream and an authoritative result for safe continuation.
What Changed
MessagesStream.result,get_final_result(), andclose(). Streaming and non-streaming use the same finalization;message_stop.resultcarries the final dictionary. Execution-timePageIndexAPIErroralso retains it.Messages streams yield JSON event dictionaries. Turn-limit results use
stop_reason="pause_turn"and retain the provider reason inrun.model_stop_reason. Continuation usesmessages; incomplete model turns are kept out of that history. Closing stops subsequent local work but cannot certify cancellation of dispatched external work.Validation: 872 passed, 12 skipped in the full local suite with Anthropic 1.7.0; 11 targeted tests passed each on Anthropic 0.122.0, 1.0.0, and 1.1.0.
git diff --checkpasses. Coverage includes single/multiple turns, native metadata, compaction, provider pauses, content indices, usage/cache completeness, turn-limit continuation without duplicate calls, failure, truncated streams, and close. Tests use no paid model calls.Key Files
pageindex/local_chat.py: stream composition and shared finalization at the existing runner hook.pageindex/chat_stream.py: the result-bearing iterator.pageindex/client.py,pageindex/__init__.py: API contract and public types.tests/test_local_chat.py,tests/test_package_surface.py: behavioral and public-interface checks.