Skip to content

Commit 3f67569

Browse files
committed
fix: dev_mode SimpleGuard skips agent-card.json, add client.guard property
- Reorder _resolve_identity() so dev_mode (Case 3) takes priority over legacy agent-card.json loading (now Case 4). An A2A agent-card.json without public_keys no longer crashes SimpleGuard in dev_mode. - Skip directory walking in _resolve_project_root() when dev_mode=True - Add guard @Property on AgentIdentity for CapiscIO.connect() result
1 parent 44ea21e commit 3f67569

2 files changed

Lines changed: 25 additions & 12 deletions

File tree

capiscio_sdk/connect.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -212,6 +212,17 @@ class AgentIdentity:
212212
_keeper: Any = field(default=None, repr=False)
213213
_emitter: Any = field(default=None, repr=False)
214214

215+
@property
216+
def guard(self) -> "SimpleGuard":
217+
"""Access the SimpleGuard instance for signing/verifying."""
218+
if self._guard is None:
219+
from .simple_guard import SimpleGuard
220+
self._guard = SimpleGuard(
221+
agent_id=self.did or self.agent_id,
222+
base_dir=str(self.keys_dir.parent),
223+
)
224+
return self._guard
225+
215226
def emit(self, event_type: str, data: Dict[str, Any]) -> bool:
216227
"""Emit an event to the registry."""
217228
if not self._emitter:

capiscio_sdk/simple_guard.py

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -213,13 +213,13 @@ def __exit__(self, exc_type, exc_val, exc_tb) -> None:
213213
def _resolve_project_root(self, base_dir: Optional[Union[str, Path]]) -> Path:
214214
"""Resolve the project root directory.
215215
216-
When agent_id is provided explicitly, uses base_dir (or cwd) directly
217-
without walking up the tree looking for agent-card.json.
216+
When agent_id is provided explicitly or dev_mode is True, uses base_dir
217+
(or cwd) directly without walking up the tree looking for agent-card.json.
218218
"""
219219
current = Path(base_dir or os.getcwd()).resolve()
220220

221-
# When identity params are provided, don't walk looking for agent-card.json
222-
if self._explicit_agent_id:
221+
# When identity params are provided or in dev_mode, don't walk looking for agent-card.json
222+
if self._explicit_agent_id or self.dev_mode:
223223
return current
224224

225225
search_path = current
@@ -246,7 +246,16 @@ def _resolve_identity(self) -> None:
246246
logger.info(f"Using explicit agent_id: {self.agent_id}")
247247
return
248248

249-
# Case 3: Legacy agent-card.json (deprecated path)
249+
# Case 3: Dev mode — placeholder until key generation
250+
# (checked before legacy agent-card.json so dev_mode isn't
251+
# broken by an A2A agent-card.json that lacks public_keys)
252+
if self.dev_mode:
253+
logger.info("Dev Mode: Will generate did:key identity from keypair")
254+
self.agent_id = "local-dev-agent"
255+
self.signing_kid = "local-dev-key"
256+
return
257+
258+
# Case 4: Legacy agent-card.json (deprecated path)
250259
agent_card_path = self.project_root / "agent-card.json"
251260
if agent_card_path.exists():
252261
logger.warning(
@@ -269,13 +278,6 @@ def _resolve_identity(self) -> None:
269278
except Exception as e:
270279
raise ConfigurationError(f"Failed to load agent-card.json: {e}")
271280
return
272-
273-
# Case 4: Dev mode — placeholder until key generation
274-
if self.dev_mode:
275-
logger.info("Dev Mode: Will generate did:key identity from keypair")
276-
self.agent_id = "local-dev-agent"
277-
self.signing_kid = "local-dev-key"
278-
return
279281

280282
raise ConfigurationError(
281283
"No agent identity configured. Either:\n"

0 commit comments

Comments
 (0)