import re
with open("src/main.rs", "r") as f:
content = f.read()
content = content.replace("AnthropicRuntimeClient", "RfiIrfosRuntimeClient")
content = content.replace(
"""impl ApiClient for RfiIrfosRuntimeClient {
fn stream(
&self,""",
"""impl ApiClient for RfiIrfosRuntimeClient {
fn stream(
&mut self,""")
content = content.replace(
""" async fn stream_async(
&self,""",
""" async fn stream_async(
&mut self,""")
content = content.replace(
"""impl ToolExecutor for CliToolExecutor {
fn execute(
&self,
tool_name: &str,
input: serde_json::Value,
) -> Result<String, ToolError> {
execute_tool(tool_name, &input)
}
}""",
"""impl ToolExecutor for CliToolExecutor {
fn execute(
&mut self,
tool_name: &str,
input: serde_json::Value,
) -> Result<String, ToolError> {
execute_tool(tool_name, &input).map_err(|e| ToolError::ExecutionError(e))
}
}""")
content = content.replace(
""" let (api_key, model) =
if let Some(provider_name) = config.features().and_then(|f| f.default_provider()) {
if let Some(provider) = config.providers().and_then(|p| p.get(provider_name)) {
(
provider.api_key.clone(),
provider.model.clone().unwrap_or(model),
)
} else {
(None, model)
}
} else {
(None, model)
};""",
""" let (api_key, model) = (None, model);""")
content = content.replace(
""" .map_err(|error| RuntimeError::new(error.to_string()))""",
""" .map_err(|error| api::ApiError::Auth(error.to_string()))""")
content = content.replace(
""" Ok(ConversationRuntime::new(
session,
api_client,
Box::new(tool_executor),
permission_policy,
system_prompt,
None,
))""",
""" Ok(ConversationRuntime::new(
session,
api_client,
tool_executor,
permission_policy,
system_prompt,
))""")
content = content.replace(
""" ContentBlock::ToolResult { tool_use_id, output } => InputContentBlock::ToolResult {""",
""" ContentBlock::ToolResult { tool_use_id, output, tool_name: _, is_error: _ } => InputContentBlock::ToolResult {""")
content = content.replace(
""" ContentBlock::ToolResult { tool_use_id, output } => Some(json!({""",
""" ContentBlock::ToolResult { tool_use_id, output, tool_name: _, is_error: _ } => Some(json!({""")
content = content.replace(
"""fn map_content_block(block: ContentBlock) -> InputContentBlock {
match block {
ContentBlock::Text { text } => InputContentBlock::Text { text },
ContentBlock::ToolUse { id, name, input } => InputContentBlock::ToolUse { id, name, input },
ContentBlock::ToolResult { tool_use_id, output, tool_name: _, is_error: _ } => InputContentBlock::ToolResult {
tool_use_id,
content: vec![ToolResultContentBlock::Text { text: output }],
is_error: Some(false),
},
}
}""",
"""fn map_content_block(block: ContentBlock) -> InputContentBlock {
match block {
ContentBlock::Text { text } => InputContentBlock::Text { text },
ContentBlock::ToolUse { id, name, input } => InputContentBlock::ToolUse { id, name, input: serde_json::Value::String(input) },
ContentBlock::ToolResult { tool_use_id, output, tool_name: _, is_error: _ } => InputContentBlock::ToolResult {
tool_use_id,
content: vec![ToolResultContentBlock::Text { text: output }],
is_error: false,
},
}
}""")
content = content.replace(
""" cache_creation_input_tokens: usage.cache_creation_input_tokens.unwrap_or(0),
cache_read_input_tokens: usage.cache_read_input_tokens.unwrap_or(0),""",
""" cache_creation_input_tokens: usage.cache_creation_input_tokens,
cache_read_input_tokens: usage.cache_read_input_tokens,""")
content = content.replace(
""" PermissionMode::DangerFullAccess => runtime::PermissionPromptDecision::Allow,
};""",
""" PermissionMode::DangerFullAccess => runtime::PermissionPromptDecision::Allow,
PermissionMode::Prompt => runtime::PermissionPromptDecision::Allow,
PermissionMode::Allow => runtime::PermissionPromptDecision::Allow,
};""")
content = content.replace(
""" Some(1) => {
return runtime::PermissionPromptDecision::Deny {
reason: "user denied".to_string(),
}
}
None => {""",
""" Some(1) => {
return runtime::PermissionPromptDecision::Deny {
reason: "user denied".to_string(),
}
}
Some(_) => {
return runtime::PermissionPromptDecision::Deny {
reason: "invalid choice".to_string(),
}
}
None => {""")
content = content.replace(
""" ApiStreamEvent::ContentBlockStart(payload) => match &payload.content_block {
OutputContentBlock::ToolUse { id, name, input } => Some(AssistantEvent::ToolUse {
id: id.clone(),
name: name.clone(),
input: input.clone(),
}),""",
""" ApiStreamEvent::ContentBlockStart(payload) => match &payload.content_block {
OutputContentBlock::ToolUse { id, name, input } => Some(AssistantEvent::ToolUse {
id: id.clone(),
name: name.clone(),
input: input.to_string(),
}),""")
missing_funcs = """
fn resolve_export_path(requested_path: Option<&str>, session: &Session) -> Result<PathBuf, Box<dyn std::error::Error>> {
Ok(PathBuf::from(requested_path.unwrap_or("export.txt")))
}
fn render_export_text(session: &Session) -> String {
"".to_string()
}
fn render_teleport_report(target: &str) -> Result<String, Box<dyn std::error::Error>> {
Ok("".to_string())
}
fn render_last_tool_debug_report(session: &Session) -> Result<String, Box<dyn std::error::Error>> {
Ok("".to_string())
}
"""
content += missing_funcs
with open("src/main.rs", "w") as f:
f.write(content)