macp-sdk-python 0.2.1__py3-none-any.whl → 0.2.2__py3-none-any.whl

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.
@@ -70,6 +70,48 @@ class ParticipantActions:
70
70
  """Cancel the session."""
71
71
  return self._client.cancel_session(self._session_id, reason=reason, auth=self._auth)
72
72
 
73
+ def start_session(
74
+ self,
75
+ intent: str,
76
+ participants: list[str],
77
+ ttl_ms: int,
78
+ context_id: str = "",
79
+ extensions: dict[str, bytes] | None = None,
80
+ mode_version: str | None = None,
81
+ configuration_version: str | None = None,
82
+ policy_version: str | None = None,
83
+ ) -> Any:
84
+ """Send a SessionStart envelope to open the session."""
85
+ from ..constants import (
86
+ DEFAULT_CONFIGURATION_VERSION,
87
+ DEFAULT_MODE_VERSION,
88
+ DEFAULT_POLICY_VERSION,
89
+ )
90
+ from ..envelope import (
91
+ build_envelope,
92
+ build_session_start_payload,
93
+ serialize_message,
94
+ )
95
+
96
+ payload = build_session_start_payload(
97
+ intent=intent,
98
+ participants=participants,
99
+ ttl_ms=ttl_ms,
100
+ context_id=context_id,
101
+ extensions=extensions,
102
+ mode_version=mode_version or DEFAULT_MODE_VERSION,
103
+ configuration_version=configuration_version or DEFAULT_CONFIGURATION_VERSION,
104
+ policy_version=policy_version or DEFAULT_POLICY_VERSION,
105
+ )
106
+ envelope = build_envelope(
107
+ mode=self._mode,
108
+ message_type="SessionStart",
109
+ session_id=self._session_id,
110
+ sender=self._participant_id,
111
+ payload=serialize_message(payload),
112
+ )
113
+ return self.send_envelope(envelope)
114
+
73
115
  def evaluate(
74
116
  self,
75
117
  proposal_id: str,
@@ -222,6 +264,7 @@ class Participant:
222
264
  configuration_version: str | None = None,
223
265
  policy_version: str | None = None,
224
266
  transport: TransportAdapter | None = None,
267
+ initiator_config: Any | None = None,
225
268
  ) -> None:
226
269
  self._participant_id = participant_id
227
270
  self._session_id = session_id
@@ -229,6 +272,7 @@ class Participant:
229
272
  self._client = client
230
273
  self._auth = auth
231
274
  self._stopped = False
275
+ self._initiator_config = initiator_config
232
276
 
233
277
  self._dispatcher = Dispatcher()
234
278
  self._session = SessionInfo(
@@ -365,19 +409,23 @@ class Participant:
365
409
  def run(self) -> None:
366
410
  """Enter the blocking event loop.
367
411
 
368
- If a :class:`TransportAdapter` was provided, it is used to receive
369
- messages. Otherwise a gRPC ``StreamSession`` is opened.
412
+ If this participant is the initiator (``initiator_config`` is set),
413
+ emits SessionStart + kickoff before opening the stream.
370
414
 
371
415
  Dispatches received events to registered handlers until the session
372
416
  reaches a terminal state or ``stop()`` is called.
373
417
  """
374
418
  logger.info(
375
- "participant %s joining session %s (mode=%s)",
419
+ "participant %s joining session %s (mode=%s, initiator=%s)",
376
420
  self._participant_id,
377
421
  self._session_id,
378
422
  self._mode,
423
+ self._initiator_config is not None,
379
424
  )
380
425
 
426
+ if self._initiator_config is not None:
427
+ self._emit_initiator_envelopes()
428
+
381
429
  transport = self._transport or GrpcTransportAdapter(
382
430
  self._client,
383
431
  self._session_id,
@@ -387,7 +435,6 @@ class Participant:
387
435
  for message in transport.start():
388
436
  if self._stopped:
389
437
  break
390
- # If the transport yields raw envelopes (gRPC), process as envelope
391
438
  if message.raw is not None:
392
439
  self._process_envelope(message.raw)
393
440
  else:
@@ -395,6 +442,35 @@ class Participant:
395
442
  finally:
396
443
  transport.stop()
397
444
 
445
+ def _emit_initiator_envelopes(self) -> None:
446
+ """Emit SessionStart + kickoff envelope as the initiator."""
447
+ cfg = self._initiator_config
448
+ if cfg is None:
449
+ return
450
+
451
+ self._actions.start_session(
452
+ intent=cfg.intent,
453
+ participants=cfg.participants,
454
+ ttl_ms=cfg.ttl_ms,
455
+ context_id=cfg.context_id,
456
+ mode_version=cfg.mode_version,
457
+ configuration_version=cfg.configuration_version,
458
+ policy_version=cfg.policy_version,
459
+ )
460
+ logger.info("SessionStart emitted (session=%s)", self._session_id)
461
+
462
+ if cfg.kickoff_message_type == "Proposal":
463
+ payload = cfg.kickoff_payload or {}
464
+ proposal_id = str(
465
+ payload.get("proposalId")
466
+ or payload.get("proposal_id")
467
+ or f"{self._session_id}-kickoff"
468
+ )
469
+ option = str(payload.get("option", "decide"))
470
+ rationale = str(payload.get("rationale", ""))
471
+ self._actions.propose(proposal_id, option, rationale=rationale)
472
+ logger.info("Kickoff proposal emitted (proposalId=%s)", proposal_id)
473
+
398
474
  def process_event(self, envelope: Any) -> None:
399
475
  """Manually process a single envelope (for testing or polling transports)."""
400
476
  self._process_envelope(envelope)
macp_sdk/agent/runner.py CHANGED
@@ -2,6 +2,8 @@ from __future__ import annotations
2
2
 
3
3
  import json
4
4
  import os
5
+ from dataclasses import dataclass, field
6
+ from typing import Any
5
7
 
6
8
  from ..auth import AuthConfig
7
9
  from ..client import MacpClient
@@ -9,67 +11,77 @@ from ..constants import DEFAULT_POLICY_VERSION
9
11
  from .participant import Participant
10
12
 
11
13
 
12
- def from_bootstrap(bootstrap_path: str | None = None) -> Participant:
13
- """Create a Participant from a bootstrap context file.
14
+ @dataclass
15
+ class InitiatorConfig:
16
+ """Configuration for the initiator agent's SessionStart + kickoff."""
17
+
18
+ intent: str
19
+ participants: list[str]
20
+ ttl_ms: int
21
+ context_id: str = ""
22
+ roots: list[dict[str, str]] | None = None
23
+ mode_version: str | None = None
24
+ configuration_version: str | None = None
25
+ policy_version: str | None = None
26
+ kickoff_message_type: str | None = None
27
+ kickoff_payload: dict[str, Any] = field(default_factory=dict)
14
28
 
15
- The bootstrap file is a JSON document produced by the MACP hosting
16
- infrastructure containing the information needed to connect and
17
- participate in a session.
18
29
 
19
- If ``bootstrap_path`` is not provided, the ``MACP_BOOTSTRAP_FILE``
20
- environment variable is used.
30
+ def from_bootstrap(bootstrap_path: str | None = None) -> Participant:
31
+ """Create a Participant from a bootstrap context file.
21
32
 
22
- Expected bootstrap JSON structure::
33
+ Reads the flat bootstrap format produced by the examples-service::
23
34
 
24
35
  {
25
36
  "participant_id": "...",
26
37
  "session_id": "...",
27
38
  "mode": "macp.mode.decision.v1",
28
39
  "runtime_url": "localhost:50051",
29
- "auth": {
30
- "bearer_token": "...", // or "agent_id": "..."
31
- },
40
+ "auth_token": "...",
32
41
  "participants": ["agent-a", "agent-b"],
33
- "policy_version": "policy.default",
34
- "secure": true, // default; set false only for local dev
35
- "allow_insecure": false // required if secure=false
42
+ "secure": false,
43
+ "allow_insecure": true,
44
+ "initiator": { ... }
36
45
  }
37
46
 
38
- Transport security follows RFC-MACP-0006 §3: ``secure`` defaults to
39
- ``true``. Setting ``secure: false`` additionally requires
40
- ``allow_insecure: true`` in the bootstrap (opt-in for local dev only).
47
+ Also accepts ``auth.bearer_token`` for backwards compatibility.
41
48
  """
42
49
  path = bootstrap_path or os.environ.get("MACP_BOOTSTRAP_FILE")
43
50
  if not path:
44
51
  raise ValueError("No bootstrap path provided and MACP_BOOTSTRAP_FILE not set")
45
52
 
46
53
  with open(path) as f:
47
- ctx: dict[str, object] = json.load(f)
54
+ ctx: dict[str, Any] = json.load(f)
48
55
 
49
56
  participant_id = str(ctx["participant_id"])
50
57
  session_id = str(ctx["session_id"])
51
58
  mode = str(ctx["mode"])
52
- runtime_url = str(ctx.get("runtime_url", "localhost:50051"))
59
+ runtime_url = str(ctx.get("runtime_url") or ctx.get("runtime_address") or "localhost:50051")
53
60
  secure = bool(ctx.get("secure", True))
54
61
  allow_insecure = bool(ctx.get("allow_insecure", False))
55
62
 
56
- # Build auth config
57
- auth_data = ctx.get("auth")
58
63
  auth: AuthConfig | None = None
59
- if isinstance(auth_data, dict):
60
- bearer = auth_data.get("bearer_token")
61
- agent_id = auth_data.get("agent_id")
62
- expected_sender = auth_data.get("expected_sender") or participant_id
63
- if bearer:
64
- auth = AuthConfig.for_bearer(
65
- str(bearer),
66
- sender_hint=participant_id,
67
- expected_sender=str(expected_sender),
68
- )
69
- elif agent_id:
70
- auth = AuthConfig.for_dev_agent(str(agent_id), expected_sender=str(expected_sender))
71
-
72
- # Build client
64
+ auth_token = ctx.get("auth_token")
65
+ agent_id = ctx.get("agent_id")
66
+ auth_data = ctx.get("auth")
67
+
68
+ if auth_token:
69
+ auth = AuthConfig.for_bearer(
70
+ str(auth_token),
71
+ sender_hint=participant_id,
72
+ expected_sender=participant_id,
73
+ )
74
+ elif isinstance(auth_data, dict) and auth_data.get("bearer_token"):
75
+ auth = AuthConfig.for_bearer(
76
+ str(auth_data["bearer_token"]),
77
+ sender_hint=participant_id,
78
+ expected_sender=str(auth_data.get("expected_sender") or participant_id),
79
+ )
80
+ elif agent_id:
81
+ auth = AuthConfig.for_dev_agent(str(agent_id), expected_sender=participant_id)
82
+ elif isinstance(auth_data, dict) and auth_data.get("agent_id"):
83
+ auth = AuthConfig.for_dev_agent(str(auth_data["agent_id"]), expected_sender=participant_id)
84
+
73
85
  client = MacpClient(
74
86
  target=runtime_url,
75
87
  secure=secure,
@@ -77,16 +89,43 @@ def from_bootstrap(bootstrap_path: str | None = None) -> Participant:
77
89
  auth=auth,
78
90
  )
79
91
 
80
- # Extract optional fields
81
92
  raw_participants = ctx.get("participants")
82
- participants: list[str] = []
83
- if isinstance(raw_participants, list):
84
- participants = [str(p) for p in raw_participants]
93
+ participants: list[str] = (
94
+ [str(p) for p in raw_participants] if isinstance(raw_participants, list) else []
95
+ )
85
96
 
86
97
  mode_version = ctx.get("mode_version")
87
98
  configuration_version = ctx.get("configuration_version")
88
99
  policy_version = ctx.get("policy_version")
89
100
 
101
+ initiator_config: InitiatorConfig | None = None
102
+ initiator_data = ctx.get("initiator")
103
+ if isinstance(initiator_data, dict):
104
+ ss = initiator_data.get("session_start", {})
105
+ kickoff = initiator_data.get("kickoff")
106
+
107
+ def _str_or(key: str, fallback: object) -> str | None:
108
+ """Pick value from session_start, then fallback, coercing to str."""
109
+ val = ss.get(key)
110
+ if val is not None:
111
+ return str(val)
112
+ return str(fallback) if fallback else None
113
+
114
+ initiator_config = InitiatorConfig(
115
+ intent=str(ss.get("intent", "")),
116
+ participants=[str(p) for p in ss.get("participants", participants)],
117
+ ttl_ms=int(ss.get("ttl_ms", 300000)),
118
+ context_id=str(ss.get("context_id", "")),
119
+ roots=ss.get("roots"),
120
+ mode_version=_str_or("mode_version", mode_version),
121
+ configuration_version=_str_or("configuration_version", configuration_version),
122
+ policy_version=_str_or("policy_version", policy_version),
123
+ kickoff_message_type=(
124
+ str(kickoff["message_type"]) if kickoff and "message_type" in kickoff else None
125
+ ),
126
+ kickoff_payload=kickoff.get("payload", {}) if kickoff else {},
127
+ )
128
+
90
129
  return Participant(
91
130
  participant_id=participant_id,
92
131
  session_id=session_id,
@@ -97,4 +136,5 @@ def from_bootstrap(bootstrap_path: str | None = None) -> Participant:
97
136
  mode_version=str(mode_version) if mode_version else None,
98
137
  configuration_version=str(configuration_version) if configuration_version else None,
99
138
  policy_version=str(policy_version) if policy_version else DEFAULT_POLICY_VERSION,
139
+ initiator_config=initiator_config,
100
140
  )
@@ -133,16 +133,27 @@ class HttpTransportAdapter:
133
133
 
134
134
  def _envelope_to_message(envelope: Any) -> IncomingMessage:
135
135
  """Convert a protobuf Envelope to an IncomingMessage."""
136
+ from ..proto_registry import ProtoRegistry
137
+
136
138
  payload_dict: dict[str, Any] = {}
137
139
  if envelope.payload:
138
140
  try:
139
- payload_dict = json.loads(envelope.payload)
140
- except (json.JSONDecodeError, UnicodeDecodeError):
141
- payload_dict = {"_raw_bytes": envelope.payload}
141
+ registry = ProtoRegistry()
142
+ decoded = registry.decode_known_payload(
143
+ envelope.mode, envelope.message_type, envelope.payload
144
+ )
145
+ payload_dict = decoded if decoded is not None else json.loads(envelope.payload)
146
+ except Exception:
147
+ try:
148
+ payload_dict = json.loads(envelope.payload)
149
+ except Exception:
150
+ payload_dict = {}
142
151
 
143
- proposal_id: str | None = None
144
- if "proposal_id" in payload_dict:
145
- proposal_id = str(payload_dict["proposal_id"])
152
+ proposal_id: str | None = (
153
+ payload_dict.get("proposal_id") or payload_dict.get("proposalId") or None
154
+ )
155
+ if proposal_id is not None:
156
+ proposal_id = str(proposal_id)
146
157
 
147
158
  return IncomingMessage(
148
159
  message_type=envelope.message_type,
macp_sdk/base_session.py CHANGED
@@ -99,7 +99,8 @@ class BaseSession(ABC):
99
99
  intent: str,
100
100
  participants: list[str],
101
101
  ttl_ms: int,
102
- context: bytes | str | Mapping[str, object] | None = None,
102
+ context_id: str = "",
103
+ extensions: Mapping[str, bytes] | None = None,
103
104
  roots: Iterable[Any] | None = None,
104
105
  sender: str | None = None,
105
106
  auth: AuthConfig | None = None,
@@ -113,7 +114,8 @@ class BaseSession(ABC):
113
114
  mode_version=self.mode_version,
114
115
  configuration_version=self.configuration_version,
115
116
  policy_version=self.policy_version,
116
- context=context,
117
+ context_id=context_id,
118
+ extensions=extensions,
117
119
  roots=roots,
118
120
  )
119
121
  envelope = build_envelope(
macp_sdk/client.py CHANGED
@@ -107,24 +107,32 @@ class MacpStream:
107
107
  def _pump_responses(self) -> None:
108
108
  try:
109
109
  for response in self._call:
110
- # Support both formats:
111
- # New: StreamSessionResponse { response: { envelope | error } }
112
- # Old: StreamSessionResponse { envelope }
110
+ # StreamSessionResponse has envelope + error at the top level.
111
+ envelope = getattr(response, "envelope", None)
112
+ error = getattr(response, "error", None)
113
+
114
+ if error is not None and hasattr(error, "ByteSize") and error.ByteSize() > 0:
115
+ for cb in self._inline_error_callbacks:
116
+ cb(error)
117
+ logger.warning("inline stream error: %s", error)
118
+ continue
119
+
120
+ if envelope is not None and envelope.ByteSize() > 0:
121
+ self._responses.put(envelope)
122
+ continue
123
+
124
+ # Fallback: try a nested .response wrapper (legacy proto shape).
113
125
  inner = getattr(response, "response", None)
114
126
  if inner is not None and hasattr(inner, "ByteSize") and inner.ByteSize() > 0:
115
- envelope = getattr(inner, "envelope", None)
116
- error = getattr(inner, "error", None)
117
- if envelope is not None and envelope.ByteSize() > 0:
118
- self._responses.put(envelope)
119
- elif error is not None:
120
- # Inline application-level error — notify callbacks, keep stream open
127
+ inner_env = getattr(inner, "envelope", None)
128
+ inner_err = getattr(inner, "error", None)
129
+ if inner_env is not None and inner_env.ByteSize() > 0:
130
+ self._responses.put(inner_env)
131
+ elif inner_err is not None:
121
132
  for cb in self._inline_error_callbacks:
122
- cb(error)
123
- logger.warning("inline stream error: %s", error)
133
+ cb(inner_err)
134
+ logger.warning("inline stream error: %s", inner_err)
124
135
  continue
125
- else:
126
- # Flat format: response.envelope
127
- self._responses.put(response.envelope)
128
136
  except grpc.RpcError as exc:
129
137
  self._responses.put(exc)
130
138
  finally:
@@ -182,7 +190,7 @@ class MacpClient:
182
190
  root_certificates: bytes | None = None,
183
191
  default_timeout: float | None = None,
184
192
  client_name: str = "macp-sdk-python",
185
- client_version: str = "0.2.1",
193
+ client_version: str = "0.2.2",
186
194
  ) -> None:
187
195
  if secure is None:
188
196
  secure = not allow_insecure
macp_sdk/envelope.py CHANGED
@@ -1,6 +1,5 @@
1
1
  from __future__ import annotations
2
2
 
3
- import json
4
3
  import time
5
4
  import uuid
6
5
  from collections.abc import Iterable, Mapping, Sequence
@@ -47,16 +46,6 @@ def now_unix_ms() -> int:
47
46
  return int(time.time() * 1000)
48
47
 
49
48
 
50
- def encode_context(context: bytes | str | Mapping[str, object] | None) -> bytes:
51
- if context is None:
52
- return b""
53
- if isinstance(context, bytes):
54
- return context
55
- if isinstance(context, str):
56
- return context.encode("utf-8")
57
- return json.dumps(context).encode("utf-8")
58
-
59
-
60
49
  def build_root(uri: str, name: str = "") -> core_pb2.Root:
61
50
  return core_pb2.Root(uri=uri, name=name)
62
51
 
@@ -69,7 +58,8 @@ def build_session_start_payload(
69
58
  mode_version: str = DEFAULT_MODE_VERSION,
70
59
  configuration_version: str = DEFAULT_CONFIGURATION_VERSION,
71
60
  policy_version: str = DEFAULT_POLICY_VERSION,
72
- context: bytes | str | Mapping[str, object] | None = None,
61
+ context_id: str = "",
62
+ extensions: Mapping[str, bytes] | None = None,
73
63
  roots: Iterable[core_pb2.Root] | None = None,
74
64
  ) -> core_pb2.SessionStartPayload:
75
65
  return core_pb2.SessionStartPayload(
@@ -79,7 +69,8 @@ def build_session_start_payload(
79
69
  configuration_version=configuration_version,
80
70
  policy_version=policy_version,
81
71
  ttl_ms=ttl_ms,
82
- context=encode_context(context),
72
+ context_id=context_id,
73
+ extensions=dict(extensions) if extensions else {},
83
74
  roots=list(roots or []),
84
75
  )
85
76
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: macp-sdk-python
3
- Version: 0.2.1
3
+ Version: 0.2.2
4
4
  Summary: Python SDK for the MACP Rust runtime
5
5
  Author-email: OpenAI <support@openai.com>
6
6
  License: Apache-2.0
@@ -17,7 +17,7 @@ Description-Content-Type: text/markdown
17
17
  License-File: LICENSE
18
18
  Requires-Dist: grpcio>=1.74.0
19
19
  Requires-Dist: protobuf>=5.27.0
20
- Requires-Dist: macp-proto<0.2.0,>=0.1.0
20
+ Requires-Dist: macp-proto<0.2.0,>=0.1.1
21
21
  Provides-Extra: dev
22
22
  Requires-Dist: grpcio-tools>=1.74.0; extra == "dev"
23
23
  Requires-Dist: pytest>=8.0; extra == "dev"
@@ -2,11 +2,11 @@ macp_sdk/__init__.py,sha256=ASXCA-H3YkxOtpC3GAfaBUAoHU_nxboMvP_TqMUCEpY,5065
2
2
  macp_sdk/_logging.py,sha256=pHxyG89c9b_r8mcVSBA4E3e1GMAI5Jcc4_jslzKO6fM,431
3
3
  macp_sdk/auth.py,sha256=OnoLYjQTsHvj1nBMyIlcGtD-IoQy92RPXqSBKnY8ydA,2792
4
4
  macp_sdk/base_projection.py,sha256=j4mZmb2tua787qaK476xTY0o9MerjzCpT6SE1rTU8Ug,1708
5
- macp_sdk/base_session.py,sha256=gLXwBEmtHfYDrnPY1A1dhMP_zNvSwfIqwXea415SoFM,5903
6
- macp_sdk/client.py,sha256=xrkch_Ekajg9TbCVk3AAcEng-fwf6G8cOuo6OI0FEhs,23152
5
+ macp_sdk/base_session.py,sha256=EmaWmGboFvnJnvZMKXc0A3B0XUXZZVe5kMwuBtIV_P4,5962
6
+ macp_sdk/client.py,sha256=SJbwDyl-2qfzAUdNENUm75Dxdm2G4_f-SrZKX5i87UA,23477
7
7
  macp_sdk/constants.py,sha256=7BaQC6qycmPEc1ChOQVDxlhEBsBdI-RQBT07BQ2Uiis,481
8
8
  macp_sdk/decision.py,sha256=pjsz-KTuVw9wcDu3-ube_W6A_5pdRpV2wtupf0JgfO8,5265
9
- macp_sdk/envelope.py,sha256=VOK2cm9UGfL8ISkgcWLMNk1i_ZBjrrkYVjjX8xftaaY,5239
9
+ macp_sdk/envelope.py,sha256=1sdDZPcmUcaHzgCCfZ6PcYryaf2zeNmvggy6KBDGcco,4987
10
10
  macp_sdk/errors.py,sha256=CDMe-AyMDlAm3uWZZTylkuc0LoNbPH9cK28EnvrFzjs,3260
11
11
  macp_sdk/handoff.py,sha256=EC61SdkZ_iLR6ab95G7atDhTT8Ie3SeCqHaJv8Omujo,8234
12
12
  macp_sdk/policy.py,sha256=v9F0AzgA-InNFEe2TATwmXZ_-TM0H6W5L7X14TDH1AY,8986
@@ -21,13 +21,13 @@ macp_sdk/validation.py,sha256=p2vFJ_jc25G-JseFFoUkt7oc8P1gEWtsiOepu0mh1Sk,4190
21
21
  macp_sdk/watchers.py,sha256=TlNzuC5ixF2AnCp9fh44WZhX1VLNbWCE_52gRYZ-XJU,4466
22
22
  macp_sdk/agent/__init__.py,sha256=mZWG35fCqp-80EK2cpq4N5nZ6dlQ3NDwKAboPJlp7T8,1412
23
23
  macp_sdk/agent/dispatcher.py,sha256=t1wLYGpqJdm2nIaaEVStp_8zUIetHL8FT2wYNniLDTA,3972
24
- macp_sdk/agent/participant.py,sha256=_pMMLtZk1DBU4amFTfjI3REeGgoaur3adm_nXMQrVzM,12732
25
- macp_sdk/agent/runner.py,sha256=wWVdVP4HWz5zVyu3-t2FxdS3JPYq6X1tluY-AB_eCYA,3525
24
+ macp_sdk/agent/participant.py,sha256=yzpxK3gmetmmh3IyfomeHokVR-6szbJdmzt2ogpm00I,15509
25
+ macp_sdk/agent/runner.py,sha256=dGvx4B2SlAsO-cqtVU8rQCPqzVxbxxsJ2Uf3ww4a5vI,5084
26
26
  macp_sdk/agent/strategies.py,sha256=oCUeTE3fhDJu96OBA_BWei7E1GbAaWvmJlgmhhRTUUo,10489
27
- macp_sdk/agent/transports.py,sha256=gv2U2aNYLexkNZz1cef5CIA9ubIZ9jyFi_yGEG7vT1s,5058
27
+ macp_sdk/agent/transports.py,sha256=VU3dTNIELMTU-5kTxZOE7jxvw1NqSroUi28OkUD0NvM,5430
28
28
  macp_sdk/agent/types.py,sha256=wtlF-tTRGnEGHhYknhu-5ZzOBZ1pRQ5GjYLKBR4YzQg,1610
29
- macp_sdk_python-0.2.1.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
30
- macp_sdk_python-0.2.1.dist-info/METADATA,sha256=OV0OZOKVxIQxM6obJTZFxafBrbPj_QCrj0kkEhHivTI,5434
31
- macp_sdk_python-0.2.1.dist-info/WHEEL,sha256=aeYiig01lYGDzBgS8HxWXOg3uV61G9ijOsup-k9o1sk,91
32
- macp_sdk_python-0.2.1.dist-info/top_level.txt,sha256=AoSstnUrSaVCCQw4KLxLkpO-9BLoVZ230mPBR6z-jh8,9
33
- macp_sdk_python-0.2.1.dist-info/RECORD,,
29
+ macp_sdk_python-0.2.2.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
30
+ macp_sdk_python-0.2.2.dist-info/METADATA,sha256=q60i3JhbmxWK5Ne9O88Yqpvqm42A-Fv-gxt6r0aMHmI,5434
31
+ macp_sdk_python-0.2.2.dist-info/WHEEL,sha256=aeYiig01lYGDzBgS8HxWXOg3uV61G9ijOsup-k9o1sk,91
32
+ macp_sdk_python-0.2.2.dist-info/top_level.txt,sha256=AoSstnUrSaVCCQw4KLxLkpO-9BLoVZ230mPBR6z-jh8,9
33
+ macp_sdk_python-0.2.2.dist-info/RECORD,,