Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
84 changes: 84 additions & 0 deletions amplifier_app_cli/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -626,6 +626,10 @@ async def _handle_mode(self, args: str) -> str:
# /mode off - clear any active mode
if args == "off":
if current_mode:
# Emit mode:cleared BEFORE state mutation so hooks see the old state
await self.session.coordinator.hooks.emit(
"mode:cleared", {"name": current_mode, "previous_mode": current_mode}
)
session_state["active_mode"] = None
# Reset warnings in mode hooks if present
mode_hooks = session_state.get("mode_hooks")
Expand Down Expand Up @@ -660,6 +664,42 @@ async def _handle_mode(self, args: str) -> str:
if explicit_state == "on":
if current_mode == mode_name:
return f"Already in {mode_name} mode"
_prev = current_mode
# Emit lifecycle event BEFORE state mutation so hooks see the old state.
# Build full payload from mode_def when discovery is available.
if _prev and _prev != mode_name:
_payload: dict = {
"old": _prev,
"new": mode_name,
"from_mode": _prev,
"to_mode": mode_name,
}
if discovery:
_payload.update(
{
"description": mode_def.description,
"default_action": mode_def.default_action,
"safe_tools": mode_def.safe_tools,
"warn_tools": mode_def.warn_tools,
"confirm_tools": mode_def.confirm_tools,
"block_tools": mode_def.block_tools,
}
)
await self.session.coordinator.hooks.emit("mode:changed", _payload)
else:
_payload = {"name": mode_name, "mode": mode_name}
if discovery:
_payload.update(
{
"description": mode_def.description,
"default_action": mode_def.default_action,
"safe_tools": mode_def.safe_tools,
"warn_tools": mode_def.warn_tools,
"confirm_tools": mode_def.confirm_tools,
"block_tools": mode_def.block_tools,
}
)
await self.session.coordinator.hooks.emit("mode:activated", _payload)
session_state["active_mode"] = mode_name
mode_hooks = session_state.get("mode_hooks")
if mode_hooks and hasattr(mode_hooks, "reset_warnings"):
Expand All @@ -669,6 +709,10 @@ async def _handle_mode(self, args: str) -> str:
if explicit_state == "off":
if current_mode != mode_name:
return f"Not in {mode_name} mode"
# Emit mode:cleared BEFORE state mutation so hooks see the old state
await self.session.coordinator.hooks.emit(
"mode:cleared", {"name": mode_name, "previous_mode": mode_name}
)
session_state["active_mode"] = None
mode_hooks = session_state.get("mode_hooks")
if mode_hooks and hasattr(mode_hooks, "reset_warnings"):
Expand All @@ -677,12 +721,52 @@ async def _handle_mode(self, args: str) -> str:

# Toggle behavior (no explicit on/off)
if current_mode == mode_name:
# Emit mode:cleared BEFORE state mutation so hooks see the old state
await self.session.coordinator.hooks.emit(
"mode:cleared", {"name": mode_name, "previous_mode": mode_name}
)
session_state["active_mode"] = None
mode_hooks = session_state.get("mode_hooks")
if mode_hooks and hasattr(mode_hooks, "reset_warnings"):
mode_hooks.reset_warnings()
return f"Mode off: {mode_name}"
else:
_prev_toggle = current_mode
# Emit lifecycle event BEFORE state mutation so hooks see the old state.
# Build full payload from mode_def when discovery is available.
if _prev_toggle:
_payload = {
"old": _prev_toggle,
"new": mode_name,
"from_mode": _prev_toggle,
"to_mode": mode_name,
}
if discovery:
_payload.update(
{
"description": mode_def.description,
"default_action": mode_def.default_action,
"safe_tools": mode_def.safe_tools,
"warn_tools": mode_def.warn_tools,
"confirm_tools": mode_def.confirm_tools,
"block_tools": mode_def.block_tools,
}
)
await self.session.coordinator.hooks.emit("mode:changed", _payload)
else:
_payload = {"name": mode_name, "mode": mode_name}
if discovery:
_payload.update(
{
"description": mode_def.description,
"default_action": mode_def.default_action,
"safe_tools": mode_def.safe_tools,
"warn_tools": mode_def.warn_tools,
"confirm_tools": mode_def.confirm_tools,
"block_tools": mode_def.block_tools,
}
)
await self.session.coordinator.hooks.emit("mode:activated", _payload)
session_state["active_mode"] = mode_name
mode_hooks = session_state.get("mode_hooks")
if mode_hooks and hasattr(mode_hooks, "reset_warnings"):
Expand Down
Loading