feat: forward agent display identity to prompts
lint / lint (push) Successful in 1m26s
test / unit (pull_request) Successful in 32s
test / integration (pull_request) Successful in 16s

This commit is contained in:
2026-06-09 03:39:54 +00:00
parent e6040fc824
commit 0a564bb41e
6 changed files with 121 additions and 3 deletions
+1
View File
@@ -107,6 +107,7 @@ class AgentProvisionPlan:
instance_name: str
prompt_file: Path
guest_env: dict[str, str]
has_prompt: bool = False
env_vars: dict[str, str] = field(default_factory=dict)
dirs: tuple[AgentProvisionDir, ...] = ()
files: tuple[AgentProvisionFile, ...] = ()
+24 -1
View File
@@ -38,6 +38,27 @@ def _skills_dir(guest_home: str) -> str:
def _prompt_path(guest_home: str) -> str:
return f"{guest_home}/.bot-bottle-prompt.txt"
def _display_identity_prompt(label: str, color: str) -> str:
lines: list[str] = []
if label:
lines.append(f"Name: {label}")
if color:
lines.append(f"Color: {color}")
if not lines:
return ""
return "Bot-bottle agent display identity:\n" + "\n".join(lines)
def _prepend_display_identity(prompt_file: Path, label: str, color: str) -> bool:
identity = _display_identity_prompt(label, color)
original = prompt_file.read_text() if prompt_file.exists() else ""
if not identity:
return bool(original)
prompt_file.write_text(f"{identity}\n\n{original}" if original else f"{identity}\n")
return True
_RUNTIME = AgentProviderRuntime(
template="claude",
command="claude",
@@ -106,6 +127,7 @@ class ClaudeAgentProvider(AgentProvider):
env_vars["CLAUDE_CODE_OAUTH_TOKEN"] = "egress-placeholder"
hidden_env_names = frozenset({"CLAUDE_CODE_OAUTH_TOKEN"})
has_prompt = _prepend_display_identity(prompt_file, label, color)
return AgentProvisionPlan(
template=_RUNTIME.template,
command=_RUNTIME.command,
@@ -117,6 +139,7 @@ class ClaudeAgentProvider(AgentProvider):
prompt_file=prompt_file,
env_vars=env_vars,
guest_env=resolved_guest_env,
has_prompt=has_prompt,
files=files,
egress_routes=egress_routes,
hidden_env_names=hidden_env_names,
@@ -158,7 +181,7 @@ class ClaudeAgentProvider(AgentProvider):
user="root",
)
agent = plan.spec.manifest.agents[plan.spec.agent_name]
return prompt_path if agent.prompt else None
return prompt_path if plan.agent_provision.has_prompt or agent.prompt else None
def provision(self, plan: "BottlePlan", bottle: "Bottle") -> None:
"""Apply the claude-side declarative provision steps from
+25 -2
View File
@@ -46,6 +46,27 @@ def _skills_dir(guest_home: str) -> str:
def _prompt_path(guest_home: str) -> str:
return f"{guest_home}/.bot-bottle-prompt.txt"
def _display_identity_prompt(label: str, color: str) -> str:
lines: list[str] = []
if label:
lines.append(f"Name: {label}")
if color:
lines.append(f"Color: {color}")
if not lines:
return ""
return "Bot-bottle agent display identity:\n" + "\n".join(lines)
def _prepend_display_identity(prompt_file: Path, label: str, color: str) -> bool:
identity = _display_identity_prompt(label, color)
original = prompt_file.read_text() if prompt_file.exists() else ""
if not identity:
return bool(original)
prompt_file.write_text(f"{identity}\n\n{original}" if original else f"{identity}\n")
return True
_RUNTIME = AgentProviderRuntime(
template="codex",
command="codex",
@@ -77,7 +98,7 @@ class CodexAgentProvider(AgentProvider):
label: str = "",
color: str = "",
) -> AgentProvisionPlan:
del auth_token, label, color # Claude-only knobs
del auth_token # Claude-only knob
resolved_guest_env = dict(guest_env or {})
guest_home = self.guest_home
trusted_path = trusted_project_path or guest_home
@@ -143,6 +164,7 @@ class CodexAgentProvider(AgentProvider):
"guest, but Codex did not accept it"
)))
has_prompt = _prepend_display_identity(prompt_file, label, color)
return AgentProvisionPlan(
template=_RUNTIME.template,
command=_RUNTIME.command,
@@ -154,6 +176,7 @@ class CodexAgentProvider(AgentProvider):
prompt_file=prompt_file,
env_vars=env_vars,
guest_env=resolved_guest_env,
has_prompt=has_prompt,
dirs=tuple(dirs),
files=tuple(files),
pre_copy=tuple(pre_copy),
@@ -198,7 +221,7 @@ class CodexAgentProvider(AgentProvider):
user="root",
)
agent = plan.spec.manifest.agents[plan.spec.agent_name]
return prompt_path if agent.prompt else None
return prompt_path if plan.agent_provision.has_prompt or agent.prompt else None
def provision(self, plan: "BottlePlan", bottle: "Bottle") -> None:
"""Apply the codex-side declarative provision steps from