chore: extend [SYSTEM:→[IMPORTANT: rename + AUTHOR_MAP
Follow-up to #6616 covering the remaining user-injected prompt markers that the original PR did not touch (reporter's second comment on #6576 explicitly flagged these). Azure OpenAI Default/DefaultV2 content filters treat any bracketed [SYSTEM: ...] as prompt-injection and reject with HTTP 400. Remaining call sites renamed: - cli.py: background-process notifications (watch_disabled, watch_match, completion), MCP reload notice (4 live + 1 docstring) - gateway/run.py: same notification paths + auto-loaded skill banner + MCP reload notice (5 live + 1 docstring) - tools/process_registry.py: comment reference Not renamed: - environments/hermes_base_env.py '[SYSTEM]\n{content}' — RL training trajectory rendering only, never sent to Azure, part of a symmetric [USER]/[ASSISTANT]/[TOOL] scheme. AUTHOR_MAP: buraysandro9@gmail.com -> ygd58.
This commit is contained in:
10
cli.py
10
cli.py
@@ -1378,7 +1378,7 @@ def _resolve_attachment_path(raw_path: str) -> Path | None:
|
|||||||
|
|
||||||
|
|
||||||
def _format_process_notification(evt: dict) -> "str | None":
|
def _format_process_notification(evt: dict) -> "str | None":
|
||||||
"""Format a process notification event into a [SYSTEM: ...] message.
|
"""Format a process notification event into a [IMPORTANT: ...] message.
|
||||||
|
|
||||||
Handles both completion events (notify_on_complete) and watch pattern
|
Handles both completion events (notify_on_complete) and watch pattern
|
||||||
match events from the unified completion_queue.
|
match events from the unified completion_queue.
|
||||||
@@ -1388,14 +1388,14 @@ def _format_process_notification(evt: dict) -> "str | None":
|
|||||||
_cmd = evt.get("command", "unknown")
|
_cmd = evt.get("command", "unknown")
|
||||||
|
|
||||||
if evt_type == "watch_disabled":
|
if evt_type == "watch_disabled":
|
||||||
return f"[SYSTEM: {evt.get('message', '')}]"
|
return f"[IMPORTANT: {evt.get('message', '')}]"
|
||||||
|
|
||||||
if evt_type == "watch_match":
|
if evt_type == "watch_match":
|
||||||
_pat = evt.get("pattern", "?")
|
_pat = evt.get("pattern", "?")
|
||||||
_out = evt.get("output", "")
|
_out = evt.get("output", "")
|
||||||
_sup = evt.get("suppressed", 0)
|
_sup = evt.get("suppressed", 0)
|
||||||
text = (
|
text = (
|
||||||
f"[SYSTEM: Background process {_sid} matched "
|
f"[IMPORTANT: Background process {_sid} matched "
|
||||||
f"watch pattern \"{_pat}\".\n"
|
f"watch pattern \"{_pat}\".\n"
|
||||||
f"Command: {_cmd}\n"
|
f"Command: {_cmd}\n"
|
||||||
f"Matched output:\n{_out}"
|
f"Matched output:\n{_out}"
|
||||||
@@ -1409,7 +1409,7 @@ def _format_process_notification(evt: dict) -> "str | None":
|
|||||||
_exit = evt.get("exit_code", "?")
|
_exit = evt.get("exit_code", "?")
|
||||||
_out = evt.get("output", "")
|
_out = evt.get("output", "")
|
||||||
return (
|
return (
|
||||||
f"[SYSTEM: Background process {_sid} completed "
|
f"[IMPORTANT: Background process {_sid} completed "
|
||||||
f"(exit code {_exit}).\n"
|
f"(exit code {_exit}).\n"
|
||||||
f"Command: {_cmd}\n"
|
f"Command: {_cmd}\n"
|
||||||
f"Output:\n{_out}]"
|
f"Output:\n{_out}]"
|
||||||
@@ -7217,7 +7217,7 @@ class HermesCLI:
|
|||||||
change_detail = ". ".join(change_parts) + ". " if change_parts else ""
|
change_detail = ". ".join(change_parts) + ". " if change_parts else ""
|
||||||
self.conversation_history.append({
|
self.conversation_history.append({
|
||||||
"role": "user",
|
"role": "user",
|
||||||
"content": f"[SYSTEM: MCP servers have been reloaded. {change_detail}{tool_summary}. The tool list for this conversation has been updated accordingly.]",
|
"content": f"[IMPORTANT: MCP servers have been reloaded. {change_detail}{tool_summary}. The tool list for this conversation has been updated accordingly.]",
|
||||||
})
|
})
|
||||||
|
|
||||||
# Persist session immediately so the session log reflects the
|
# Persist session immediately so the session log reflects the
|
||||||
|
|||||||
@@ -591,20 +591,20 @@ def _parse_session_key(session_key: str) -> "dict | None":
|
|||||||
|
|
||||||
|
|
||||||
def _format_gateway_process_notification(evt: dict) -> "str | None":
|
def _format_gateway_process_notification(evt: dict) -> "str | None":
|
||||||
"""Format a watch pattern event from completion_queue into a [SYSTEM:] message."""
|
"""Format a watch pattern event from completion_queue into a [IMPORTANT:] message."""
|
||||||
evt_type = evt.get("type", "completion")
|
evt_type = evt.get("type", "completion")
|
||||||
_sid = evt.get("session_id", "unknown")
|
_sid = evt.get("session_id", "unknown")
|
||||||
_cmd = evt.get("command", "unknown")
|
_cmd = evt.get("command", "unknown")
|
||||||
|
|
||||||
if evt_type == "watch_disabled":
|
if evt_type == "watch_disabled":
|
||||||
return f"[SYSTEM: {evt.get('message', '')}]"
|
return f"[IMPORTANT: {evt.get('message', '')}]"
|
||||||
|
|
||||||
if evt_type == "watch_match":
|
if evt_type == "watch_match":
|
||||||
_pat = evt.get("pattern", "?")
|
_pat = evt.get("pattern", "?")
|
||||||
_out = evt.get("output", "")
|
_out = evt.get("output", "")
|
||||||
_sup = evt.get("suppressed", 0)
|
_sup = evt.get("suppressed", 0)
|
||||||
text = (
|
text = (
|
||||||
f"[SYSTEM: Background process {_sid} matched "
|
f"[IMPORTANT: Background process {_sid} matched "
|
||||||
f"watch pattern \"{_pat}\".\n"
|
f"watch pattern \"{_pat}\".\n"
|
||||||
f"Command: {_cmd}\n"
|
f"Command: {_cmd}\n"
|
||||||
f"Matched output:\n{_out}"
|
f"Matched output:\n{_out}"
|
||||||
@@ -4232,7 +4232,7 @@ class GatewayRunner:
|
|||||||
if _loaded:
|
if _loaded:
|
||||||
_loaded_skill, _skill_dir, _display_name = _loaded
|
_loaded_skill, _skill_dir, _display_name = _loaded
|
||||||
_note = (
|
_note = (
|
||||||
f'[SYSTEM: The "{_display_name}" skill is auto-loaded. '
|
f'[IMPORTANT: The "{_display_name}" skill is auto-loaded. '
|
||||||
f"Follow its instructions for this session.]"
|
f"Follow its instructions for this session.]"
|
||||||
)
|
)
|
||||||
_part = _build_skill_message(_loaded_skill, _skill_dir, _note)
|
_part = _build_skill_message(_loaded_skill, _skill_dir, _note)
|
||||||
@@ -7473,7 +7473,7 @@ class GatewayRunner:
|
|||||||
change_detail = ". ".join(change_parts) + ". " if change_parts else ""
|
change_detail = ". ".join(change_parts) + ". " if change_parts else ""
|
||||||
reload_msg = {
|
reload_msg = {
|
||||||
"role": "user",
|
"role": "user",
|
||||||
"content": f"[SYSTEM: MCP servers have been reloaded. {change_detail}{tool_summary}. The tool list for this conversation has been updated accordingly.]",
|
"content": f"[IMPORTANT: MCP servers have been reloaded. {change_detail}{tool_summary}. The tool list for this conversation has been updated accordingly.]",
|
||||||
}
|
}
|
||||||
try:
|
try:
|
||||||
session_entry = self.session_store.get_or_create_session(event.source)
|
session_entry = self.session_store.get_or_create_session(event.source)
|
||||||
@@ -8412,7 +8412,7 @@ class GatewayRunner:
|
|||||||
from tools.ansi_strip import strip_ansi
|
from tools.ansi_strip import strip_ansi
|
||||||
_out = strip_ansi(session.output_buffer[-2000:]) if session.output_buffer else ""
|
_out = strip_ansi(session.output_buffer[-2000:]) if session.output_buffer else ""
|
||||||
synth_text = (
|
synth_text = (
|
||||||
f"[SYSTEM: Background process {session_id} completed "
|
f"[IMPORTANT: Background process {session_id} completed "
|
||||||
f"(exit code {session.exit_code}).\n"
|
f"(exit code {session.exit_code}).\n"
|
||||||
f"Command: {session.command}\n"
|
f"Command: {session.command}\n"
|
||||||
f"Output:\n{_out}]"
|
f"Output:\n{_out}]"
|
||||||
|
|||||||
@@ -119,6 +119,7 @@ AUTHOR_MAP = {
|
|||||||
"nocoo@users.noreply.github.com": "nocoo",
|
"nocoo@users.noreply.github.com": "nocoo",
|
||||||
"30841158+n-WN@users.noreply.github.com": "n-WN",
|
"30841158+n-WN@users.noreply.github.com": "n-WN",
|
||||||
"tsuijinglei@gmail.com": "hiddenpuppy",
|
"tsuijinglei@gmail.com": "hiddenpuppy",
|
||||||
|
"buraysandro9@gmail.com": "ygd58",
|
||||||
"jerome@clawwork.ai": "HiddenPuppy",
|
"jerome@clawwork.ai": "HiddenPuppy",
|
||||||
"jerome.benoit@sap.com": "jerome-benoit",
|
"jerome.benoit@sap.com": "jerome-benoit",
|
||||||
"wysie@users.noreply.github.com": "Wysie",
|
"wysie@users.noreply.github.com": "Wysie",
|
||||||
|
|||||||
@@ -776,7 +776,7 @@ class ProcessRegistry:
|
|||||||
|
|
||||||
# Only enqueue completion notification on the FIRST move. Without
|
# Only enqueue completion notification on the FIRST move. Without
|
||||||
# this guard, kill_process() and the reader thread can both call
|
# this guard, kill_process() and the reader thread can both call
|
||||||
# _move_to_finished(), producing duplicate [SYSTEM: ...] messages.
|
# _move_to_finished(), producing duplicate [IMPORTANT: ...] messages.
|
||||||
if was_running and session.notify_on_complete:
|
if was_running and session.notify_on_complete:
|
||||||
from tools.ansi_strip import strip_ansi
|
from tools.ansi_strip import strip_ansi
|
||||||
output_tail = strip_ansi(session.output_buffer[-2000:]) if session.output_buffer else ""
|
output_tail = strip_ansi(session.output_buffer[-2000:]) if session.output_buffer else ""
|
||||||
|
|||||||
Reference in New Issue
Block a user