agentic-runner 3.30.0__tar.gz → 3.30.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 (81) hide show
  1. {agentic_runner-3.30.0 → agentic_runner-3.30.2}/PKG-INFO +2 -2
  2. {agentic_runner-3.30.0 → agentic_runner-3.30.2}/pyproject.toml +1 -1
  3. {agentic_runner-3.30.0 → agentic_runner-3.30.2}/src/agentic_runner/__init__.py +1 -1
  4. {agentic_runner-3.30.0 → agentic_runner-3.30.2}/src/agentic_runner/auth_mode.py +3 -2
  5. {agentic_runner-3.30.0 → agentic_runner-3.30.2}/src/agentic_runner/cli.py +6 -3
  6. {agentic_runner-3.30.0 → agentic_runner-3.30.2}/src/agentic_runner/service.py +2 -2
  7. {agentic_runner-3.30.0 → agentic_runner-3.30.2}/src/agentic_runner/sign_in.py +8 -15
  8. {agentic_runner-3.30.0 → agentic_runner-3.30.2}/src/agentic_runner/skills/agentic-runner-setup/SKILL.md +1 -1
  9. {agentic_runner-3.30.0 → agentic_runner-3.30.2}/src/agentic_runner/workstation.py +7 -3
  10. {agentic_runner-3.30.0 → agentic_runner-3.30.2}/.gitignore +0 -0
  11. {agentic_runner-3.30.0 → agentic_runner-3.30.2}/LICENSE +0 -0
  12. {agentic_runner-3.30.0 → agentic_runner-3.30.2}/README.md +0 -0
  13. {agentic_runner-3.30.0 → agentic_runner-3.30.2}/src/agentic_runner/activities.py +0 -0
  14. {agentic_runner-3.30.0 → agentic_runner-3.30.2}/src/agentic_runner/attempts.py +0 -0
  15. {agentic_runner-3.30.0 → agentic_runner-3.30.2}/src/agentic_runner/build.py +0 -0
  16. {agentic_runner-3.30.0 → agentic_runner-3.30.2}/src/agentic_runner/callback.py +0 -0
  17. {agentic_runner-3.30.0 → agentic_runner-3.30.2}/src/agentic_runner/child_watcher.py +0 -0
  18. {agentic_runner-3.30.0 → agentic_runner-3.30.2}/src/agentic_runner/cli_floor.py +0 -0
  19. {agentic_runner-3.30.0 → agentic_runner-3.30.2}/src/agentic_runner/config.py +0 -0
  20. {agentic_runner-3.30.0 → agentic_runner-3.30.2}/src/agentic_runner/credentials.py +0 -0
  21. {agentic_runner-3.30.0 → agentic_runner-3.30.2}/src/agentic_runner/egress.py +0 -0
  22. {agentic_runner-3.30.0 → agentic_runner-3.30.2}/src/agentic_runner/harness_self_test.py +0 -0
  23. {agentic_runner-3.30.0 → agentic_runner-3.30.2}/src/agentic_runner/heartbeat_link.py +0 -0
  24. {agentic_runner-3.30.0 → agentic_runner-3.30.2}/src/agentic_runner/hooks.py +0 -0
  25. {agentic_runner-3.30.0 → agentic_runner-3.30.2}/src/agentic_runner/host_store.py +0 -0
  26. {agentic_runner-3.30.0 → agentic_runner-3.30.2}/src/agentic_runner/integrations/__init__.py +0 -0
  27. {agentic_runner-3.30.0 → agentic_runner-3.30.2}/src/agentic_runner/integrations/git/__init__.py +0 -0
  28. {agentic_runner-3.30.0 → agentic_runner-3.30.2}/src/agentic_runner/integrations/git/contracts.py +0 -0
  29. {agentic_runner-3.30.0 → agentic_runner-3.30.2}/src/agentic_runner/integrations/git/evidence.py +0 -0
  30. {agentic_runner-3.30.0 → agentic_runner-3.30.2}/src/agentic_runner/integrations/git/fake_workspace.py +0 -0
  31. {agentic_runner-3.30.0 → agentic_runner-3.30.2}/src/agentic_runner/integrations/git/workspace.py +0 -0
  32. {agentic_runner-3.30.0 → agentic_runner-3.30.2}/src/agentic_runner/integrations/github/__init__.py +0 -0
  33. {agentic_runner-3.30.0 → agentic_runner-3.30.2}/src/agentic_runner/integrations/github/auth.py +0 -0
  34. {agentic_runner-3.30.0 → agentic_runner-3.30.2}/src/agentic_runner/integrations/github/fake_client.py +0 -0
  35. {agentic_runner-3.30.0 → agentic_runner-3.30.2}/src/agentic_runner/integrations/github/gh_client.py +0 -0
  36. {agentic_runner-3.30.0 → agentic_runner-3.30.2}/src/agentic_runner/integrations/oauth/__init__.py +0 -0
  37. {agentic_runner-3.30.0 → agentic_runner-3.30.2}/src/agentic_runner/integrations/oauth/fake_provider.py +0 -0
  38. {agentic_runner-3.30.0 → agentic_runner-3.30.2}/src/agentic_runner/launch.py +0 -0
  39. {agentic_runner-3.30.0 → agentic_runner-3.30.2}/src/agentic_runner/lifecycle.py +0 -0
  40. {agentic_runner-3.30.0 → agentic_runner-3.30.2}/src/agentic_runner/llm_contracts.py +0 -0
  41. {agentic_runner-3.30.0 → agentic_runner-3.30.2}/src/agentic_runner/llm_proxy.py +0 -0
  42. {agentic_runner-3.30.0 → agentic_runner-3.30.2}/src/agentic_runner/mcp.py +0 -0
  43. {agentic_runner-3.30.0 → agentic_runner-3.30.2}/src/agentic_runner/message_store.py +0 -0
  44. {agentic_runner-3.30.0 → agentic_runner-3.30.2}/src/agentic_runner/oauth_connectors.py +0 -0
  45. {agentic_runner-3.30.0 → agentic_runner-3.30.2}/src/agentic_runner/organisation_name.py +0 -0
  46. {agentic_runner-3.30.0 → agentic_runner-3.30.2}/src/agentic_runner/pool_key.py +0 -0
  47. {agentic_runner-3.30.0 → agentic_runner-3.30.2}/src/agentic_runner/private_state.py +0 -0
  48. {agentic_runner-3.30.0 → agentic_runner-3.30.2}/src/agentic_runner/py.typed +0 -0
  49. {agentic_runner-3.30.0 → agentic_runner-3.30.2}/src/agentic_runner/recipient_key_secret.py +0 -0
  50. {agentic_runner-3.30.0 → agentic_runner-3.30.2}/src/agentic_runner/registration.py +0 -0
  51. {agentic_runner-3.30.0 → agentic_runner-3.30.2}/src/agentic_runner/runner_limit.py +0 -0
  52. {agentic_runner-3.30.0 → agentic_runner-3.30.2}/src/agentic_runner/runtime/__init__.py +0 -0
  53. {agentic_runner-3.30.0 → agentic_runner-3.30.2}/src/agentic_runner/runtime/verifier_command.py +0 -0
  54. {agentic_runner-3.30.0 → agentic_runner-3.30.2}/src/agentic_runner/sealed_box.py +0 -0
  55. {agentic_runner-3.30.0 → agentic_runner-3.30.2}/src/agentic_runner/skill.py +0 -0
  56. {agentic_runner-3.30.0 → agentic_runner-3.30.2}/src/agentic_runner/testing/__init__.py +0 -0
  57. {agentic_runner-3.30.0 → agentic_runner-3.30.2}/src/agentic_runner/testing/__main__.py +0 -0
  58. {agentic_runner-3.30.0 → agentic_runner-3.30.2}/src/agentic_runner/testing/control_plane.py +0 -0
  59. {agentic_runner-3.30.0 → agentic_runner-3.30.2}/src/agentic_runner/testing/plugin.py +0 -0
  60. {agentic_runner-3.30.0 → agentic_runner-3.30.2}/src/agentic_runner/testing/test_conformance.py +0 -0
  61. {agentic_runner-3.30.0 → agentic_runner-3.30.2}/src/agentic_runner/testing/workflow.py +0 -0
  62. {agentic_runner-3.30.0 → agentic_runner-3.30.2}/src/agentic_runner/tiny_http.py +0 -0
  63. {agentic_runner-3.30.0 → agentic_runner-3.30.2}/src/agentic_runner/triage_activities.py +0 -0
  64. {agentic_runner-3.30.0 → agentic_runner-3.30.2}/src/agentic_runner/usage_windows.py +0 -0
  65. {agentic_runner-3.30.0 → agentic_runner-3.30.2}/src/agentic_runner/user_sources.py +0 -0
  66. {agentic_runner-3.30.0 → agentic_runner-3.30.2}/src/agentic_runner/workers/__init__.py +0 -0
  67. {agentic_runner-3.30.0 → agentic_runner-3.30.2}/src/agentic_runner/workers/_runtime_support.py +0 -0
  68. {agentic_runner-3.30.0 → agentic_runner-3.30.2}/src/agentic_runner/workers/acp_runtime.py +0 -0
  69. {agentic_runner-3.30.0 → agentic_runner-3.30.2}/src/agentic_runner/workers/agent_runtime.py +0 -0
  70. {agentic_runner-3.30.0 → agentic_runner-3.30.2}/src/agentic_runner/workers/claude_runtime.py +0 -0
  71. {agentic_runner-3.30.0 → agentic_runner-3.30.2}/src/agentic_runner/workers/claude_sign_in.py +0 -0
  72. {agentic_runner-3.30.0 → agentic_runner-3.30.2}/src/agentic_runner/workers/codex_runtime.py +0 -0
  73. {agentic_runner-3.30.0 → agentic_runner-3.30.2}/src/agentic_runner/workers/command_policy.py +0 -0
  74. {agentic_runner-3.30.0 → agentic_runner-3.30.2}/src/agentic_runner/workers/contract_isolation.py +0 -0
  75. {agentic_runner-3.30.0 → agentic_runner-3.30.2}/src/agentic_runner/workers/fastapi_client.py +0 -0
  76. {agentic_runner-3.30.0 → agentic_runner-3.30.2}/src/agentic_runner/workers/harness_logins.py +0 -0
  77. {agentic_runner-3.30.0 → agentic_runner-3.30.2}/src/agentic_runner/workers/harness_outcome.py +0 -0
  78. {agentic_runner-3.30.0 → agentic_runner-3.30.2}/src/agentic_runner/workers/harness_usage.py +0 -0
  79. {agentic_runner-3.30.0 → agentic_runner-3.30.2}/src/agentic_runner/workers/mcp_config.py +0 -0
  80. {agentic_runner-3.30.0 → agentic_runner-3.30.2}/src/agentic_runner/workers/settings.py +0 -0
  81. {agentic_runner-3.30.0 → agentic_runner-3.30.2}/src/agentic_runner/workers/skills.py +0 -0
@@ -1,11 +1,11 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: agentic-runner
3
- Version: 3.30.0
3
+ Version: 3.30.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.30.0
8
+ Requires-Dist: agentic-runner-contracts==3.30.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.30.0",
13
+ "agentic-runner-contracts==3.30.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.30.0"
10
+ __version__ = "3.30.2"
11
11
 
12
12
  __all__ = ["__version__"]
@@ -142,7 +142,7 @@ def choose_auth_mode(
142
142
  raise AuthModeRefusedError(
143
143
  SUBSCRIPTION_NEEDS_HARNESS_LOGIN_RULE,
144
144
  "no API key is present for this Contract and its harness root on this Runner holds "
145
- "no login; sign it in on this Runner with `agentic-runner sign-in`",
145
+ "no login; sign it in on this Runner with `agentic-runner sign-in claude` (or `codex`)",
146
146
  )
147
147
  if AuthMode.SUBSCRIPTION not in runtime_modes:
148
148
  raise AuthModeRefusedError(
@@ -216,7 +216,8 @@ def require_named_access(
216
216
  raise AuthModeRefusedError(
217
217
  SUBSCRIPTION_NOT_SIGNED_IN_RULE,
218
218
  f"this Directive was routed to the person's subscription, and its sign-in on "
219
- f"this Runner is {subscription.value}; run `agentic-runner sign-in` here",
219
+ f"this Runner is {subscription.value}; run `agentic-runner sign-in claude` (or "
220
+ "`codex`) here",
220
221
  )
221
222
  return AuthMode.SUBSCRIPTION
222
223
  if access.kind == LlmAccessKind.LLM_KEY:
@@ -16,7 +16,7 @@ workstation Runner (PRD issue 47, ``workstation.py``): one login agent per Runne
16
16
  by the user who hosts it, with no ``sudo`` anywhere. ``<name>`` is the Runner's, the one the
17
17
  console lists it under (QTS-1773); a machine with one Runner needs none (QTS-1774).
18
18
 
19
- ``sign-in [claude|codex]`` gives a person's own Runner their LLM access: their subscription,
19
+ ``sign-in claude|codex`` gives a person's own Runner their LLM access: their subscription,
20
20
  through the vendor's own sign-in in this terminal, or an API key stored in the Runner's
21
21
  own store (``sign_in.py``, Spec: Runners rev 3). No ids, and no code or token passes
22
22
  through the control plane.
@@ -256,12 +256,15 @@ def main(argv: Sequence[str] | None = None) -> int:
256
256
  sign_in = subcommands.add_parser(
257
257
  "sign-in",
258
258
  help="give your own Runner your subscription or an API key, for Claude Code or Codex",
259
+ # The runtime is named, never defaulted: a bare `sign-in` read as a Claude sign-in
260
+ # because Claude Code was asked about first (QTS-2159). Usage lists one form each.
261
+ usage="%(prog)s claude [--method {oauth_token,claude_ai}] [--name NAME]\n"
262
+ " %(prog)s codex [--name NAME]",
259
263
  )
260
264
  sign_in.add_argument(
261
265
  "runtime",
262
- nargs="?",
263
266
  choices=tuple(AGENT_RUNTIMES),
264
- help="one Agent Runtime; omitted asks about each one this Runner serves",
267
+ help="the Agent Runtime to sign in: claude (Claude Code) or codex (Codex)",
265
268
  )
266
269
  sign_in.add_argument(
267
270
  "--method",
@@ -1284,8 +1284,8 @@ def _temporal_worker(client: Client, **kwargs: Any) -> Worker:
1284
1284
  return Worker(client, **kwargs)
1285
1285
 
1286
1286
 
1287
- async def sign_in(which: str | None, *, store: KeyStore, method: str = OAUTH_TOKEN) -> int:
1288
- """``agentic-runner sign-in [claude|codex]`` (``sign_in.SignIn``), composed here.
1287
+ async def sign_in(which: str, *, store: KeyStore, method: str = OAUTH_TOKEN) -> int:
1288
+ """``agentic-runner sign-in claude|codex`` (``sign_in.SignIn``), composed here.
1289
1289
 
1290
1290
  Runs with the Runner's environment (``kubectl exec``, ``docker exec``, or a
1291
1291
  workstation's own), so a subscription gets the uid and the harness root the Contract's
@@ -1,9 +1,10 @@
1
- """``agentic-runner sign-in [claude|codex]``: a person gives their own Runner its LLM access.
1
+ """``agentic-runner sign-in claude|codex``: a person gives their own Runner its LLM access.
2
2
 
3
3
  One command for Claude Code and Codex, for a subscription or an API key, on a laptop, in
4
4
  ``docker exec -it`` or in ``kubectl exec -it`` (Spec: Runners rev 3). It takes no ids: a
5
5
  personal Runner serves one Contract, which the last heartbeat ack named
6
- (``llm_contracts``). With no argument it asks about each Agent Runtime the Runner serves.
6
+ (``llm_contracts``). It names the one Agent Runtime it signs in: a bare ``sign-in`` read as
7
+ a Claude Code sign-in, so the console script refuses it (QTS-2159).
7
8
 
8
9
  * **An API key** is read without echo and stored in the Runner's own store under the
9
10
  provider's key name (``ANTHROPIC_API_KEY``, ``OPENAI_API_KEY``). The running Runner reads
@@ -66,7 +67,7 @@ class SignIn:
66
67
  secret: Callable[[str], str]
67
68
  say: Callable[[str], None]
68
69
 
69
- async def run(self, which: str | None) -> int:
70
+ async def run(self, which: str) -> int:
70
71
  if self.host_party != "user":
71
72
  hosted = f"hosted by {self.host_party!r}" if self.host_party else "not registered"
72
73
  self.say(
@@ -74,22 +75,14 @@ class SignIn:
74
75
  "Runner their access; a pool Runner uses only its pool's keys"
75
76
  )
76
77
  return 1
77
- kinds = [AGENT_RUNTIMES[which]] if which is not None else sorted(self.served)
78
- missing = [kind for kind in kinds if kind not in self.served]
79
- if missing:
78
+ kind = AGENT_RUNTIMES[which]
79
+ if kind not in self.served:
80
80
  self.say(
81
- f"refusing to sign in: this Runner does not serve {_LABELS[missing[0]]}; "
81
+ f"refusing to sign in: this Runner does not serve {_LABELS[kind]}; "
82
82
  "install its CLI on this Runner's PATH and restart it"
83
83
  )
84
84
  return 1
85
- if not kinds:
86
- self.say("this Runner serves no Agent Runtime: install `claude` or `codex` first")
87
- return 1
88
- for kind in kinds:
89
- outcome = await self._one(kind)
90
- if outcome != 0:
91
- return outcome
92
- return 0
85
+ return await self._one(kind)
93
86
 
94
87
  async def _one(self, cli_kind: str) -> int:
95
88
  label = _LABELS[cli_kind]
@@ -115,7 +115,7 @@ own terminal, the one command for their way of installing. On this machine:
115
115
  agentic-runner sign-in claude
116
116
  ```
117
117
 
118
- `codex` in place of `claude` for Codex; with no argument it asks about each. Add
118
+ `codex` in place of `claude` for Codex; `sign-in` alone is refused. Add
119
119
  `--name <name>` only if this machine runs more than one Runner. On Docker it is
120
120
  `docker exec -it <container> agentic-runner sign-in claude`, on Kubernetes
121
121
  `kubectl exec -it <pod> -c runner -- agentic-runner sign-in claude`.
@@ -81,6 +81,7 @@ from agentic_runner_contracts.runner_registration import (
81
81
  __all__ = [
82
82
  "CLI_FLOORS",
83
83
  "CLI_NAMES",
84
+ "DRAIN_TIMEOUT_SECONDS",
84
85
  "ROOT_ENV",
85
86
  "CliMissingError",
86
87
  "RunnerPaths",
@@ -111,6 +112,10 @@ __all__ = [
111
112
  ROOT_ENV: Final = "AGENTIC_RUNNER_WORKSTATION_ROOT"
112
113
 
113
114
  _LABEL_PREFIX: Final = "agentic-runner"
115
+ # The drain waits out an in-flight Directive (issue 02), as the chart's
116
+ # terminationGracePeriodSeconds does. Without it the service manager SIGKILLs the drain:
117
+ # systemd after 90 s, launchd after 20 s (QTS-2166).
118
+ DRAIN_TIMEOUT_SECONDS: Final = 2100
114
119
 
115
120
  Run = Callable[..., subprocess.CompletedProcess[str]]
116
121
 
@@ -507,6 +512,7 @@ def _launch_agent(
507
512
  "RunAtLoad": True,
508
513
  # Restart a crash, not a clean `stop`: SIGTERM drains and exits 0.
509
514
  "KeepAlive": {"SuccessfulExit": False},
515
+ "ExitTimeOut": DRAIN_TIMEOUT_SECONDS,
510
516
  "ProcessType": "Background",
511
517
  "StandardOutPath": str(paths.log),
512
518
  "StandardErrorPath": str(paths.log),
@@ -544,9 +550,7 @@ def _systemd_user_unit(
544
550
  f"Environment={_systemd_quote('PATH=' + settings.path)}\n"
545
551
  "Restart=on-failure\n"
546
552
  "RestartSec=10\n"
547
- # The drain waits out an in-flight Directive (issue 02); systemd's default 90 s
548
- # would SIGKILL it.
549
- "TimeoutStopSec=2100\n"
553
+ f"TimeoutStopSec={DRAIN_TIMEOUT_SECONDS}\n"
550
554
  "KillMode=mixed\n\n"
551
555
  "[Install]\n"
552
556
  "WantedBy=default.target\n"
File without changes