57 lines
2.1 KiB
Python
57 lines
2.1 KiB
Python
"""
|
|
Builds a user-safe, read-only capability summary for the Emma system prompt.
|
|
"""
|
|
|
|
from typing import List, Dict
|
|
from capability_registry import Availability, Capability, list_capabilities
|
|
|
|
|
|
def build_capability_system_context() -> str:
|
|
"""
|
|
Builds a deterministic, user-safe, plain-text summary of capabilities.
|
|
|
|
The output is structured for inclusion in a system prompt and must not leak
|
|
internal details.
|
|
"""
|
|
categorized: Dict[Availability, List[str]] = {
|
|
Availability.ACTIVE: [],
|
|
Availability.PLANNED: [],
|
|
Availability.FORBIDDEN: [],
|
|
}
|
|
|
|
for capability in list_capabilities():
|
|
if capability.availability == Availability.FORBIDDEN:
|
|
if capability.id == "terminal.arbitrary_shell":
|
|
categorized[Availability.FORBIDDEN].append(
|
|
"- Arbitrary terminal access is not available."
|
|
)
|
|
continue
|
|
|
|
if capability.availability in categorized:
|
|
categorized[capability.availability].append(
|
|
f"- {capability.display_name}: {capability.description}"
|
|
)
|
|
|
|
output_lines = ["CURRENT CAPABILITY STATUS FOR THIS CHAT"]
|
|
|
|
if categorized[Availability.ACTIVE]:
|
|
output_lines.append("\nAvailable now:")
|
|
output_lines.extend(categorized[Availability.ACTIVE])
|
|
|
|
if categorized[Availability.PLANNED]:
|
|
output_lines.append("\nPlanned, but not active in this chat:")
|
|
output_lines.extend(categorized[Availability.PLANNED])
|
|
|
|
if categorized[Availability.FORBIDDEN]:
|
|
output_lines.append("\nUnavailable:")
|
|
output_lines.extend(categorized[Availability.FORBIDDEN])
|
|
|
|
output_lines.append(
|
|
"\nRules:\n"
|
|
"- Planned capabilities are not available in this chat and must not be claimed as active.\n"
|
|
"- No tool, repository, deployment, memory, document retrieval, external service or state-changing action is activated by this capability summary.\n"
|
|
"- Future write or high-impact capabilities require a concrete, explicit, bound user approval before execution."
|
|
)
|
|
|
|
return "\n".join(output_lines)
|