agentic-runner-contracts 3.2.0__tar.gz → 3.4.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 (30) hide show
  1. {agentic_runner_contracts-3.2.0 → agentic_runner_contracts-3.4.0}/PKG-INFO +1 -1
  2. {agentic_runner_contracts-3.2.0 → agentic_runner_contracts-3.4.0}/src/agentic_runner_contracts/__init__.py +1 -1
  3. {agentic_runner_contracts-3.2.0 → agentic_runner_contracts-3.4.0}/src/agentic_runner_contracts/activity_io.py +28 -0
  4. {agentic_runner_contracts-3.2.0 → agentic_runner_contracts-3.4.0}/src/agentic_runner_contracts/runner_registration.py +48 -1
  5. {agentic_runner_contracts-3.2.0 → agentic_runner_contracts-3.4.0}/.gitignore +0 -0
  6. {agentic_runner_contracts-3.2.0 → agentic_runner_contracts-3.4.0}/LICENSE +0 -0
  7. {agentic_runner_contracts-3.2.0 → agentic_runner_contracts-3.4.0}/README.md +0 -0
  8. {agentic_runner_contracts-3.2.0 → agentic_runner_contracts-3.4.0}/pyproject.toml +0 -0
  9. {agentic_runner_contracts-3.2.0 → agentic_runner_contracts-3.4.0}/src/agentic_runner_contracts/channel_messages.py +0 -0
  10. {agentic_runner_contracts-3.2.0 → agentic_runner_contracts-3.4.0}/src/agentic_runner_contracts/epics.py +0 -0
  11. {agentic_runner_contracts-3.2.0 → agentic_runner_contracts-3.4.0}/src/agentic_runner_contracts/github_port.py +0 -0
  12. {agentic_runner_contracts-3.2.0 → agentic_runner_contracts-3.4.0}/src/agentic_runner_contracts/grants/__init__.py +0 -0
  13. {agentic_runner_contracts-3.2.0 → agentic_runner_contracts-3.4.0}/src/agentic_runner_contracts/grants/catalogue.py +0 -0
  14. {agentic_runner_contracts-3.2.0 → agentic_runner_contracts-3.4.0}/src/agentic_runner_contracts/grants/evaluator.py +0 -0
  15. {agentic_runner_contracts-3.2.0 → agentic_runner_contracts-3.4.0}/src/agentic_runner_contracts/grants/model.py +0 -0
  16. {agentic_runner_contracts-3.2.0 → agentic_runner_contracts-3.4.0}/src/agentic_runner_contracts/grants/seam.py +0 -0
  17. {agentic_runner_contracts-3.2.0 → agentic_runner_contracts-3.4.0}/src/agentic_runner_contracts/grants/snapshot.py +0 -0
  18. {agentic_runner_contracts-3.2.0 → agentic_runner_contracts-3.4.0}/src/agentic_runner_contracts/incidents.py +0 -0
  19. {agentic_runner_contracts-3.2.0 → agentic_runner_contracts-3.4.0}/src/agentic_runner_contracts/llm_usage.py +0 -0
  20. {agentic_runner_contracts-3.2.0 → agentic_runner_contracts-3.4.0}/src/agentic_runner_contracts/public_metadata.py +0 -0
  21. {agentic_runner_contracts-3.2.0 → agentic_runner_contracts-3.4.0}/src/agentic_runner_contracts/py.typed +0 -0
  22. {agentic_runner_contracts-3.2.0 → agentic_runner_contracts-3.4.0}/src/agentic_runner_contracts/questions.py +0 -0
  23. {agentic_runner_contracts-3.2.0 → agentic_runner_contracts-3.4.0}/src/agentic_runner_contracts/redaction.py +0 -0
  24. {agentic_runner_contracts-3.2.0 → agentic_runner_contracts-3.4.0}/src/agentic_runner_contracts/routing.py +0 -0
  25. {agentic_runner_contracts-3.2.0 → agentic_runner_contracts-3.4.0}/src/agentic_runner_contracts/runner_signature.py +0 -0
  26. {agentic_runner_contracts-3.2.0 → agentic_runner_contracts-3.4.0}/src/agentic_runner_contracts/runtime_context.py +0 -0
  27. {agentic_runner_contracts-3.2.0 → agentic_runner_contracts-3.4.0}/src/agentic_runner_contracts/sealed_credential.py +0 -0
  28. {agentic_runner_contracts-3.2.0 → agentic_runner_contracts-3.4.0}/src/agentic_runner_contracts/swarm.py +0 -0
  29. {agentic_runner_contracts-3.2.0 → agentic_runner_contracts-3.4.0}/src/agentic_runner_contracts/triage.py +0 -0
  30. {agentic_runner_contracts-3.2.0 → agentic_runner_contracts-3.4.0}/src/agentic_runner_contracts/user_sources.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: agentic-runner-contracts
3
- Version: 3.2.0
3
+ Version: 3.4.0
4
4
  Summary: Activity I/O contracts and Public Metadata name builders shared by the Agentic OS platform and the installable Runner
5
5
  License-Expression: AGPL-3.0-only
6
6
  License-File: LICENSE
@@ -32,6 +32,6 @@ the package the floor is *about*, and read back through ``agentic-runner --versi
32
32
  # Additive; an older payload parses with no Skills. But the context forbids extra keys,
33
33
  # so a Runner one minor behind refuses a context that carries `skills` -- the platform
34
34
  # must not send the field until its Runners are on 2.7.
35
- __version__ = "3.2.0"
35
+ __version__ = "3.4.0"
36
36
 
37
37
  __all__ = ["__version__"]
@@ -175,6 +175,29 @@ class QuestionAsked:
175
175
  owner_confirmation: OwnerConfirmationPending | None = None
176
176
 
177
177
 
178
+ class HarnessHoldKind(StrEnum):
179
+ """Why a subscription-mode harness stopped on its person's account (local-agents 08)."""
180
+
181
+ # The plan's usage window is spent; the harness may say when it resets.
182
+ USAGE_LIMIT = "usage_limit"
183
+ # The sign-in expired, was revoked, or is absent: only the person can sign in again.
184
+ SIGN_IN_REQUIRED = "sign_in_required"
185
+
186
+
187
+ @dataclass(frozen=True)
188
+ class HarnessHold:
189
+ """A subscription Directive stopped for a reason a retry cannot fix (local-agents 08).
190
+
191
+ Returned instead of raised, with nothing pushed, so the loop can hold rather than
192
+ spend a fix Directive and Budget on it (issue 09). ``retry_not_before`` is ISO 8601
193
+ UTC text -- the same reason ``ContractDeviceLoginResult.expires_at`` is -- and None
194
+ when the harness named no reset time.
195
+ """
196
+
197
+ kind: HarnessHoldKind
198
+ retry_not_before: str | None = None
199
+
200
+
178
201
  @dataclass(frozen=True)
179
202
  class QuestionOpenInput:
180
203
  """Route an allowed Question and start its 24 h window (PRD issue 60)."""
@@ -328,6 +351,8 @@ class BranchPullRequestOutput:
328
351
  plan: EpicPlan | None = None
329
352
  # PRD issue 60: the Question this Directive's Agent asked over its callback socket.
330
353
  question: QuestionAsked | None = None
354
+ # Local-agents 08: the subscription harness hit its usage limit or lost its sign-in.
355
+ harness_hold: HarnessHold | None = None
331
356
 
332
357
 
333
358
  @dataclass(frozen=True)
@@ -649,6 +674,8 @@ class FixDirectiveOutput:
649
674
  plan: EpicPlan | None = None
650
675
  # PRD issue 60: the Question this Directive's Agent asked over its callback socket.
651
676
  question: QuestionAsked | None = None
677
+ # Local-agents 08: the subscription harness hit its usage limit or lost its sign-in.
678
+ harness_hold: HarnessHold | None = None
652
679
 
653
680
 
654
681
  @dataclass(frozen=True)
@@ -1032,6 +1059,7 @@ class LearningDirectiveOutput:
1032
1059
  usage: DirectiveUsage = field(default_factory=DirectiveUsage)
1033
1060
  outcome: str = LEARNING_PROPOSED
1034
1061
  summary: str = ""
1062
+ harness_hold: HarnessHold | None = None
1035
1063
 
1036
1064
 
1037
1065
  @dataclass(frozen=True)
@@ -223,8 +223,36 @@ class BootstrapResponse(BaseModel):
223
223
  stale_after_seconds: int = int(HEARTBEAT_STALE_AFTER.total_seconds())
224
224
 
225
225
 
226
+ class SelfTestFailure(StrEnum):
227
+ """Why a harness's ``--version`` under a Contract's uid did not answer (local-agents 17)."""
228
+
229
+ NOT_FOUND = "not_found"
230
+ BELOW_FLOOR = "below_floor"
231
+ SPAWN_FAILED = "spawn_failed"
232
+ TIMEOUT = "timeout"
233
+
234
+
235
+ class HarnessSelfTest(BaseModel):
236
+ """The last ``--version`` run as the Contract would run it: a result, never its output."""
237
+
238
+ model_config = ConfigDict(extra="forbid")
239
+
240
+ ok: bool
241
+ at: datetime
242
+ reason: SelfTestFailure | None = None
243
+
244
+
245
+ _HARNESS_DESCRIPTOR_FIELDS: Final = ("auth_modes", "permission_mode", "self_test")
246
+
247
+
226
248
  class HarnessVersion(BaseModel):
227
- """One CLI as it stands under one Contract root (ADR-0015 §4, 23 item 5)."""
249
+ """One CLI as it stands under one Contract root (ADR-0015 §4, 23 item 5).
250
+
251
+ ``auth_modes``, ``permission_mode`` and ``self_test`` are the runtime's descriptor
252
+ (local-agents 17), self-reported like everything else here. The permission mode is
253
+ what the Runner passes the harness, reported and never trusted as a gate (ADR-0011
254
+ §12).
255
+ """
228
256
 
229
257
  model_config = ConfigDict(extra="forbid")
230
258
 
@@ -232,6 +260,25 @@ class HarnessVersion(BaseModel):
232
260
  cli_kind: Annotated[str, StringConstraints(pattern=r"^[a-z][a-z0-9_]{0,31}$")]
233
261
  version: Annotated[str, StringConstraints(max_length=64)]
234
262
  auth_mode: Annotated[str, StringConstraints(pattern=r"^[a-z][a-z0-9_]{0,31}$")]
263
+ auth_modes: (
264
+ list[Annotated[str, StringConstraints(pattern=r"^[a-z][a-z0-9_]{0,31}$")]] | None
265
+ ) = Field(default=None, max_length=8)
266
+ permission_mode: (
267
+ Annotated[str, StringConstraints(pattern=r"^[a-z][a-z0-9_=;.-]{0,95}$")] | None
268
+ ) = None
269
+ self_test: HarnessSelfTest | None = None
270
+
271
+ @model_serializer(mode="wrap")
272
+ def _omit_absent_descriptor(self, handler: SerializerFunctionWrapHandler) -> Any:
273
+ # A control plane on contracts 3.3 forbids extra keys, so a row without the
274
+ # descriptor is the body it already parses. One with it needs the control plane
275
+ # on this minor first -- upgrade the control plane before the Runner.
276
+ body = handler(self)
277
+ if isinstance(body, dict):
278
+ for name in _HARNESS_DESCRIPTOR_FIELDS:
279
+ if body.get(name) is None:
280
+ body.pop(name, None)
281
+ return body
235
282
 
236
283
 
237
284
  class ResourcePressure(BaseModel):