agentic-runner 3.18.1__tar.gz → 3.18.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 (77) hide show
  1. {agentic_runner-3.18.1 → agentic_runner-3.18.2}/PKG-INFO +2 -2
  2. {agentic_runner-3.18.1 → agentic_runner-3.18.2}/pyproject.toml +1 -1
  3. {agentic_runner-3.18.1 → agentic_runner-3.18.2}/src/agentic_runner/__init__.py +1 -1
  4. {agentic_runner-3.18.1 → agentic_runner-3.18.2}/src/agentic_runner/cli.py +10 -45
  5. {agentic_runner-3.18.1 → agentic_runner-3.18.2}/src/agentic_runner/workstation.py +0 -47
  6. {agentic_runner-3.18.1 → agentic_runner-3.18.2}/.gitignore +0 -0
  7. {agentic_runner-3.18.1 → agentic_runner-3.18.2}/LICENSE +0 -0
  8. {agentic_runner-3.18.1 → agentic_runner-3.18.2}/README.md +0 -0
  9. {agentic_runner-3.18.1 → agentic_runner-3.18.2}/src/agentic_runner/activities.py +0 -0
  10. {agentic_runner-3.18.1 → agentic_runner-3.18.2}/src/agentic_runner/attempts.py +0 -0
  11. {agentic_runner-3.18.1 → agentic_runner-3.18.2}/src/agentic_runner/auth_mode.py +0 -0
  12. {agentic_runner-3.18.1 → agentic_runner-3.18.2}/src/agentic_runner/build.py +0 -0
  13. {agentic_runner-3.18.1 → agentic_runner-3.18.2}/src/agentic_runner/callback.py +0 -0
  14. {agentic_runner-3.18.1 → agentic_runner-3.18.2}/src/agentic_runner/child_watcher.py +0 -0
  15. {agentic_runner-3.18.1 → agentic_runner-3.18.2}/src/agentic_runner/cli_floor.py +0 -0
  16. {agentic_runner-3.18.1 → agentic_runner-3.18.2}/src/agentic_runner/config.py +0 -0
  17. {agentic_runner-3.18.1 → agentic_runner-3.18.2}/src/agentic_runner/credentials.py +0 -0
  18. {agentic_runner-3.18.1 → agentic_runner-3.18.2}/src/agentic_runner/device_login_activities.py +0 -0
  19. {agentic_runner-3.18.1 → agentic_runner-3.18.2}/src/agentic_runner/egress.py +0 -0
  20. {agentic_runner-3.18.1 → agentic_runner-3.18.2}/src/agentic_runner/harness_self_test.py +0 -0
  21. {agentic_runner-3.18.1 → agentic_runner-3.18.2}/src/agentic_runner/heartbeat_link.py +0 -0
  22. {agentic_runner-3.18.1 → agentic_runner-3.18.2}/src/agentic_runner/hooks.py +0 -0
  23. {agentic_runner-3.18.1 → agentic_runner-3.18.2}/src/agentic_runner/host_store.py +0 -0
  24. {agentic_runner-3.18.1 → agentic_runner-3.18.2}/src/agentic_runner/integrations/__init__.py +0 -0
  25. {agentic_runner-3.18.1 → agentic_runner-3.18.2}/src/agentic_runner/integrations/git/__init__.py +0 -0
  26. {agentic_runner-3.18.1 → agentic_runner-3.18.2}/src/agentic_runner/integrations/git/contracts.py +0 -0
  27. {agentic_runner-3.18.1 → agentic_runner-3.18.2}/src/agentic_runner/integrations/git/evidence.py +0 -0
  28. {agentic_runner-3.18.1 → agentic_runner-3.18.2}/src/agentic_runner/integrations/git/fake_workspace.py +0 -0
  29. {agentic_runner-3.18.1 → agentic_runner-3.18.2}/src/agentic_runner/integrations/git/workspace.py +0 -0
  30. {agentic_runner-3.18.1 → agentic_runner-3.18.2}/src/agentic_runner/integrations/github/__init__.py +0 -0
  31. {agentic_runner-3.18.1 → agentic_runner-3.18.2}/src/agentic_runner/integrations/github/auth.py +0 -0
  32. {agentic_runner-3.18.1 → agentic_runner-3.18.2}/src/agentic_runner/integrations/github/fake_client.py +0 -0
  33. {agentic_runner-3.18.1 → agentic_runner-3.18.2}/src/agentic_runner/integrations/github/gh_client.py +0 -0
  34. {agentic_runner-3.18.1 → agentic_runner-3.18.2}/src/agentic_runner/integrations/oauth/__init__.py +0 -0
  35. {agentic_runner-3.18.1 → agentic_runner-3.18.2}/src/agentic_runner/integrations/oauth/fake_provider.py +0 -0
  36. {agentic_runner-3.18.1 → agentic_runner-3.18.2}/src/agentic_runner/launch.py +0 -0
  37. {agentic_runner-3.18.1 → agentic_runner-3.18.2}/src/agentic_runner/lifecycle.py +0 -0
  38. {agentic_runner-3.18.1 → agentic_runner-3.18.2}/src/agentic_runner/llm_proxy.py +0 -0
  39. {agentic_runner-3.18.1 → agentic_runner-3.18.2}/src/agentic_runner/mcp.py +0 -0
  40. {agentic_runner-3.18.1 → agentic_runner-3.18.2}/src/agentic_runner/message_store.py +0 -0
  41. {agentic_runner-3.18.1 → agentic_runner-3.18.2}/src/agentic_runner/oauth_connectors.py +0 -0
  42. {agentic_runner-3.18.1 → agentic_runner-3.18.2}/src/agentic_runner/private_state.py +0 -0
  43. {agentic_runner-3.18.1 → agentic_runner-3.18.2}/src/agentic_runner/py.typed +0 -0
  44. {agentic_runner-3.18.1 → agentic_runner-3.18.2}/src/agentic_runner/recipient_key_secret.py +0 -0
  45. {agentic_runner-3.18.1 → agentic_runner-3.18.2}/src/agentic_runner/registration.py +0 -0
  46. {agentic_runner-3.18.1 → agentic_runner-3.18.2}/src/agentic_runner/runtime/__init__.py +0 -0
  47. {agentic_runner-3.18.1 → agentic_runner-3.18.2}/src/agentic_runner/runtime/verifier_command.py +0 -0
  48. {agentic_runner-3.18.1 → agentic_runner-3.18.2}/src/agentic_runner/sealed_box.py +0 -0
  49. {agentic_runner-3.18.1 → agentic_runner-3.18.2}/src/agentic_runner/service.py +0 -0
  50. {agentic_runner-3.18.1 → agentic_runner-3.18.2}/src/agentic_runner/skill.py +0 -0
  51. {agentic_runner-3.18.1 → agentic_runner-3.18.2}/src/agentic_runner/skills/agentic-runner-setup/SKILL.md +0 -0
  52. {agentic_runner-3.18.1 → agentic_runner-3.18.2}/src/agentic_runner/testing/__init__.py +0 -0
  53. {agentic_runner-3.18.1 → agentic_runner-3.18.2}/src/agentic_runner/testing/__main__.py +0 -0
  54. {agentic_runner-3.18.1 → agentic_runner-3.18.2}/src/agentic_runner/testing/control_plane.py +0 -0
  55. {agentic_runner-3.18.1 → agentic_runner-3.18.2}/src/agentic_runner/testing/plugin.py +0 -0
  56. {agentic_runner-3.18.1 → agentic_runner-3.18.2}/src/agentic_runner/testing/test_conformance.py +0 -0
  57. {agentic_runner-3.18.1 → agentic_runner-3.18.2}/src/agentic_runner/testing/workflow.py +0 -0
  58. {agentic_runner-3.18.1 → agentic_runner-3.18.2}/src/agentic_runner/tiny_http.py +0 -0
  59. {agentic_runner-3.18.1 → agentic_runner-3.18.2}/src/agentic_runner/triage_activities.py +0 -0
  60. {agentic_runner-3.18.1 → agentic_runner-3.18.2}/src/agentic_runner/usage_windows.py +0 -0
  61. {agentic_runner-3.18.1 → agentic_runner-3.18.2}/src/agentic_runner/user_sources.py +0 -0
  62. {agentic_runner-3.18.1 → agentic_runner-3.18.2}/src/agentic_runner/workers/__init__.py +0 -0
  63. {agentic_runner-3.18.1 → agentic_runner-3.18.2}/src/agentic_runner/workers/_runtime_support.py +0 -0
  64. {agentic_runner-3.18.1 → agentic_runner-3.18.2}/src/agentic_runner/workers/acp_runtime.py +0 -0
  65. {agentic_runner-3.18.1 → agentic_runner-3.18.2}/src/agentic_runner/workers/agent_runtime.py +0 -0
  66. {agentic_runner-3.18.1 → agentic_runner-3.18.2}/src/agentic_runner/workers/claude_runtime.py +0 -0
  67. {agentic_runner-3.18.1 → agentic_runner-3.18.2}/src/agentic_runner/workers/claude_sign_in.py +0 -0
  68. {agentic_runner-3.18.1 → agentic_runner-3.18.2}/src/agentic_runner/workers/codex_runtime.py +0 -0
  69. {agentic_runner-3.18.1 → agentic_runner-3.18.2}/src/agentic_runner/workers/command_policy.py +0 -0
  70. {agentic_runner-3.18.1 → agentic_runner-3.18.2}/src/agentic_runner/workers/contract_device_login.py +0 -0
  71. {agentic_runner-3.18.1 → agentic_runner-3.18.2}/src/agentic_runner/workers/contract_isolation.py +0 -0
  72. {agentic_runner-3.18.1 → agentic_runner-3.18.2}/src/agentic_runner/workers/fastapi_client.py +0 -0
  73. {agentic_runner-3.18.1 → agentic_runner-3.18.2}/src/agentic_runner/workers/harness_outcome.py +0 -0
  74. {agentic_runner-3.18.1 → agentic_runner-3.18.2}/src/agentic_runner/workers/harness_usage.py +0 -0
  75. {agentic_runner-3.18.1 → agentic_runner-3.18.2}/src/agentic_runner/workers/mcp_config.py +0 -0
  76. {agentic_runner-3.18.1 → agentic_runner-3.18.2}/src/agentic_runner/workers/settings.py +0 -0
  77. {agentic_runner-3.18.1 → agentic_runner-3.18.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.18.1
3
+ Version: 3.18.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.18.1
8
+ Requires-Dist: agentic-runner-contracts==3.18.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.18.1",
13
+ "agentic-runner-contracts==3.18.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.18.1"
10
+ __version__ = "3.18.2"
11
11
 
12
12
  __all__ = ["__version__"]
@@ -13,8 +13,7 @@ the Organisation's cap.
13
13
 
14
14
  ``install | start | stop | status <org>`` and ``credential set`` are the workstation
15
15
  Runner (PRD issue 47, ``workstation.py``): one login agent per Organisation, managed by
16
- the user who hosts it, with no ``sudo`` anywhere. ``add <name>`` registers another Runner
17
- beside them, reusing their control plane and ``PATH`` (ADR-0022 §21).
16
+ the user who hosts it, with no ``sudo`` anywhere.
18
17
 
19
18
  ``sign-in --contract <id>`` signs one Contract's Claude Code in with Anthropic's own flow,
20
19
  in this terminal, as that Contract's uid in its harness root (QTS-1448). No code or token
@@ -180,21 +179,6 @@ def main(argv: Sequence[str] | None = None) -> int:
180
179
  )
181
180
  install.add_argument("--no-start", action="store_true", help="write the agent, do not start")
182
181
  install.add_argument("--root", default=None, type=Path, help="state root (default per OS)")
183
-
184
- add = subcommands.add_parser(
185
- "add",
186
- help="register another Runner under this install, with its own process, identity "
187
- "and Recipient Key (one per Contract)",
188
- )
189
- add.add_argument("org", metavar="name", help="the new Runner's name on this machine")
190
- add.add_argument(
191
- "--beside",
192
- default=None,
193
- help="the installed Runner whose control plane and PATH to reuse; needed only when "
194
- "the installed Runners talk to different control planes",
195
- )
196
- add.add_argument("--no-start", action="store_true", help="write the agent, do not start")
197
- add.add_argument("--root", default=None, type=Path, help="state root (default per OS)")
198
182
  for service_verb in ("start", "stop"):
199
183
  driven = subcommands.add_parser(
200
184
  service_verb, help=f"{service_verb} one Organisation's login agent"
@@ -328,7 +312,7 @@ def main(argv: Sequence[str] | None = None) -> int:
328
312
  if arguments.org:
329
313
  return workstation.run_process(_org_paths(arguments), login_agent=arguments.login_agent)
330
314
  return asyncio.run(service.run(attestation=_image_attestation()))
331
- if arguments.command in {"install", "add", "start", "stop", "credential"}:
315
+ if arguments.command in {"install", "start", "stop", "credential"}:
332
316
  return _workstation(arguments)
333
317
  if arguments.command == "recipient-key":
334
318
  api, kube_ns = in_cluster()
@@ -375,8 +359,6 @@ def _workstation(arguments: argparse.Namespace) -> int:
375
359
  try:
376
360
  if arguments.command == "install":
377
361
  return _install(arguments, paths)
378
- if arguments.command == "add":
379
- return _add(arguments, paths)
380
362
  if arguments.command == "start":
381
363
  workstation.start(paths)
382
364
  print(f"started {paths.org}")
@@ -440,7 +422,11 @@ def _install(arguments: argparse.Namespace, paths: workstation.OrgPaths) -> int:
440
422
  except ValueError as error:
441
423
  print(str(error), file=sys.stderr)
442
424
  return 2
443
- token = _registration_token()
425
+ # Pasted, never a flag: a flag is in the process table for every uid on the box.
426
+ token = registration_token_from_env() or getpass.getpass(
427
+ "Runner Registration Token (yours from /me/runners, or the Organisation Admin's for "
428
+ "an Organisation Runner): "
429
+ )
444
430
  settings = workstation.WorkstationSettings(
445
431
  org=paths.org,
446
432
  control_plane_url=arguments.control_plane,
@@ -450,19 +436,11 @@ def _install(arguments: argparse.Namespace, paths: workstation.OrgPaths) -> int:
450
436
  install_channel=workstation.install_channel(),
451
437
  acp_cli_kinds=acp_cli_kinds,
452
438
  )
453
- return _register(paths, settings, token, start=not arguments.no_start)
454
-
455
-
456
- def _register(
457
- paths: workstation.OrgPaths,
458
- settings: workstation.WorkstationSettings,
459
- token: str,
460
- *,
461
- start: bool,
462
- ) -> int:
463
439
  try:
464
440
  lines = asyncio.run(
465
- workstation.install(paths, settings, registration_token=token, start_service=start)
441
+ workstation.install(
442
+ paths, settings, registration_token=token, start_service=not arguments.no_start
443
+ )
466
444
  )
467
445
  except (workstation.CliMissingError, RunnerRegistrationError, RuntimeError) as error:
468
446
  print(f"install refused: {error}", file=sys.stderr)
@@ -472,19 +450,6 @@ def _register(
472
450
  return 0
473
451
 
474
452
 
475
- def _add(arguments: argparse.Namespace, paths: workstation.OrgPaths) -> int:
476
- settings = workstation.settings_to_add(paths, beside=arguments.beside)
477
- return _register(paths, settings, _registration_token(), start=not arguments.no_start)
478
-
479
-
480
- def _registration_token() -> str:
481
- # Pasted, never a flag: a flag is in the process table for every uid on the box.
482
- return registration_token_from_env() or getpass.getpass(
483
- "Runner Registration Token (yours from /me/runners, or the Organisation Admin's for "
484
- "an Organisation Runner): "
485
- )
486
-
487
-
488
453
  def _acp_cli_kinds(flag: str | None, paths: workstation.OrgPaths) -> str:
489
454
  # A reinstall to pick up a new PATH or retry a token must not turn ACP off (QTS-1355).
490
455
  if flag is not None:
@@ -7,8 +7,6 @@ precedent does on a developer machine and nothing a daemon would need:
7
7
  identity, namespace, Runner Token, hooks, credential store and Workspaces under
8
8
  ``<root>/<org>/``. A contractor with two clients runs two. There is no supervisor over
9
9
  N Organisations -- that is the "one Runner straddling Organisations" 12 A6 rejected.
10
- ``add <name>`` puts another such process beside them, a personal Runner per Contract
11
- (ADR-0022 §21), named freely rather than after its Organisation.
12
10
  * **A login agent, never a system daemon** (23 item 1): a LaunchAgent in
13
11
  ``~/Library/LaunchAgents`` on macOS, a systemd *user* unit (with linger) on Linux, a
14
12
  per-user logon task on Windows. No ``sudo`` anywhere: the login keychain is unreachable
@@ -83,7 +81,6 @@ __all__ = [
83
81
  "run_environment",
84
82
  "run_process",
85
83
  "service_definition",
86
- "settings_to_add",
87
84
  "start",
88
85
  "status_lines",
89
86
  "stop",
@@ -676,50 +673,6 @@ async def install(
676
673
  return lines
677
674
 
678
675
 
679
- def settings_to_add(paths: OrgPaths, *, beside: str | None) -> WorkstationSettings:
680
- """``add <name>``: what ``install`` registers another Runner with (ADR-0022 §21).
681
-
682
- A personal Runner serves one Contract, so a person with three Contracts runs three. Each
683
- is ``install``'s own process with its own state directory -- identity, Runner Token and
684
- Recipient Key (§37) -- and only the settings an earlier ``install`` was told are copied,
685
- so the command the console shows carries no Temporal address.
686
- """
687
-
688
- # Registered state, not workstation.json: ``install`` saves the settings before it
689
- # registers, so a refused token leaves them behind and the retry must go through.
690
- if load_state(paths.state_dir) is not None:
691
- raise ValueError(
692
- f"{paths.org!r} is already installed under {paths.root}; pick a new name for "
693
- "the Runner you are adding"
694
- )
695
- return _settings_beside(paths.root, beside).model_copy(update={"org": paths.org})
696
-
697
-
698
- def _settings_beside(root: Path, beside: str | None) -> WorkstationSettings:
699
- if beside is not None:
700
- return WorkstationSettings.load(OrgPaths(root=root, org=validate_org(beside)))
701
- installed = [
702
- WorkstationSettings.load(OrgPaths(root=root, org=file.parent.name))
703
- for file in sorted(root.glob("*/workstation.json"), key=lambda file: file.stat().st_mtime)
704
- ]
705
- if not installed:
706
- raise FileNotFoundError(
707
- f"no Runner is installed under {root}; run `agentic-runner install` first"
708
- )
709
- endpoints = {
710
- (settings.control_plane_url, settings.temporal_address, settings.temporal_tls)
711
- for settings in installed
712
- }
713
- if len(endpoints) > 1:
714
- names = ", ".join(sorted(settings.org for settings in installed))
715
- raise ValueError(
716
- f"the Runners under {root} ({names}) talk to different control planes; "
717
- "name the one to add beside with --beside"
718
- )
719
- # The newest install's PATH and ACP kinds: the latest the person told this machine.
720
- return installed[-1]
721
-
722
-
723
676
  def start(paths: OrgPaths, **driver: Any) -> None:
724
677
  _drive_service(paths, "start", **driver)
725
678
 
File without changes