agentshim 0.15.4__tar.gz → 0.15.5__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {agentshim-0.15.4 → agentshim-0.15.5}/CHANGELOG.md +15 -0
- {agentshim-0.15.4 → agentshim-0.15.5}/PKG-INFO +1 -1
- {agentshim-0.15.4 → agentshim-0.15.5}/agentshim/__init__.py +1 -1
- {agentshim-0.15.4 → agentshim-0.15.5}/agentshim/core/session_policy.py +15 -4
- {agentshim-0.15.4 → agentshim-0.15.5}/agentshim/providers/codex/app_server/transport.py +6 -0
- {agentshim-0.15.4 → agentshim-0.15.5}/pyproject.toml +1 -1
- {agentshim-0.15.4 → agentshim-0.15.5}/.gitignore +0 -0
- {agentshim-0.15.4 → agentshim-0.15.5}/LICENSE +0 -0
- {agentshim-0.15.4 → agentshim-0.15.5}/README.md +0 -0
- {agentshim-0.15.4 → agentshim-0.15.5}/agentshim/agent.py +0 -0
- {agentshim-0.15.4 → agentshim-0.15.5}/agentshim/core/__init__.py +0 -0
- {agentshim-0.15.4 → agentshim-0.15.5}/agentshim/core/_files.py +0 -0
- {agentshim-0.15.4 → agentshim-0.15.5}/agentshim/core/checkpoints.py +0 -0
- {agentshim-0.15.4 → agentshim-0.15.5}/agentshim/core/clock.py +0 -0
- {agentshim-0.15.4 → agentshim-0.15.5}/agentshim/core/conversation.py +0 -0
- {agentshim-0.15.4 → agentshim-0.15.5}/agentshim/core/env.py +0 -0
- {agentshim-0.15.4 → agentshim-0.15.5}/agentshim/core/errors.py +0 -0
- {agentshim-0.15.4 → agentshim-0.15.5}/agentshim/core/events.py +0 -0
- {agentshim-0.15.4 → agentshim-0.15.5}/agentshim/core/home.py +0 -0
- {agentshim-0.15.4 → agentshim-0.15.5}/agentshim/core/ids.py +0 -0
- {agentshim-0.15.4 → agentshim-0.15.5}/agentshim/core/mcp.py +0 -0
- {agentshim-0.15.4 → agentshim-0.15.5}/agentshim/core/permissions.py +0 -0
- {agentshim-0.15.4 → agentshim-0.15.5}/agentshim/core/pricing.py +0 -0
- {agentshim-0.15.4 → agentshim-0.15.5}/agentshim/core/profile.py +0 -0
- {agentshim-0.15.4 → agentshim-0.15.5}/agentshim/core/provider.py +0 -0
- {agentshim-0.15.4 → agentshim-0.15.5}/agentshim/core/schema.py +0 -0
- {agentshim-0.15.4 → agentshim-0.15.5}/agentshim/core/skills.py +0 -0
- {agentshim-0.15.4 → agentshim-0.15.5}/agentshim/core/status.py +0 -0
- {agentshim-0.15.4 → agentshim-0.15.5}/agentshim/core/stream.py +0 -0
- {agentshim-0.15.4 → agentshim-0.15.5}/agentshim/core/turn.py +0 -0
- {agentshim-0.15.4 → agentshim-0.15.5}/agentshim/core/usage.py +0 -0
- {agentshim-0.15.4 → agentshim-0.15.5}/agentshim/execution/__init__.py +0 -0
- {agentshim-0.15.4 → agentshim-0.15.5}/agentshim/execution/confinement.py +0 -0
- {agentshim-0.15.4 → agentshim-0.15.5}/agentshim/execution/docker.py +0 -0
- {agentshim-0.15.4 → agentshim-0.15.5}/agentshim/execution/executor.py +0 -0
- {agentshim-0.15.4 → agentshim-0.15.5}/agentshim/execution/host.py +0 -0
- {agentshim-0.15.4 → agentshim-0.15.5}/agentshim/execution/process.py +0 -0
- {agentshim-0.15.4 → agentshim-0.15.5}/agentshim/execution/transform.py +0 -0
- {agentshim-0.15.4 → agentshim-0.15.5}/agentshim/oneshot.py +0 -0
- {agentshim-0.15.4 → agentshim-0.15.5}/agentshim/probe.py +0 -0
- {agentshim-0.15.4 → agentshim-0.15.5}/agentshim/providers/__init__.py +0 -0
- {agentshim-0.15.4 → agentshim-0.15.5}/agentshim/providers/claude/__init__.py +0 -0
- {agentshim-0.15.4 → agentshim-0.15.5}/agentshim/providers/claude/events.py +0 -0
- {agentshim-0.15.4 → agentshim-0.15.5}/agentshim/providers/claude/failures.py +0 -0
- {agentshim-0.15.4 → agentshim-0.15.5}/agentshim/providers/claude/hooks/__init__.py +0 -0
- {agentshim-0.15.4 → agentshim-0.15.5}/agentshim/providers/claude/hooks/confine_reads.py +0 -0
- {agentshim-0.15.4 → agentshim-0.15.5}/agentshim/providers/claude/parser.py +0 -0
- {agentshim-0.15.4 → agentshim-0.15.5}/agentshim/providers/claude/probe.py +0 -0
- {agentshim-0.15.4 → agentshim-0.15.5}/agentshim/providers/claude/provider.py +0 -0
- {agentshim-0.15.4 → agentshim-0.15.5}/agentshim/providers/claude/rate_limits.py +0 -0
- {agentshim-0.15.4 → agentshim-0.15.5}/agentshim/providers/claude/sandbox.py +0 -0
- {agentshim-0.15.4 → agentshim-0.15.5}/agentshim/providers/claude/scripted.py +0 -0
- {agentshim-0.15.4 → agentshim-0.15.5}/agentshim/providers/claude/stream_argv.py +0 -0
- {agentshim-0.15.4 → agentshim-0.15.5}/agentshim/providers/claude/stream_transport.py +0 -0
- {agentshim-0.15.4 → agentshim-0.15.5}/agentshim/providers/claude/user_hooks.py +0 -0
- {agentshim-0.15.4 → agentshim-0.15.5}/agentshim/providers/codex/__init__.py +0 -0
- {agentshim-0.15.4 → agentshim-0.15.5}/agentshim/providers/codex/_toml.py +0 -0
- {agentshim-0.15.4 → agentshim-0.15.5}/agentshim/providers/codex/app_server/__init__.py +0 -0
- {agentshim-0.15.4 → agentshim-0.15.5}/agentshim/providers/codex/app_server/_wire.py +0 -0
- {agentshim-0.15.4 → agentshim-0.15.5}/agentshim/providers/codex/app_server/approvals.py +0 -0
- {agentshim-0.15.4 → agentshim-0.15.5}/agentshim/providers/codex/app_server/channel.py +0 -0
- {agentshim-0.15.4 → agentshim-0.15.5}/agentshim/providers/codex/app_server/errors.py +0 -0
- {agentshim-0.15.4 → agentshim-0.15.5}/agentshim/providers/codex/app_server/items.py +0 -0
- {agentshim-0.15.4 → agentshim-0.15.5}/agentshim/providers/codex/app_server/mcp.py +0 -0
- {agentshim-0.15.4 → agentshim-0.15.5}/agentshim/providers/codex/app_server/permissions.py +0 -0
- {agentshim-0.15.4 → agentshim-0.15.5}/agentshim/providers/codex/app_server/profile.py +0 -0
- {agentshim-0.15.4 → agentshim-0.15.5}/agentshim/providers/codex/app_server/protocol.py +0 -0
- {agentshim-0.15.4 → agentshim-0.15.5}/agentshim/providers/codex/app_server/rate_limits.py +0 -0
- {agentshim-0.15.4 → agentshim-0.15.5}/agentshim/providers/codex/app_server/usage.py +0 -0
- {agentshim-0.15.4 → agentshim-0.15.5}/agentshim/providers/codex/events.py +0 -0
- {agentshim-0.15.4 → agentshim-0.15.5}/agentshim/providers/codex/failures.py +0 -0
- {agentshim-0.15.4 → agentshim-0.15.5}/agentshim/providers/codex/mcp_scope.py +0 -0
- {agentshim-0.15.4 → agentshim-0.15.5}/agentshim/providers/codex/parser.py +0 -0
- {agentshim-0.15.4 → agentshim-0.15.5}/agentshim/providers/codex/probe.py +0 -0
- {agentshim-0.15.4 → agentshim-0.15.5}/agentshim/providers/codex/provider.py +0 -0
- {agentshim-0.15.4 → agentshim-0.15.5}/agentshim/providers/codex/rules.py +0 -0
- {agentshim-0.15.4 → agentshim-0.15.5}/agentshim/providers/codex/sandbox.py +0 -0
- {agentshim-0.15.4 → agentshim-0.15.5}/agentshim/providers/codex/scripted.py +0 -0
- {agentshim-0.15.4 → agentshim-0.15.5}/agentshim/providers/codex/skills.py +0 -0
- {agentshim-0.15.4 → agentshim-0.15.5}/agentshim/providers/copilot/__init__.py +0 -0
- {agentshim-0.15.4 → agentshim-0.15.5}/agentshim/providers/copilot/events.py +0 -0
- {agentshim-0.15.4 → agentshim-0.15.5}/agentshim/providers/copilot/parser.py +0 -0
- {agentshim-0.15.4 → agentshim-0.15.5}/agentshim/providers/copilot/probe.py +0 -0
- {agentshim-0.15.4 → agentshim-0.15.5}/agentshim/providers/copilot/provider.py +0 -0
- {agentshim-0.15.4 → agentshim-0.15.5}/agentshim/providers/copilot/scripted.py +0 -0
- {agentshim-0.15.4 → agentshim-0.15.5}/agentshim/providers/gemini/__init__.py +0 -0
- {agentshim-0.15.4 → agentshim-0.15.5}/agentshim/providers/gemini/events.py +0 -0
- {agentshim-0.15.4 → agentshim-0.15.5}/agentshim/providers/gemini/parser.py +0 -0
- {agentshim-0.15.4 → agentshim-0.15.5}/agentshim/providers/gemini/probe.py +0 -0
- {agentshim-0.15.4 → agentshim-0.15.5}/agentshim/providers/gemini/provider.py +0 -0
- {agentshim-0.15.4 → agentshim-0.15.5}/agentshim/providers/gemini/scripted.py +0 -0
- {agentshim-0.15.4 → agentshim-0.15.5}/agentshim/providers/opencode/__init__.py +0 -0
- {agentshim-0.15.4 → agentshim-0.15.5}/agentshim/providers/opencode/events.py +0 -0
- {agentshim-0.15.4 → agentshim-0.15.5}/agentshim/providers/opencode/parser.py +0 -0
- {agentshim-0.15.4 → agentshim-0.15.5}/agentshim/providers/opencode/probe.py +0 -0
- {agentshim-0.15.4 → agentshim-0.15.5}/agentshim/providers/opencode/provider.py +0 -0
- {agentshim-0.15.4 → agentshim-0.15.5}/agentshim/providers/opencode/scripted.py +0 -0
- {agentshim-0.15.4 → agentshim-0.15.5}/agentshim/py.typed +0 -0
- {agentshim-0.15.4 → agentshim-0.15.5}/agentshim/runtime.py +0 -0
- {agentshim-0.15.4 → agentshim-0.15.5}/agentshim/session.py +0 -0
- {agentshim-0.15.4 → agentshim-0.15.5}/agentshim/testing/__init__.py +0 -0
- {agentshim-0.15.4 → agentshim-0.15.5}/agentshim/testing/claude_stream.py +0 -0
- {agentshim-0.15.4 → agentshim-0.15.5}/agentshim/testing/clock.py +0 -0
- {agentshim-0.15.4 → agentshim-0.15.5}/agentshim/testing/codex_app_server.py +0 -0
- {agentshim-0.15.4 → agentshim-0.15.5}/agentshim/testing/confinement.py +0 -0
- {agentshim-0.15.4 → agentshim-0.15.5}/agentshim/testing/contracts.py +0 -0
- {agentshim-0.15.4 → agentshim-0.15.5}/agentshim/testing/conversation.py +0 -0
- {agentshim-0.15.4 → agentshim-0.15.5}/agentshim/testing/probe.py +0 -0
- {agentshim-0.15.4 → agentshim-0.15.5}/agentshim/testing/process.py +0 -0
- {agentshim-0.15.4 → agentshim-0.15.5}/tests/fixtures/claude_stream/README.md +0 -0
- {agentshim-0.15.4 → agentshim-0.15.5}/tests/fixtures/codex/README.md +0 -0
- {agentshim-0.15.4 → agentshim-0.15.5}/tests/fixtures/codex_app_server/README.md +0 -0
|
@@ -1,5 +1,20 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.15.5 (2026-10-09)
|
|
4
|
+
|
|
5
|
+
### Fixed
|
|
6
|
+
|
|
7
|
+
- A conversation whose provider thread was lost under it is no longer wedged. When a
|
|
8
|
+
turn that did not itself resume (its conversation was opened during the turn)
|
|
9
|
+
failed with `SessionResumeError` (the Codex app-server died mid-turn and its thread
|
|
10
|
+
could not be resumed in the new process), the session kept the dead conversation
|
|
11
|
+
open and every later turn raised the same error. The session now closes and forgets
|
|
12
|
+
it, still without replaying the turn that may have run.
|
|
13
|
+
- A Codex app-server that never acknowledges a turn (silent or wedged) is stopped when
|
|
14
|
+
the turn times out, so the next turn replaces it by resuming the thread instead of
|
|
15
|
+
timing out against the same process forever. (The Claude stream transport already
|
|
16
|
+
killed a process that ignored its interrupt.)
|
|
17
|
+
|
|
3
18
|
## 0.15.4 (2026-10-09)
|
|
4
19
|
|
|
5
20
|
### Added
|
|
@@ -12,7 +12,9 @@ What the policy decides, per turn:
|
|
|
12
12
|
* A ``TRANSIENT`` failure is retried in place after each delay of the
|
|
13
13
|
``RetryPolicy``; the waits end early when the shell reports a stop.
|
|
14
14
|
* A refused resume replaces the conversation once, unless the turn must not
|
|
15
|
-
lose its conversation (``strict`` or ``pinned``).
|
|
15
|
+
lose its conversation (``strict`` or ``pinned``). A refusal during a turn that
|
|
16
|
+
did not itself resume (the conversation was lost under it) forgets the
|
|
17
|
+
conversation without replaying the turn.
|
|
16
18
|
* An unclassified failure of a resumed turn forgets the conversation.
|
|
17
19
|
* After a successful turn that exhausts the provider's ``RenewalBudget`` the
|
|
18
20
|
conversation is retired.
|
|
@@ -531,13 +533,22 @@ class SessionPolicy:
|
|
|
531
533
|
if event.outcome is Outcome.TRANSIENT:
|
|
532
534
|
return self._retry_transient(state, turn, event)
|
|
533
535
|
if event.outcome is Outcome.RESUME_REFUSED:
|
|
534
|
-
|
|
535
|
-
return _replace_conversation(state, turn)
|
|
536
|
-
return _give_up(state, event.now)
|
|
536
|
+
return self._on_resume_refused(state, turn, event)
|
|
537
537
|
if event.outcome is Outcome.OTHER and turn.resumed and not turn.keeps_conversation:
|
|
538
538
|
return _forget_conversation(state, event.now)
|
|
539
539
|
return _give_up(state, event.now)
|
|
540
540
|
|
|
541
|
+
def _on_resume_refused(self, state: SessionState, turn: TurnState, event: Failed) -> Step:
|
|
542
|
+
if turn.keeps_conversation:
|
|
543
|
+
return _give_up(state, event.now)
|
|
544
|
+
if turn.resumed:
|
|
545
|
+
return _replace_conversation(state, turn)
|
|
546
|
+
# The turn began in a conversation it opened itself and the provider
|
|
547
|
+
# then lost it (a process died mid-turn and its thread could not be
|
|
548
|
+
# resumed). The turn may have run, so it is not replayed, but the
|
|
549
|
+
# conversation is gone: holding it would refuse every later turn.
|
|
550
|
+
return _forget_conversation(state, event.now)
|
|
551
|
+
|
|
541
552
|
def _retry_transient(self, state: SessionState, turn: TurnState, event: Failed) -> Step:
|
|
542
553
|
delays = self.config.retry.delays
|
|
543
554
|
if turn.retries >= len(delays):
|
|
@@ -596,6 +596,12 @@ class _Conversation:
|
|
|
596
596
|
self._handle(self._channel.read(deadline), turn)
|
|
597
597
|
except Expired:
|
|
598
598
|
self._wind_down(turn)
|
|
599
|
+
if turn.turn_id is None:
|
|
600
|
+
# The server never acknowledged the turn, so it is silent or
|
|
601
|
+
# wedged and no interrupt can reach it. Stop it: the next turn
|
|
602
|
+
# replaces the process by resuming the thread, where holding
|
|
603
|
+
# it would time out every later turn too.
|
|
604
|
+
_stop(self._channel.process, self._timeouts.close)
|
|
599
605
|
raise TurnTimeoutError(request.timeout or 0.0) from None
|
|
600
606
|
except Gone as gone:
|
|
601
607
|
raise self._gone_error(gone) from None
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|