agentic-runner 3.18.2__tar.gz → 3.19.0__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.2 → agentic_runner-3.19.0}/PKG-INFO +2 -2
  2. {agentic_runner-3.18.2 → agentic_runner-3.19.0}/pyproject.toml +1 -1
  3. {agentic_runner-3.18.2 → agentic_runner-3.19.0}/src/agentic_runner/__init__.py +1 -1
  4. {agentic_runner-3.18.2 → agentic_runner-3.19.0}/src/agentic_runner/activities.py +16 -3
  5. {agentic_runner-3.18.2 → agentic_runner-3.19.0}/src/agentic_runner/cli.py +3 -1
  6. {agentic_runner-3.18.2 → agentic_runner-3.19.0}/src/agentic_runner/credentials.py +49 -4
  7. {agentic_runner-3.18.2 → agentic_runner-3.19.0}/src/agentic_runner/service.py +34 -3
  8. {agentic_runner-3.18.2 → agentic_runner-3.19.0}/src/agentic_runner/skills/agentic-runner-setup/SKILL.md +2 -3
  9. {agentic_runner-3.18.2 → agentic_runner-3.19.0}/src/agentic_runner/workstation.py +3 -1
  10. {agentic_runner-3.18.2 → agentic_runner-3.19.0}/.gitignore +0 -0
  11. {agentic_runner-3.18.2 → agentic_runner-3.19.0}/LICENSE +0 -0
  12. {agentic_runner-3.18.2 → agentic_runner-3.19.0}/README.md +0 -0
  13. {agentic_runner-3.18.2 → agentic_runner-3.19.0}/src/agentic_runner/attempts.py +0 -0
  14. {agentic_runner-3.18.2 → agentic_runner-3.19.0}/src/agentic_runner/auth_mode.py +0 -0
  15. {agentic_runner-3.18.2 → agentic_runner-3.19.0}/src/agentic_runner/build.py +0 -0
  16. {agentic_runner-3.18.2 → agentic_runner-3.19.0}/src/agentic_runner/callback.py +0 -0
  17. {agentic_runner-3.18.2 → agentic_runner-3.19.0}/src/agentic_runner/child_watcher.py +0 -0
  18. {agentic_runner-3.18.2 → agentic_runner-3.19.0}/src/agentic_runner/cli_floor.py +0 -0
  19. {agentic_runner-3.18.2 → agentic_runner-3.19.0}/src/agentic_runner/config.py +0 -0
  20. {agentic_runner-3.18.2 → agentic_runner-3.19.0}/src/agentic_runner/device_login_activities.py +0 -0
  21. {agentic_runner-3.18.2 → agentic_runner-3.19.0}/src/agentic_runner/egress.py +0 -0
  22. {agentic_runner-3.18.2 → agentic_runner-3.19.0}/src/agentic_runner/harness_self_test.py +0 -0
  23. {agentic_runner-3.18.2 → agentic_runner-3.19.0}/src/agentic_runner/heartbeat_link.py +0 -0
  24. {agentic_runner-3.18.2 → agentic_runner-3.19.0}/src/agentic_runner/hooks.py +0 -0
  25. {agentic_runner-3.18.2 → agentic_runner-3.19.0}/src/agentic_runner/host_store.py +0 -0
  26. {agentic_runner-3.18.2 → agentic_runner-3.19.0}/src/agentic_runner/integrations/__init__.py +0 -0
  27. {agentic_runner-3.18.2 → agentic_runner-3.19.0}/src/agentic_runner/integrations/git/__init__.py +0 -0
  28. {agentic_runner-3.18.2 → agentic_runner-3.19.0}/src/agentic_runner/integrations/git/contracts.py +0 -0
  29. {agentic_runner-3.18.2 → agentic_runner-3.19.0}/src/agentic_runner/integrations/git/evidence.py +0 -0
  30. {agentic_runner-3.18.2 → agentic_runner-3.19.0}/src/agentic_runner/integrations/git/fake_workspace.py +0 -0
  31. {agentic_runner-3.18.2 → agentic_runner-3.19.0}/src/agentic_runner/integrations/git/workspace.py +0 -0
  32. {agentic_runner-3.18.2 → agentic_runner-3.19.0}/src/agentic_runner/integrations/github/__init__.py +0 -0
  33. {agentic_runner-3.18.2 → agentic_runner-3.19.0}/src/agentic_runner/integrations/github/auth.py +0 -0
  34. {agentic_runner-3.18.2 → agentic_runner-3.19.0}/src/agentic_runner/integrations/github/fake_client.py +0 -0
  35. {agentic_runner-3.18.2 → agentic_runner-3.19.0}/src/agentic_runner/integrations/github/gh_client.py +0 -0
  36. {agentic_runner-3.18.2 → agentic_runner-3.19.0}/src/agentic_runner/integrations/oauth/__init__.py +0 -0
  37. {agentic_runner-3.18.2 → agentic_runner-3.19.0}/src/agentic_runner/integrations/oauth/fake_provider.py +0 -0
  38. {agentic_runner-3.18.2 → agentic_runner-3.19.0}/src/agentic_runner/launch.py +0 -0
  39. {agentic_runner-3.18.2 → agentic_runner-3.19.0}/src/agentic_runner/lifecycle.py +0 -0
  40. {agentic_runner-3.18.2 → agentic_runner-3.19.0}/src/agentic_runner/llm_proxy.py +0 -0
  41. {agentic_runner-3.18.2 → agentic_runner-3.19.0}/src/agentic_runner/mcp.py +0 -0
  42. {agentic_runner-3.18.2 → agentic_runner-3.19.0}/src/agentic_runner/message_store.py +0 -0
  43. {agentic_runner-3.18.2 → agentic_runner-3.19.0}/src/agentic_runner/oauth_connectors.py +0 -0
  44. {agentic_runner-3.18.2 → agentic_runner-3.19.0}/src/agentic_runner/private_state.py +0 -0
  45. {agentic_runner-3.18.2 → agentic_runner-3.19.0}/src/agentic_runner/py.typed +0 -0
  46. {agentic_runner-3.18.2 → agentic_runner-3.19.0}/src/agentic_runner/recipient_key_secret.py +0 -0
  47. {agentic_runner-3.18.2 → agentic_runner-3.19.0}/src/agentic_runner/registration.py +0 -0
  48. {agentic_runner-3.18.2 → agentic_runner-3.19.0}/src/agentic_runner/runtime/__init__.py +0 -0
  49. {agentic_runner-3.18.2 → agentic_runner-3.19.0}/src/agentic_runner/runtime/verifier_command.py +0 -0
  50. {agentic_runner-3.18.2 → agentic_runner-3.19.0}/src/agentic_runner/sealed_box.py +0 -0
  51. {agentic_runner-3.18.2 → agentic_runner-3.19.0}/src/agentic_runner/skill.py +0 -0
  52. {agentic_runner-3.18.2 → agentic_runner-3.19.0}/src/agentic_runner/testing/__init__.py +0 -0
  53. {agentic_runner-3.18.2 → agentic_runner-3.19.0}/src/agentic_runner/testing/__main__.py +0 -0
  54. {agentic_runner-3.18.2 → agentic_runner-3.19.0}/src/agentic_runner/testing/control_plane.py +0 -0
  55. {agentic_runner-3.18.2 → agentic_runner-3.19.0}/src/agentic_runner/testing/plugin.py +0 -0
  56. {agentic_runner-3.18.2 → agentic_runner-3.19.0}/src/agentic_runner/testing/test_conformance.py +0 -0
  57. {agentic_runner-3.18.2 → agentic_runner-3.19.0}/src/agentic_runner/testing/workflow.py +0 -0
  58. {agentic_runner-3.18.2 → agentic_runner-3.19.0}/src/agentic_runner/tiny_http.py +0 -0
  59. {agentic_runner-3.18.2 → agentic_runner-3.19.0}/src/agentic_runner/triage_activities.py +0 -0
  60. {agentic_runner-3.18.2 → agentic_runner-3.19.0}/src/agentic_runner/usage_windows.py +0 -0
  61. {agentic_runner-3.18.2 → agentic_runner-3.19.0}/src/agentic_runner/user_sources.py +0 -0
  62. {agentic_runner-3.18.2 → agentic_runner-3.19.0}/src/agentic_runner/workers/__init__.py +0 -0
  63. {agentic_runner-3.18.2 → agentic_runner-3.19.0}/src/agentic_runner/workers/_runtime_support.py +0 -0
  64. {agentic_runner-3.18.2 → agentic_runner-3.19.0}/src/agentic_runner/workers/acp_runtime.py +0 -0
  65. {agentic_runner-3.18.2 → agentic_runner-3.19.0}/src/agentic_runner/workers/agent_runtime.py +0 -0
  66. {agentic_runner-3.18.2 → agentic_runner-3.19.0}/src/agentic_runner/workers/claude_runtime.py +0 -0
  67. {agentic_runner-3.18.2 → agentic_runner-3.19.0}/src/agentic_runner/workers/claude_sign_in.py +0 -0
  68. {agentic_runner-3.18.2 → agentic_runner-3.19.0}/src/agentic_runner/workers/codex_runtime.py +0 -0
  69. {agentic_runner-3.18.2 → agentic_runner-3.19.0}/src/agentic_runner/workers/command_policy.py +0 -0
  70. {agentic_runner-3.18.2 → agentic_runner-3.19.0}/src/agentic_runner/workers/contract_device_login.py +0 -0
  71. {agentic_runner-3.18.2 → agentic_runner-3.19.0}/src/agentic_runner/workers/contract_isolation.py +0 -0
  72. {agentic_runner-3.18.2 → agentic_runner-3.19.0}/src/agentic_runner/workers/fastapi_client.py +0 -0
  73. {agentic_runner-3.18.2 → agentic_runner-3.19.0}/src/agentic_runner/workers/harness_outcome.py +0 -0
  74. {agentic_runner-3.18.2 → agentic_runner-3.19.0}/src/agentic_runner/workers/harness_usage.py +0 -0
  75. {agentic_runner-3.18.2 → agentic_runner-3.19.0}/src/agentic_runner/workers/mcp_config.py +0 -0
  76. {agentic_runner-3.18.2 → agentic_runner-3.19.0}/src/agentic_runner/workers/settings.py +0 -0
  77. {agentic_runner-3.18.2 → agentic_runner-3.19.0}/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.2
3
+ Version: 3.19.0
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.2
8
+ Requires-Dist: agentic-runner-contracts==3.19.0
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.2",
13
+ "agentic-runner-contracts==3.19.0",
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.2"
10
+ __version__ = "3.19.0"
11
11
 
12
12
  __all__ = ["__version__"]
@@ -267,6 +267,7 @@ from agentic_runner_contracts.grants.seam import VerbDecision, decide_verb
267
267
  from agentic_runner_contracts.questions import WORK_ASK_VERB
268
268
  from agentic_runner_contracts.redaction import redact_secret_like_text
269
269
  from agentic_runner_contracts.routing import (
270
+ DirectiveRouting,
270
271
  RoutingRefusedError,
271
272
  RunnerRoutingIdentity,
272
273
  assert_routed,
@@ -2028,6 +2029,7 @@ class RunnerRalphActivities:
2028
2029
  state=runtime_state,
2029
2030
  workspace_path=workspace_path,
2030
2031
  directive_number=request.directive_number,
2032
+ routing=request.routing,
2031
2033
  sandbox=self._contract_sandbox(runtime_state),
2032
2034
  mcp_plan=mcp_plan,
2033
2035
  asked=asked,
@@ -2595,6 +2597,7 @@ class RunnerRalphActivities:
2595
2597
  mcp_plan: McpPlan | None = None,
2596
2598
  asked: list[QuestionAsked] | None = None,
2597
2599
  bound: list[ProductBinding] | None = None,
2600
+ routing: DirectiveRouting | None = None,
2598
2601
  ) -> AsyncIterator[_DirectiveAttempt]:
2599
2602
  """Open one attempt's hook lifecycle and its callback socket (PRD issue 45).
2600
2603
 
@@ -2623,7 +2626,9 @@ class RunnerRalphActivities:
2623
2626
  )
2624
2627
 
2625
2628
  await self._refuse_skill_digest_mismatch(work_record_id, state)
2626
- credentials = await self._resolve_credentials(work_record_id, state)
2629
+ credentials = await self._resolve_credentials(
2630
+ work_record_id, state, funding_party=routing.funding_party if routing else None
2631
+ )
2627
2632
  if credentials is not None:
2628
2633
  # Names only, at the moment they resolved (22 A1's Evidence): a support read
2629
2634
  # of "which credentials did this Directive have" must not be answerable by
@@ -2969,7 +2974,11 @@ class RunnerRalphActivities:
2969
2974
  return (tuple(entries) if state.mcp_servers else None), allow_list
2970
2975
 
2971
2976
  async def _resolve_credentials(
2972
- self, work_record_id: str, state: _RuntimeContextState
2977
+ self,
2978
+ work_record_id: str,
2979
+ state: _RuntimeContextState,
2980
+ *,
2981
+ funding_party: str | None = None,
2973
2982
  ) -> DirectiveCredentials | None:
2974
2983
  """Resolve this Contract's Credential References, or fail the Directive closed.
2975
2984
 
@@ -2985,7 +2994,9 @@ class RunnerRalphActivities:
2985
2994
  resolver = self._credentials or CredentialResolver(store=EmptyCredentialStore())
2986
2995
  try:
2987
2996
  return resolver.resolve(
2988
- contract_id=state.contract_id, manifest=state.credential_references
2997
+ contract_id=state.contract_id,
2998
+ manifest=state.credential_references,
2999
+ funding_party=funding_party,
2989
3000
  )
2990
3001
  except UnresolvableCredentialReferenceError as error:
2991
3002
  await self._fastapi_client.append_evidence(
@@ -5055,6 +5066,7 @@ class RunnerRalphActivities:
5055
5066
  state=state,
5056
5067
  workspace_path=workspace,
5057
5068
  directive_number=request.directive_number,
5069
+ routing=request.routing,
5058
5070
  sandbox=self._contract_sandbox(state),
5059
5071
  reserve_max_tokens=request.reserve_max_tokens or None,
5060
5072
  mcp_plan=learning_plan,
@@ -5301,6 +5313,7 @@ class RunnerRalphActivities:
5301
5313
  state=state,
5302
5314
  workspace_path=state.workspace_path,
5303
5315
  directive_number=request.directive_number,
5316
+ routing=request.routing,
5304
5317
  sandbox=self._contract_sandbox(state),
5305
5318
  mcp_plan=mcp_plan,
5306
5319
  asked=asked,
@@ -164,7 +164,9 @@ def main(argv: Sequence[str] | None = None) -> int:
164
164
  "--control-plane", default=os.environ.get(CONTROL_PLANE_ENV), help="control plane URL"
165
165
  )
166
166
  install.add_argument(
167
- "--temporal-address", required=True, help="host:port, e.g. temporal-grpc.<zone>:443"
167
+ "--temporal-address",
168
+ default="",
169
+ help="host:port; a fallback only, the Runner uses the address its registration gives",
168
170
  )
169
171
  install.add_argument(
170
172
  "--temporal-plaintext",
@@ -204,6 +204,13 @@ class CredentialResolver:
204
204
  in memory only. It is consulted before the host store because a funder who delivered a
205
205
  value is stating it is theirs to state; the host's own install is the fallback, which
206
206
  is exactly the hand-over default.
207
+
208
+ The fallback is a loan of the host's own values, so it is made only to work the host
209
+ pays for (ADR-0022 §36): an Organisation or Account Runner lends its store to a
210
+ Contract whose ``funding_party`` is its own ``host_party``, and a contractor-funded
211
+ Contract in that pool brings sealed values or finds the reference unusable. A
212
+ personal Runner lends to every Contract it runs, because it runs only its person's
213
+ own (§2, §42). A blank ``host_party`` -- a Runner not yet registered -- lends nothing.
207
214
  """
208
215
 
209
216
  def __init__(
@@ -211,9 +218,14 @@ class CredentialResolver:
211
218
  *,
212
219
  store: HostCredentialStore,
213
220
  delivered: Mapping[tuple[str, str], str] | None = None,
221
+ host_party: str | None = None,
214
222
  ) -> None:
215
223
  self._store = store
216
224
  self._delivered = dict(delivered or {})
225
+ self._host_party = host_party
226
+ # The funding party the last ack named per Contract, for the readers that have no
227
+ # Directive to carry one: the heartbeat's report and an OAuth Connector's secret.
228
+ self._funding: dict[str, str] = {}
217
229
 
218
230
  @property
219
231
  def host_store(self) -> HostCredentialStore:
@@ -231,22 +243,55 @@ class CredentialResolver:
231
243
 
232
244
  self._delivered.pop((str(contract_id), slot), None)
233
245
 
234
- def resolve(self, *, contract_id: str | None, manifest: Iterable[str]) -> DirectiveCredentials:
246
+ def fund(self, funding: Mapping[str, str]) -> None:
247
+ """Replace the per-Contract funding parties with the last ack's (ADR-0022 §7)."""
248
+
249
+ self._funding = dict(funding)
250
+
251
+ def resolve(
252
+ self,
253
+ *,
254
+ contract_id: str | None,
255
+ manifest: Iterable[str],
256
+ funding_party: str | None = None,
257
+ ) -> DirectiveCredentials:
235
258
  """Every reference the Contract declares, or the first failure, named.
236
259
 
260
+ ``funding_party`` is the Directive's own (``DirectiveRouting.funding_party``); a
261
+ reader without a Directive leaves it out and the last ack's word for the Contract
262
+ stands in, and with neither the host store is not lent.
263
+
237
264
  Fails on the *first* unresolvable reference rather than collecting them: a
238
265
  Directive that cannot have one of its credentials is not going to run, and a
239
266
  partial resolution left lying around is a value held for no reason.
240
267
  """
241
268
 
269
+ lends = self._lends_host_store(contract_id, funding_party)
242
270
  values: dict[str, str] = {}
243
271
  for reference in manifest:
244
- value = self._delivered.get((str(contract_id), reference))
245
- if value is None:
246
- value = self._store.get(reference)
272
+ value = self._value(contract_id, reference, lends=lends)
247
273
  if value is None:
248
274
  raise UnresolvableCredentialReferenceError(
249
275
  reference, contract_id=contract_id, reason="not_installed"
250
276
  )
251
277
  values[reference] = value
252
278
  return DirectiveCredentials(contract_id=contract_id, _values=values)
279
+
280
+ def usable(self, contract_id: str, reference: str) -> bool:
281
+ """Whether a Directive of this Contract would resolve ``reference`` now (§7)."""
282
+
283
+ lends = self._lends_host_store(contract_id, None)
284
+ return self._value(contract_id, reference, lends=lends) is not None
285
+
286
+ def _value(self, contract_id: str | None, reference: str, *, lends: bool) -> str | None:
287
+ value = self._delivered.get((str(contract_id), reference))
288
+ if value is None and lends:
289
+ value = self._store.get(reference)
290
+ return value
291
+
292
+ def _lends_host_store(self, contract_id: str | None, funding_party: str | None) -> bool:
293
+ if self._host_party == "user":
294
+ return True
295
+ if funding_party is None:
296
+ funding_party = self._funding.get(str(contract_id), "")
297
+ return bool(self._host_party) and funding_party == self._host_party
@@ -127,6 +127,8 @@ from agentic_runner_contracts.runner_registration import (
127
127
  RECENT_OUTCOMES_MAX,
128
128
  AcpBridgeVersion,
129
129
  CliVersion,
130
+ CredentialManifest,
131
+ CredentialValidity,
130
132
  DirectiveOutcome,
131
133
  EgressPosture,
132
134
  HarnessVersion,
@@ -379,7 +381,10 @@ def build_hook_runner(config: RunnerConfig) -> HookRunner:
379
381
 
380
382
 
381
383
  def build_credential_resolver(
382
- config: RunnerConfig, *, host_store: HostCredentialStore | None = None
384
+ config: RunnerConfig,
385
+ *,
386
+ host_store: HostCredentialStore | None = None,
387
+ host_party: str | None = None,
383
388
  ) -> CredentialResolver:
384
389
  """The host store a Directive resolves its Credential References from (22 A1).
385
390
 
@@ -393,7 +398,7 @@ def build_credential_resolver(
393
398
  if config.credential_store is not None
394
399
  else EmptyCredentialStore()
395
400
  )
396
- return CredentialResolver(store=store)
401
+ return CredentialResolver(store=store, host_party=host_party)
397
402
 
398
403
 
399
404
  def build_socket_dir(config: RunnerConfig) -> Path:
@@ -731,6 +736,8 @@ class ControlPlaneStream:
731
736
  # Console-v2 issue 30: the OAuth Connectors whose code, tokens and verifier stay here.
732
737
  oauth: OAuthConnectors | None = None
733
738
  _delivered: set[tuple[str, str]] = field(default_factory=set)
739
+ # ADR-0022 §7: the Contracts the last ack asked this Runner to report references for.
740
+ _manifests: list[CredentialManifest] = field(default_factory=list)
734
741
  _offered_to_proxy: dict[tuple[str, str], str] = field(default_factory=dict)
735
742
  _last_seen: tuple[float, datetime] | None = None
736
743
 
@@ -802,6 +809,23 @@ class ControlPlaneStream:
802
809
  ),
803
810
  )
804
811
 
812
+ def _credential_report(self) -> list[CredentialValidity]:
813
+ """Per Contract the last ack named, whether each reference would resolve (§7).
814
+
815
+ Asked of the same resolver a Directive resolves through, so the report and the
816
+ Directive cannot disagree on what a funder sealed or what the host lends (§36).
817
+ """
818
+
819
+ return [
820
+ CredentialValidity(
821
+ contract_id=manifest.contract_id,
822
+ reference=reference,
823
+ valid=self.credentials.usable(str(manifest.contract_id), reference),
824
+ )
825
+ for manifest in self._manifests
826
+ for reference in manifest.references
827
+ ]
828
+
805
829
  async def directive_token(self, directive_id: str) -> str:
806
830
  """One activity execution's control-plane token, by Directive id (PRD issue 63)."""
807
831
 
@@ -821,6 +845,7 @@ class ControlPlaneStream:
821
845
  max_concurrent_directives=self.state.max_concurrent_directives,
822
846
  current_load=self.load.in_flight,
823
847
  recent_outcomes=list(self.load.outcomes),
848
+ credentials=self._credential_report(),
824
849
  slots=self.proxy.slots.statuses(),
825
850
  usage=self.proxy.outbox.pending(),
826
851
  egress_posture=self.egress_posture,
@@ -865,6 +890,10 @@ class ControlPlaneStream:
865
890
  refused.slot,
866
891
  )
867
892
  self._sync_delivered()
893
+ self._manifests = list(ack.credential_manifests)
894
+ self.credentials.fund(
895
+ {str(manifest.contract_id): manifest.funding_party for manifest in self._manifests}
896
+ )
868
897
  await self._sync_llm_slots()
869
898
  if ack.runner_token is not None:
870
899
  self.runner_token = ack.runner_token
@@ -1261,7 +1290,9 @@ async def _serve_registered(
1261
1290
  ) -> int:
1262
1291
  load = _LoadInterceptor()
1263
1292
  proxy = LlmProxy(slots=SlotStore(), ceilings=CeilingStore(), outbox=UsageOutbox())
1264
- credentials = build_credential_resolver(config, host_store=host_store)
1293
+ credentials = build_credential_resolver(
1294
+ config, host_store=host_store, host_party=state.host_party
1295
+ )
1265
1296
  isolation = build_contract_isolation(settings, can_separate_uids=can_change_uid)
1266
1297
  runtimes = build_agent_runtimes(settings, attestation.clis if attestation is not None else [])
1267
1298
  in_flight = DirectivesInFlight()
@@ -22,7 +22,6 @@ The prompt they pasted from the console holds these. Ask for any that is missing
22
22
  - **Control plane URL**: the Runner's `controlPlane.url`, copied from the console's
23
23
  Runners page. It is the only control plane address you use, and only as a value you
24
24
  pass to the Runner. Never call it or any other control plane address yourself.
25
- - **Temporal address**: `host:port`, from the same page.
26
25
 
27
26
  The **Runner Registration Token** is not one of them. It is the reusable credential a Runner registers
28
27
  with, and the person types it only where the Runner reads it, never into this
@@ -82,7 +81,7 @@ without showing it:
82
81
 
83
82
  ```sh
84
83
  uv tool install agentic-runner
85
- agentic-runner install <org> --control-plane <control-plane-url> --temporal-address <temporal-address>
84
+ agentic-runner install <org> --control-plane <control-plane-url>
86
85
  ```
87
86
 
88
87
  You run the first line. Do not run the second yourself: wait until the person says it
@@ -91,7 +90,7 @@ finished, and ask for its last lines of output.
91
90
  **Docker.** Follow
92
91
  https://github.com/qtsone/agentic-runner/blob/main/docs/docker.md#the-env-file and then
93
92
  https://github.com/qtsone/agentic-runner/blob/main/docs/docker.md#docker-run. Create
94
- `runner.env` with the URL and the address filled in, and ask the person to add the Agent
93
+ `runner.env` with the control plane URL filled in, and ask the person to add the Agent
95
94
  Token line to it themselves.
96
95
 
97
96
  **Kubernetes.** Follow
@@ -198,7 +198,9 @@ class WorkstationSettings(BaseModel):
198
198
 
199
199
  org: str
200
200
  control_plane_url: str
201
- temporal_address: str
201
+ # A fallback only: `run` uses the address the registration response carries (ADR-0022
202
+ # §4). An install made before 3.17 saved one and keeps it.
203
+ temporal_address: str = ""
202
204
  # `temporal-grpc.<zone>` over TLS with the Runner Token (15's note on 23): no VPN, no
203
205
  # client certificate. Plaintext exists for a local dev server only.
204
206
  temporal_tls: bool = True
File without changes