agentic-runner 3.16.0__tar.gz → 3.16.2__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.
Files changed (76) hide show
  1. {agentic_runner-3.16.0 → agentic_runner-3.16.2}/PKG-INFO +2 -2
  2. {agentic_runner-3.16.0 → agentic_runner-3.16.2}/pyproject.toml +1 -1
  3. {agentic_runner-3.16.0 → agentic_runner-3.16.2}/src/agentic_runner/__init__.py +1 -1
  4. {agentic_runner-3.16.0 → agentic_runner-3.16.2}/src/agentic_runner/activities.py +4 -0
  5. {agentic_runner-3.16.0 → agentic_runner-3.16.2}/src/agentic_runner/workers/claude_runtime.py +24 -13
  6. {agentic_runner-3.16.0 → agentic_runner-3.16.2}/src/agentic_runner/workers/settings.py +0 -4
  7. {agentic_runner-3.16.0 → agentic_runner-3.16.2}/.gitignore +0 -0
  8. {agentic_runner-3.16.0 → agentic_runner-3.16.2}/LICENSE +0 -0
  9. {agentic_runner-3.16.0 → agentic_runner-3.16.2}/README.md +0 -0
  10. {agentic_runner-3.16.0 → agentic_runner-3.16.2}/src/agentic_runner/attempts.py +0 -0
  11. {agentic_runner-3.16.0 → agentic_runner-3.16.2}/src/agentic_runner/auth_mode.py +0 -0
  12. {agentic_runner-3.16.0 → agentic_runner-3.16.2}/src/agentic_runner/build.py +0 -0
  13. {agentic_runner-3.16.0 → agentic_runner-3.16.2}/src/agentic_runner/callback.py +0 -0
  14. {agentic_runner-3.16.0 → agentic_runner-3.16.2}/src/agentic_runner/child_watcher.py +0 -0
  15. {agentic_runner-3.16.0 → agentic_runner-3.16.2}/src/agentic_runner/cli.py +0 -0
  16. {agentic_runner-3.16.0 → agentic_runner-3.16.2}/src/agentic_runner/cli_floor.py +0 -0
  17. {agentic_runner-3.16.0 → agentic_runner-3.16.2}/src/agentic_runner/config.py +0 -0
  18. {agentic_runner-3.16.0 → agentic_runner-3.16.2}/src/agentic_runner/credentials.py +0 -0
  19. {agentic_runner-3.16.0 → agentic_runner-3.16.2}/src/agentic_runner/device_login_activities.py +0 -0
  20. {agentic_runner-3.16.0 → agentic_runner-3.16.2}/src/agentic_runner/egress.py +0 -0
  21. {agentic_runner-3.16.0 → agentic_runner-3.16.2}/src/agentic_runner/harness_self_test.py +0 -0
  22. {agentic_runner-3.16.0 → agentic_runner-3.16.2}/src/agentic_runner/heartbeat_link.py +0 -0
  23. {agentic_runner-3.16.0 → agentic_runner-3.16.2}/src/agentic_runner/hooks.py +0 -0
  24. {agentic_runner-3.16.0 → agentic_runner-3.16.2}/src/agentic_runner/host_store.py +0 -0
  25. {agentic_runner-3.16.0 → agentic_runner-3.16.2}/src/agentic_runner/integrations/__init__.py +0 -0
  26. {agentic_runner-3.16.0 → agentic_runner-3.16.2}/src/agentic_runner/integrations/git/__init__.py +0 -0
  27. {agentic_runner-3.16.0 → agentic_runner-3.16.2}/src/agentic_runner/integrations/git/contracts.py +0 -0
  28. {agentic_runner-3.16.0 → agentic_runner-3.16.2}/src/agentic_runner/integrations/git/evidence.py +0 -0
  29. {agentic_runner-3.16.0 → agentic_runner-3.16.2}/src/agentic_runner/integrations/git/fake_workspace.py +0 -0
  30. {agentic_runner-3.16.0 → agentic_runner-3.16.2}/src/agentic_runner/integrations/git/workspace.py +0 -0
  31. {agentic_runner-3.16.0 → agentic_runner-3.16.2}/src/agentic_runner/integrations/github/__init__.py +0 -0
  32. {agentic_runner-3.16.0 → agentic_runner-3.16.2}/src/agentic_runner/integrations/github/auth.py +0 -0
  33. {agentic_runner-3.16.0 → agentic_runner-3.16.2}/src/agentic_runner/integrations/github/fake_client.py +0 -0
  34. {agentic_runner-3.16.0 → agentic_runner-3.16.2}/src/agentic_runner/integrations/github/gh_client.py +0 -0
  35. {agentic_runner-3.16.0 → agentic_runner-3.16.2}/src/agentic_runner/integrations/oauth/__init__.py +0 -0
  36. {agentic_runner-3.16.0 → agentic_runner-3.16.2}/src/agentic_runner/integrations/oauth/fake_provider.py +0 -0
  37. {agentic_runner-3.16.0 → agentic_runner-3.16.2}/src/agentic_runner/lifecycle.py +0 -0
  38. {agentic_runner-3.16.0 → agentic_runner-3.16.2}/src/agentic_runner/llm_proxy.py +0 -0
  39. {agentic_runner-3.16.0 → agentic_runner-3.16.2}/src/agentic_runner/mcp.py +0 -0
  40. {agentic_runner-3.16.0 → agentic_runner-3.16.2}/src/agentic_runner/message_store.py +0 -0
  41. {agentic_runner-3.16.0 → agentic_runner-3.16.2}/src/agentic_runner/oauth_connectors.py +0 -0
  42. {agentic_runner-3.16.0 → agentic_runner-3.16.2}/src/agentic_runner/private_state.py +0 -0
  43. {agentic_runner-3.16.0 → agentic_runner-3.16.2}/src/agentic_runner/py.typed +0 -0
  44. {agentic_runner-3.16.0 → agentic_runner-3.16.2}/src/agentic_runner/recipient_key_secret.py +0 -0
  45. {agentic_runner-3.16.0 → agentic_runner-3.16.2}/src/agentic_runner/registration.py +0 -0
  46. {agentic_runner-3.16.0 → agentic_runner-3.16.2}/src/agentic_runner/runtime/__init__.py +0 -0
  47. {agentic_runner-3.16.0 → agentic_runner-3.16.2}/src/agentic_runner/runtime/verifier_command.py +0 -0
  48. {agentic_runner-3.16.0 → agentic_runner-3.16.2}/src/agentic_runner/sealed_box.py +0 -0
  49. {agentic_runner-3.16.0 → agentic_runner-3.16.2}/src/agentic_runner/service.py +0 -0
  50. {agentic_runner-3.16.0 → agentic_runner-3.16.2}/src/agentic_runner/skill.py +0 -0
  51. {agentic_runner-3.16.0 → agentic_runner-3.16.2}/src/agentic_runner/skills/agentic-runner-setup/SKILL.md +0 -0
  52. {agentic_runner-3.16.0 → agentic_runner-3.16.2}/src/agentic_runner/testing/__init__.py +0 -0
  53. {agentic_runner-3.16.0 → agentic_runner-3.16.2}/src/agentic_runner/testing/__main__.py +0 -0
  54. {agentic_runner-3.16.0 → agentic_runner-3.16.2}/src/agentic_runner/testing/control_plane.py +0 -0
  55. {agentic_runner-3.16.0 → agentic_runner-3.16.2}/src/agentic_runner/testing/plugin.py +0 -0
  56. {agentic_runner-3.16.0 → agentic_runner-3.16.2}/src/agentic_runner/testing/test_conformance.py +0 -0
  57. {agentic_runner-3.16.0 → agentic_runner-3.16.2}/src/agentic_runner/testing/workflow.py +0 -0
  58. {agentic_runner-3.16.0 → agentic_runner-3.16.2}/src/agentic_runner/tiny_http.py +0 -0
  59. {agentic_runner-3.16.0 → agentic_runner-3.16.2}/src/agentic_runner/triage_activities.py +0 -0
  60. {agentic_runner-3.16.0 → agentic_runner-3.16.2}/src/agentic_runner/usage_windows.py +0 -0
  61. {agentic_runner-3.16.0 → agentic_runner-3.16.2}/src/agentic_runner/user_sources.py +0 -0
  62. {agentic_runner-3.16.0 → agentic_runner-3.16.2}/src/agentic_runner/workers/__init__.py +0 -0
  63. {agentic_runner-3.16.0 → agentic_runner-3.16.2}/src/agentic_runner/workers/_runtime_support.py +0 -0
  64. {agentic_runner-3.16.0 → agentic_runner-3.16.2}/src/agentic_runner/workers/acp_runtime.py +0 -0
  65. {agentic_runner-3.16.0 → agentic_runner-3.16.2}/src/agentic_runner/workers/agent_runtime.py +0 -0
  66. {agentic_runner-3.16.0 → agentic_runner-3.16.2}/src/agentic_runner/workers/claude_sign_in.py +0 -0
  67. {agentic_runner-3.16.0 → agentic_runner-3.16.2}/src/agentic_runner/workers/codex_runtime.py +0 -0
  68. {agentic_runner-3.16.0 → agentic_runner-3.16.2}/src/agentic_runner/workers/command_policy.py +0 -0
  69. {agentic_runner-3.16.0 → agentic_runner-3.16.2}/src/agentic_runner/workers/contract_device_login.py +0 -0
  70. {agentic_runner-3.16.0 → agentic_runner-3.16.2}/src/agentic_runner/workers/contract_isolation.py +0 -0
  71. {agentic_runner-3.16.0 → agentic_runner-3.16.2}/src/agentic_runner/workers/fastapi_client.py +0 -0
  72. {agentic_runner-3.16.0 → agentic_runner-3.16.2}/src/agentic_runner/workers/harness_outcome.py +0 -0
  73. {agentic_runner-3.16.0 → agentic_runner-3.16.2}/src/agentic_runner/workers/harness_usage.py +0 -0
  74. {agentic_runner-3.16.0 → agentic_runner-3.16.2}/src/agentic_runner/workers/mcp_config.py +0 -0
  75. {agentic_runner-3.16.0 → agentic_runner-3.16.2}/src/agentic_runner/workers/skills.py +0 -0
  76. {agentic_runner-3.16.0 → agentic_runner-3.16.2}/src/agentic_runner/workstation.py +0 -0
@@ -1,11 +1,11 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: agentic-runner
3
- Version: 3.16.0
3
+ Version: 3.16.2
4
4
  Summary: The Agentic OS Runner: an activity-only Temporal executor for workspaces, Agent Runtimes and verb seams
5
5
  License-Expression: AGPL-3.0-only
6
6
  License-File: LICENSE
7
7
  Requires-Python: >=3.12
8
- Requires-Dist: agentic-runner-contracts==3.16.0
8
+ Requires-Dist: agentic-runner-contracts==3.16.2
9
9
  Requires-Dist: cryptography<51,>=50
10
10
  Requires-Dist: httpx<1.0,>=0.27
11
11
  Requires-Dist: pydantic-settings<3.0,>=2.0
@@ -10,7 +10,7 @@ dependencies = [
10
10
  # Exactly this release's contracts: the two ship as one version, and an unpinned
11
11
  # requirement let `uv tool upgrade` keep an older contracts wheel the Runner cannot
12
12
  # import from (QTS-1473). `scripts/set-version.py` moves it with the version.
13
- "agentic-runner-contracts==3.16.0",
13
+ "agentic-runner-contracts==3.16.2",
14
14
  # Imported directly by `registration.py` (the Ed25519 identity that signs every
15
15
  # heartbeat); already present transitively through pyjwt[crypto], declared because
16
16
  # we import it.
@@ -7,6 +7,6 @@ stay on the platform; this package imports none of them, and a CI partition test
7
7
  (``tests/test_package_partition.py``) fails the build if that changes.
8
8
  """
9
9
 
10
- __version__ = "3.16.0"
10
+ __version__ = "3.16.2"
11
11
 
12
12
  __all__ = ["__version__"]
@@ -1490,6 +1490,7 @@ def _persona_instructions_hash(instructions: str) -> str | None:
1490
1490
  def _codex_evidence_payload(
1491
1491
  codex_result: DirectiveResult,
1492
1492
  *,
1493
+ cli_kind: str,
1493
1494
  persona_slug: str | None = None,
1494
1495
  persona_instructions: str = "",
1495
1496
  prompt_notes: list[str] | None = None,
@@ -1517,6 +1518,7 @@ def _codex_evidence_payload(
1517
1518
  ),
1518
1519
  "command_hash": codex_result.command_hash,
1519
1520
  # What ran, which the Agent's configuration alone does not prove (ADR-0021).
1521
+ "cli_kind": cli_kind,
1520
1522
  "model": codex_result.model or None,
1521
1523
  "workspace": asdict(codex_result.evidence),
1522
1524
  "persona_slug": persona_slug,
@@ -2145,6 +2147,7 @@ class RunnerRalphActivities:
2145
2147
  source="ralph.codex_run",
2146
2148
  payload=_codex_evidence_payload(
2147
2149
  codex_result,
2150
+ cli_kind=runtime_state.cli_kind,
2148
2151
  persona_slug=runtime_state.persona_slug,
2149
2152
  persona_instructions=runtime_state.persona_instructions,
2150
2153
  prompt_notes=prompt_notes,
@@ -5352,6 +5355,7 @@ class RunnerRalphActivities:
5352
5355
  "agent_id": state.agent_id,
5353
5356
  **_codex_evidence_payload(
5354
5357
  codex_result,
5358
+ cli_kind=state.cli_kind,
5355
5359
  persona_slug=state.persona_slug,
5356
5360
  persona_instructions=state.persona_instructions,
5357
5361
  prompt_notes=prompt_notes,
@@ -56,16 +56,18 @@ _SECRET_VALUE_PATTERNS: Final[tuple[re.Pattern[str], ...]] = (
56
56
  class ClaudeRuntime(ResumableAgentRuntime):
57
57
  """Worker-local Claude Code CLI runtime.
58
58
 
59
- Authenticates with an API key (``ANTHROPIC_API_KEY``) rather than a device-login session,
60
- so an unattended Persona can run without an expiring browser session (ADR-0006). Like the
61
- Codex runtime it confines execution to the supplied workspace, refuses fail-closed unless the
62
- autonomous-permission guard is configured, and returns bounded, redacted evidence safe for
63
- control-plane storage — the API key never appears in returned text.
59
+ Runs against the attempt's LLM proxy endpoint rather than a device-login session, so an
60
+ unattended Persona can run without an expiring browser session (ADR-0006), and the
61
+ subprocess holds only the attempt's bearer, never a provider key (QTS-1520). Like the
62
+ Codex runtime it confines execution to the supplied workspace, refuses fail-closed unless
63
+ the autonomous-permission guard is configured or the proxy endpoint is missing, and
64
+ returns bounded, redacted evidence safe for control-plane storage.
64
65
  """
65
66
 
66
- # Subscription mode for Claude Code is local-agents 07; until then a user-hosted Runner
67
- # with no key runs it on the host operator's key, as before.
67
+ # Subscription mode for Claude Code is local-agents 07; until then a Contract with no
68
+ # delivered key has nothing this runtime may run on.
68
69
  auth_modes = frozenset({AuthMode.API_KEY})
70
+ host_api_key = False
69
71
 
70
72
  def __init__(
71
73
  self,
@@ -75,7 +77,6 @@ class ClaudeRuntime(ResumableAgentRuntime):
75
77
  ) -> None:
76
78
  self._settings = settings
77
79
  self._runner = runner or run_subprocess_exec
78
- self.host_api_key = bool(settings.ANTHROPIC_API_KEY)
79
80
 
80
81
  def capabilities(self) -> RuntimeCapabilities:
81
82
  return RuntimeCapabilities(
@@ -102,6 +103,17 @@ class ClaudeRuntime(ResumableAgentRuntime):
102
103
  work_branch=request.work_branch,
103
104
  evidence_limit_bytes=self._settings.CLAUDE_CLI_OUTPUT_LIMIT_BYTES,
104
105
  )
106
+ if not dict(request.extra_env).get("ANTHROPIC_BASE_URL"):
107
+ # The proxy pair is the only credential this runtime hands the harness; without
108
+ # it the harness would fall back to whatever login or key it finds itself.
109
+ return _refused_result(
110
+ workspace_id=directive_workspace_id,
111
+ base_branch=request.base_branch,
112
+ work_branch=request.work_branch,
113
+ evidence_limit_bytes=self._settings.CLAUDE_CLI_OUTPUT_LIMIT_BYTES,
114
+ guard_mode="refused: api_key mode without an LLM proxy endpoint",
115
+ error="an api_key Claude Code Directive needs the attempt's LLM proxy endpoint",
116
+ )
105
117
 
106
118
  model = request.model or self._settings.CLAUDE_MODEL
107
119
  argv = _claude_argv(model)
@@ -140,7 +152,7 @@ class ClaudeRuntime(ResumableAgentRuntime):
140
152
  )
141
153
  # Per-Contract CLAUDE_CONFIG_DIR, never a fleet-wide one (ADR-0015 §4).
142
154
  sandbox = request.sandbox
143
- env = {"ANTHROPIC_API_KEY": self._settings.ANTHROPIC_API_KEY}
155
+ env: dict[str, str] = {}
144
156
  if sandbox is not None:
145
157
  env["CLAUDE_CONFIG_DIR"] = str(sandbox.harness_config_dir)
146
158
  env["HOME"] = str(sandbox.home_dir)
@@ -207,7 +219,7 @@ class ClaudeRuntime(ResumableAgentRuntime):
207
219
 
208
220
 
209
221
  def _guard_mode(settings: WorkerSettings) -> str | None:
210
- if settings.ANTHROPIC_API_KEY and settings.CLAUDE_DANGEROUSLY_SKIP_PERMISSIONS:
222
+ if settings.CLAUDE_DANGEROUSLY_SKIP_PERMISSIONS:
211
223
  return "auth=api-key; permission=skip-in-sandbox; output=json"
212
224
  return None
213
225
 
@@ -231,10 +243,9 @@ def _refused_result(
231
243
  base_branch: str,
232
244
  work_branch: str,
233
245
  evidence_limit_bytes: int,
234
- guard_mode: str = "refused: missing API key or autonomous permission configuration",
246
+ guard_mode: str = "refused: missing autonomous permission configuration",
235
247
  error: str = (
236
- "Claude Code API key and autonomous permission configuration are required "
237
- "before worker-local execution"
248
+ "Claude Code autonomous permission configuration is required before worker-local execution"
238
249
  ),
239
250
  ) -> DirectiveResult:
240
251
  command_hash = hash_command(["claude", "refused"])
@@ -115,10 +115,6 @@ class WorkerSettings(BaseSettings):
115
115
  default=False,
116
116
  description="Worker assertion that Codex policy hook or permission profile is configured",
117
117
  )
118
- ANTHROPIC_API_KEY: str = Field(
119
- default="",
120
- description="Claude Code runtime API key (api_key auth model; redacted from evidence)",
121
- )
122
118
  CLAUDE_MODEL: str = Field(
123
119
  default="claude-opus-4-8",
124
120
  description="Model id the Claude Code runtime runs with",
File without changes