feat: the product says its own name, and can be driven from outside

Branding. The reported "OpenAI Codex" was not a banner — the TUI banner has
said "Welcome to Code" all along. It was the model describing itself. Every
request carries BASE_INSTRUCTIONS, and `zen5-coder` matches none of the
OpenAI slug prefixes in find_family_for_model, so it lands on
derive_default_model_family -> core/prompt.md, whose first line read "You are
a coding agent running in the Codex CLI ... led by OpenAI". The agent was
told who it was, and it answered honestly.

Fixed the harness identity in all eight prompts (keeping each model's own
identity: "based on GPT-5" stays, the harness around it becomes Hanzo Dev),
the per-turn header, approval and model pickers, the login success page, MCP
tool titles and approval prompts on both client and server sides, seatbelt
policy header, cloud copy, two stale User-Agents, and the CLI hints that
named the wrong binary. Golden JSON fixtures moved with the code they assert.

Deliberately NOT changed, because they are wire and not text: `OPENAI_*` and
`CODEX_*` env vars, the `codex`/`codex-reply` MCP tool names and the
`code-mcp-server` server name (hosts key allowlists off them), `codex.*` OTEL
event names, the `openai` provider id, model slugs, `~/.code` on disk, and
the `https://api.openai.com/auth` JWT claim namespace.

Control. `cli/src/proto.rs` was a complete bidirectional control plane —
Submission JSON lines in, Event JSON lines out, the whole `Op` set including
QueueUserInput — exported from lib.rs with no subcommand to reach it. Wired
it up as `dev proto`. That is the difference between interrupting a turn and
steering one: `app-server`'s sendUserMessage hardcodes Op::UserInput, which
calls sess.abort() and restarts the turn.

  $ printf '%s\n' '{"id":"s1","op":{"type":"interrupt"}}' \
                  '{"id":"s2","op":{"type":"shutdown"}}' | dev proto
  {"id":"","event_seq":0,"msg":{"type":"session_configured",
   "session_id":"4d82071e-...","model":"zen5-coder",...}}
  {"id":"s2","event_seq":1,"msg":{"type":"shutdown_complete"}}

Also: upstream-merge.yml polled openai/codex every 30 minutes. That is the
wrong upstream (codex-rs reaches us through just-every) and a cron cannot
work against a disjoint history anyway — it needs a hand-supplied merge base.
Retargeted to just-every/code and made it manual, pointing at the procedure
in LLM.md. Purged @just-every/code from the release and recovery pipelines,
which would otherwise have published our binaries under their scope.

Co-authored-by: Hanzo Dev <[email protected]>
This commit is contained in:
2026-08-05 23:28:50 -07:00
co-authored by Hanzo Dev
parent dc13f1609d
commit 23a7fe1109
31 changed files with 81 additions and 71 deletions
+2 -2
View File
@@ -347,8 +347,8 @@ jobs:
set -euo pipefail
# Use bot identity if available
if [ -n "${{ secrets.CODE_GH_PAT }}" ]; then
git config user.name "just-every-code"
git config user.email "[email protected]"
git config user.name "hanzo-dev"
git config user.email "[email protected]"
else
git config user.name "github-actions[bot]"
git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
+11 -9
View File
@@ -1,15 +1,17 @@
name: Upstream Merge
on:
# Poll upstream regularly; also allow manual and external triggers
schedule:
- cron: '*/30 * * * *'
# Manual only. Our history is just-every/code's with author emails rewritten,
# so the two graphs share no merge base and a plain `git merge` conflicts on
# every file. A sync needs a merge base supplied by hand — the procedure and
# the current base SHA live in LLM.md, "Upstream lineage". A cron here would
# either no-op forever or open an unmergeable PR every 30 minutes.
workflow_dispatch:
inputs:
upstream_repo:
description: 'Upstream repo (owner/name)'
required: false
default: 'openai/codex'
default: 'just-every/code'
upstream_branch:
description: 'Upstream branch'
required: false
@@ -28,7 +30,7 @@ permissions:
pull-requests: write
env:
UPSTREAM_REPO: ${{ inputs.upstream_repo || 'openai/codex' }}
UPSTREAM_REPO: ${{ inputs.upstream_repo || 'just-every/code' }}
UPSTREAM_BRANCH: ${{ inputs.upstream_branch || 'main' }}
MERGE_BRANCH: upstream-merge
# Controls whether we auto-close an existing upstream-merge PR when the run
@@ -197,8 +199,8 @@ jobs:
- name: Set git identity for commits
run: |
git config user.name "just-every-code"
git config user.email "[email protected]"
git config user.name "hanzo-dev"
git config user.email "[email protected]"
git config --global --add safe.directory "$GITHUB_WORKSPACE"
- name: "Quick no-op: ancestor check (default and merge branch)"
@@ -622,7 +624,7 @@ jobs:
OPENAI_API_BASE="http://127.0.0.1:5055/v1" \
GH_TOKEN="$GH_TOKEN" \
npm_config_cache="$SAFE_HOME/.npm" \
npx -y @just-every/code@latest \
npx -y @hanzo/dev@latest \
auto \
--goal-file .github/auto/AUTO_GOAL.md \
--max-attempts 3 \
@@ -739,7 +741,7 @@ jobs:
GH_TOKEN="$GH_TOKEN" \
RUSTC_WRAPPER="sccache" SCCACHE_GHA_ENABLED="true" SCCACHE_IDLE_TIMEOUT="1800" SCCACHE_CACHE_SIZE="5G" \
npm_config_cache="$SAFE_HOME/.npm" \
npx -y @just-every/code@latest \
npx -y @hanzo/dev@latest \
exec \
-s workspace-write \
-c sandbox_workspace_write.allow_git_writes=true \
+13 -1
View File
@@ -39,6 +39,8 @@ use tokio::runtime::{Builder as TokioRuntimeBuilder, Handle as TokioHandle};
mod mcp_cmd;
use crate::mcp_cmd::McpCli;
use code_cli::proto;
use code_cli::proto::ProtoCli;
const CLI_COMMAND_NAME: &str = "dev";
pub(crate) const CODEX_SECURE_MODE_ENV_VAR: &str = "CODEX_SECURE_MODE";
@@ -122,6 +124,12 @@ enum Subcommand {
/// [experimental] Run the app server.
AppServer,
/// [experimental] Speak the agent protocol on stdin/stdout: Submission
/// JSON lines in, Event JSON lines out. Unlike `app-server` this exposes
/// the whole `Op` set, so a controller can steer a turn in flight
/// (`queue_user_input`) rather than only interrupt it.
Proto(ProtoCli),
/// Generate shell completion scripts.
Completion(CompletionCommand),
@@ -495,6 +503,10 @@ async fn cli_main(code_linux_sandbox_exe: Option<PathBuf>) -> anyhow::Result<()>
Some(Subcommand::AppServer) => {
code_app_server::run_main(code_linux_sandbox_exe, root_config_overrides).await?;
}
Some(Subcommand::Proto(mut proto_cli)) => {
prepend_config_flags(&mut proto_cli.config_overrides, root_config_overrides.clone());
proto::run_main(proto_cli).await?;
}
Some(Subcommand::Resume(ResumeCommand {
session_id,
last,
@@ -1260,7 +1272,7 @@ async fn preview_main(args: PreviewArgs) -> anyhow::Result<()> {
_ => bail!(format!("Unsupported platform: {}/{}", os, arch)),
};
let client = reqwest::Client::builder().user_agent("codex-preview/1").build()?;
let client = reqwest::Client::builder().user_agent("hanzo-dev-preview/1").build()?;
// Resolve slug/tag from id
let id = args.slug.trim().to_string();
+2 -2
View File
@@ -341,7 +341,7 @@ fn run_list(config_overrides: &CliConfigOverrides, list_args: ListArgs) -> Resul
}
if entries.is_empty() {
println!("No MCP servers configured yet. Try `codex mcp add my-tool -- my-command`.");
println!("No MCP servers configured yet. Try `dev mcp add my-tool -- my-command`.");
return Ok(());
}
@@ -567,7 +567,7 @@ fn run_get(config_overrides: &CliConfigOverrides, get_args: GetArgs) -> Result<(
if let Some(timeout) = server.tool_timeout_sec {
println!(" tool_timeout_sec: {:.3}", timeout.as_secs_f64());
}
println!(" remove: codex mcp remove {}", get_args.name);
println!(" remove: dev mcp remove {}", get_args.name);
Ok(())
}
+2 -2
View File
@@ -233,7 +233,7 @@ pub async fn run_main(cli: Cli, _code_linux_sandbox_exe: Option<PathBuf>) -> any
}
_ => {
eprintln!(
"Not signed in. Please run 'dev login' to sign in with ChatGPT, then re-run 'codex cloud'."
"Not signed in. Please run 'dev login' to sign in with ChatGPT, then re-run 'dev cloud'."
);
std::process::exit(1);
}
@@ -241,7 +241,7 @@ pub async fn run_main(cli: Cli, _code_linux_sandbox_exe: Option<PathBuf>) -> any
}
None => {
eprintln!(
"Not signed in. Please run 'dev login' to sign in with ChatGPT, then re-run 'codex cloud'."
"Not signed in. Please run 'dev login' to sign in with ChatGPT, then re-run 'dev cloud'."
);
std::process::exit(1);
}
+3 -3
View File
@@ -24,21 +24,21 @@ pub fn builtin_approval_presets() -> Vec<ApprovalPreset> {
ApprovalPreset {
id: "read-only",
label: "Read Only",
description: "Codex can read files and answer questions. Codex requires approval to make edits, run commands, or access network",
description: "Hanzo Dev can read files and answer questions. It requires approval to make edits, run commands, or access network",
approval: AskForApproval::OnRequest,
sandbox: SandboxPolicy::ReadOnly,
},
ApprovalPreset {
id: "auto",
label: "Auto",
description: "Codex can read files, make edits, and run commands in the workspace. Codex requires approval to work outside the workspace or access network",
description: "Hanzo Dev can read files, make edits, and run commands in the workspace. It requires approval to work outside the workspace or access network",
approval: AskForApproval::OnRequest,
sandbox: SandboxPolicy::new_workspace_write_policy(),
},
ApprovalPreset {
id: "full-access",
label: "Full Access",
description: "Codex can read files, make edits, and run commands with network access, without approval. Exercise caution",
description: "Hanzo Dev can read files, make edits, and run commands with network access, without approval. Exercise caution",
approval: AskForApproval::Never,
sandbox: SandboxPolicy::DangerFullAccess,
},
+1 -1
View File
@@ -1,4 +1,4 @@
You are Codex, based on GPT-5. You are running as a coding agent in the Codex CLI on a user's computer.
You are a coding agent based on GPT-5, running in Hanzo Dev on a user's computer.
## General
+1 -1
View File
@@ -1,4 +1,4 @@
You are Codex, based on GPT-5. You are running as a coding agent in the Codex CLI on a user's computer.
You are a coding agent based on GPT-5, running in Hanzo Dev on a user's computer.
## General
+1 -2
View File
@@ -1,4 +1,4 @@
You are GPT-5.1 running in the Codex CLI, a terminal-based coding assistant. Codex CLI is an open source project led by OpenAI. You are expected to be precise, safe, and helpful.
You are GPT-5.1 running in Hanzo Dev, a terminal-based coding assistant. You are expected to be precise, safe, and helpful.
Your capabilities:
@@ -6,7 +6,6 @@ Your capabilities:
- Communicate with the user by streaming thinking & responses, and by making & updating plans.
- Emit function calls to run terminal commands and apply patches. Depending on how this specific run is configured, you can request that these function calls be escalated to the user for approval before running. More on this in the "Sandbox and approvals" section.
Within this context, Codex refers to the open-source agentic coding interface (not the old Codex language model built by OpenAI).
# How you work
+1 -2
View File
@@ -1,4 +1,4 @@
You are GPT-5.2 running in the Codex CLI, a terminal-based coding assistant. Codex CLI is an open source project led by OpenAI. You are expected to be precise, safe, and helpful.
You are GPT-5.2 running in Hanzo Dev, a terminal-based coding assistant. You are expected to be precise, safe, and helpful.
Your capabilities:
@@ -6,7 +6,6 @@ Your capabilities:
- Communicate with the user by streaming thinking & responses, and by making & updating plans.
- Emit function calls to run terminal commands and apply patches. Depending on how this specific run is configured, you can request that these function calls be escalated to the user for approval before running. More on this in the "Sandbox and approvals" section.
Within this context, Codex refers to the open-source agentic coding interface (not the old Codex language model built by OpenAI).
# How you work
+1 -1
View File
@@ -1,4 +1,4 @@
You are Codex, based on GPT-5. You are running as a coding agent in the Codex CLI on a user's computer.
You are a coding agent based on GPT-5, running in Hanzo Dev on a user's computer.
## General
+1 -2
View File
@@ -1,4 +1,4 @@
You are a coding agent running in the Codex CLI, a terminal-based coding assistant. Codex CLI is an open source project led by OpenAI. You are expected to be precise, safe, and helpful.
You are a coding agent running in Hanzo Dev, a terminal-based coding assistant. You are expected to be precise, safe, and helpful.
Your capabilities:
@@ -6,7 +6,6 @@ Your capabilities:
- Communicate with the user by streaming thinking & responses, and by making & updating plans.
- Emit function calls to run terminal commands and apply patches. Depending on how this specific run is configured, you can request that these function calls be escalated to the user for approval before running. More on this in the "Sandbox and approvals" section.
Within this context, Codex refers to the open-source agentic coding interface (not the old Codex language model built by OpenAI).
# How you work
+1 -1
View File
@@ -1,4 +1,4 @@
In this environment, you are running as `code` and your name is Code. Code is a fork Codex CLI, an open source project led by OpenAI.
In this environment, you are running as `dev` and your name is Hanzo Dev.
Code is a fast, community-driven fork focused on key developer ergonomics: Browser control, multi-agent flows, autonomous tasks, and on-the-fly reasoning control - all while staying compatible with upstream.
@@ -1,4 +1,4 @@
You are a coding agent running in the Codex CLI, a terminal-based coding assistant. Codex CLI is an open source project led by OpenAI. You are expected to be precise, safe, and helpful.
You are a coding agent running in Hanzo Dev, a terminal-based coding assistant. You are expected to be precise, safe, and helpful.
Your capabilities:
@@ -6,7 +6,6 @@ Your capabilities:
- Communicate with the user by streaming thinking & responses, and by making & updating plans.
- Emit function calls to run terminal commands and apply patches. Depending on how this specific run is configured, you can request that these function calls be escalated to the user for approval before running. More on this in the "Sandbox and approvals" section.
Within this context, Codex refers to the open-source agentic coding interface (not the old Codex language model built by OpenAI).
# How you work
+1 -1
View File
@@ -311,7 +311,7 @@ impl McpConnectionManager {
client_info: Implementation {
name: "codex-mcp-client".to_owned(),
version: env!("CARGO_PKG_VERSION").to_owned(),
title: Some("Codex".into()),
title: Some("Hanzo Dev".into()),
// This field is used by Codex when it is an MCP
// server: it should not be used when Codex is
// an MCP client.
+1 -1
View File
@@ -120,7 +120,7 @@ fn create_seatbelt_command_args(
);
if std::env::var("CODEX_DEBUG_PRINT_SEATBELT").is_ok() {
eprintln!("--- Codex Seatbelt Policy ---\n{}\n------------------------------", full_policy);
eprintln!("--- Hanzo Dev Seatbelt Policy ---\n{}\n------------------------------", full_policy);
}
let mut seatbelt_args: Vec<String> = vec!["-p".to_string(), full_policy];
+2 -2
View File
@@ -27,9 +27,9 @@ rec {
openssl
];
meta = with pkgs.lib; {
description = "OpenAI Codex command‑line interface rust implementation";
description = "Hanzo Dev — the Hanzo coding agent (Rust implementation)";
license = licenses.asl20;
homepage = "https://github.com/openai/codex";
homepage = "https://github.com/hanzoai/dev";
};
};
devShell = pkgs.mkShell {
+2 -2
View File
@@ -4,7 +4,7 @@
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta name="color-scheme" content="light dark" />
<title>Sign into Codex</title>
<title>Sign in to Hanzo Dev</title>
<link rel="icon" href='data:image/svg+xml,%3Csvg xmlns="http://www.w3.org/2000/svg" width="32" height="32" fill="none" viewBox="0 0 32 32"%3E%3Cpath stroke="%23000" stroke-linecap="round" stroke-width="2.484" d="M22.356 19.797H17.17M9.662 12.29l1.979 3.576a.511.511 0 0 1-.005.504l-1.974 3.409M30.758 16c0 8.15-6.607 14.758-14.758 14.758-8.15 0-14.758-6.607-14.758-14.758C1.242 7.85 7.85 1.242 16 1.242c8.15 0 14.758 6.608 14.758 14.758Z"/%3E%3C/svg%3E' type="image/svg+xml">
<style>
:root {
@@ -169,7 +169,7 @@
<div class="logo">
<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" fill="none" viewBox="0 0 32 32"><path stroke="#000" stroke-linecap="round" stroke-width="2.484" d="M22.356 19.797H17.17M9.662 12.29l1.979 3.576a.511.511 0 0 1-.005.504l-1.974 3.409M30.758 16c0 8.15-6.607 14.758-14.758 14.758-8.15 0-14.758-6.607-14.758-14.758C1.242 7.85 7.85 1.242 16 1.242c8.15 0 14.758 6.608 14.758 14.758Z"></path></svg>
</div>
<div class="title">Signed in to Codex</div>
<div class="title">Signed in to Hanzo Dev</div>
</div>
<div class="close-box" style="display: none;">
<div class="setup-description">You may now close this page</div>
+1 -1
View File
@@ -63,7 +63,7 @@ async fn main() -> Result<()> {
client_info: Implementation {
name: "codex-mcp-client".to_owned(),
version: env!("CARGO_PKG_VERSION").to_owned(),
title: Some("Codex".to_string()),
title: Some("Hanzo Dev".to_string()),
// This field is used by Codex when it is an MCP server: it should
// not be used when Codex is an MCP client.
user_agent: None,
+2 -2
View File
@@ -42,7 +42,7 @@ pub async fn new_session(
let result = CallToolResult {
content: vec![ContentBlock::TextContent(TextContent {
r#type: "text".to_string(),
text: format!("Failed to start Codex session: {err}"),
text: format!("Failed to start Hanzo Dev session: {err}"),
annotations: None,
})],
is_error: Some(true),
@@ -78,7 +78,7 @@ pub async fn prompt(
final_output_json_schema: None,
})
.await
.context("failed to submit prompt to Codex")?;
.context("failed to submit prompt to Hanzo Dev")?;
let mut stop_reason = acp::StopReason::EndTurn;
+11 -11
View File
@@ -127,12 +127,12 @@ pub(crate) fn create_tool_for_code_tool_call_param() -> Tool {
Tool {
name: "codex".to_string(),
title: Some("Codex".to_string()),
title: Some("Hanzo Dev".to_string()),
input_schema: tool_input_schema,
// TODO(mbolin): This should be defined.
output_schema: None,
description: Some(
"Run a Codex session. Accepts configuration parameters matching the Codex Config struct.".to_string(),
"Run a Hanzo Dev session. Accepts configuration parameters matching the Config struct.".to_string(),
),
annotations: None,
}
@@ -160,7 +160,7 @@ pub(crate) fn create_tool_for_acp_new_session() -> Tool {
title: Some(acp::AGENT_METHOD_NAMES.session_new.to_string()),
input_schema,
output_schema: Some(output_schema),
description: Some("Start a Codex session over ACP.".to_string()),
description: Some("Start a Hanzo Dev session over ACP.".to_string()),
annotations: None,
}
}
@@ -182,7 +182,7 @@ pub(crate) fn create_tool_for_acp_prompt() -> Tool {
title: Some(acp::AGENT_METHOD_NAMES.session_prompt.to_string()),
input_schema,
output_schema: None,
description: Some("Send a prompt to an existing ACP Codex session.".to_string()),
description: Some("Send a prompt to an existing ACP Hanzo Dev session.".to_string()),
annotations: None,
}
}
@@ -203,7 +203,7 @@ pub(crate) fn create_tool_for_acp_set_model() -> Tool {
title: Some(acp::AGENT_METHOD_NAMES.session_set_model.to_string()),
input_schema,
output_schema: None,
description: Some("Select a model for an existing ACP Codex session.".to_string()),
description: Some("Select a model for an existing ACP Hanzo Dev session.".to_string()),
annotations: None,
}
}
@@ -324,11 +324,11 @@ pub(crate) fn create_tool_for_code_tool_call_reply_param() -> Tool {
Tool {
name: "codex-reply".to_string(),
title: Some("Codex Reply".to_string()),
title: Some("Hanzo Dev Reply".to_string()),
input_schema: tool_input_schema,
output_schema: None,
description: Some(
"Continue a Codex session by providing the session id and prompt.".to_string(),
"Continue a Hanzo Dev session by providing the session id and prompt.".to_string(),
),
annotations: None,
}
@@ -357,8 +357,8 @@ mod tests {
let tool_json = serde_json::to_value(&tool).expect("tool serializes");
let expected_tool_json = serde_json::json!({
"name": "codex",
"title": "Codex",
"description": "Run a Codex session. Accepts configuration parameters matching the Codex Config struct.",
"title": "Hanzo Dev",
"description": "Run a Hanzo Dev session. Accepts configuration parameters matching the Config struct.",
"inputSchema": {
"type": "object",
"properties": {
@@ -517,7 +517,7 @@ mod tests {
#[expect(clippy::expect_used)]
let tool_json = serde_json::to_value(&tool).expect("tool serializes");
let expected_tool_json = serde_json::json!({
"description": "Continue a Codex session by providing the session id and prompt.",
"description": "Continue a Hanzo Dev session by providing the session id and prompt.",
"inputSchema": {
"properties": {
"prompt": {
@@ -536,7 +536,7 @@ mod tests {
"type": "object",
},
"name": "codex-reply",
"title": "Codex Reply",
"title": "Hanzo Dev Reply",
});
assert_eq!(expected_tool_json, tool_json);
}
+2 -2
View File
@@ -60,7 +60,7 @@ pub async fn run_code_tool_session(
let result = CallToolResult {
content: vec![ContentBlock::TextContent(TextContent {
r#type: "text".to_string(),
text: format!("Failed to start Codex session: {e}"),
text: format!("Failed to start Hanzo Dev session: {e}"),
annotations: None,
})],
is_error: Some(true),
@@ -367,7 +367,7 @@ async fn run_code_tool_session_inner(
let result = CallToolResult {
content: vec![ContentBlock::TextContent(TextContent {
r#type: "text".to_string(),
text: format!("Codex runtime error: {e}"),
text: format!("Hanzo Dev runtime error: {e}"),
annotations: None,
})],
is_error: Some(true),
+1 -1
View File
@@ -61,7 +61,7 @@ pub(crate) async fn handle_exec_approval_request(
let escaped_command =
shlex::try_join(command.iter().map(String::as_str)).unwrap_or_else(|_| command.join(" "));
let message = format!(
"Allow Codex to run `{escaped_command}` in `{cwd}`?",
"Allow Hanzo Dev to run `{escaped_command}` in `{cwd}`?",
cwd = cwd.to_string_lossy()
);
+4 -4
View File
@@ -401,7 +401,7 @@ impl MessageProcessor {
let server_info = serde_json::json!({
"name": "code-mcp-server",
"version": env!("CARGO_PKG_VERSION"),
"title": "Codex",
"title": "Hanzo Dev",
"user_agent": get_code_user_agent_default(),
});
@@ -578,7 +578,7 @@ impl MessageProcessor {
content: vec![ContentBlock::TextContent(TextContent {
r#type: "text".to_owned(),
text: format!(
"Failed to load Codex configuration from overrides: {e}"
"Failed to load configuration from overrides: {e}"
),
annotations: None,
})],
@@ -594,7 +594,7 @@ impl MessageProcessor {
let result = CallToolResult {
content: vec![ContentBlock::TextContent(TextContent {
r#type: "text".to_owned(),
text: format!("Failed to parse configuration for Codex tool: {e}"),
text: format!("Failed to parse configuration for the Hanzo Dev tool: {e}"),
annotations: None,
})],
is_error: Some(true),
@@ -662,7 +662,7 @@ impl MessageProcessor {
let result = CallToolResult {
content: vec![ContentBlock::TextContent(TextContent {
r#type: "text".to_owned(),
text: format!("Failed to parse configuration for Codex tool: {e}"),
text: format!("Failed to parse configuration for the Hanzo Dev tool: {e}"),
annotations: None,
})],
is_error: Some(true),
+1 -1
View File
@@ -56,7 +56,7 @@ pub(crate) async fn handle_patch_approval_request(
if let Some(r) = &reason {
message_lines.push(r.clone());
}
message_lines.push("Allow Codex to apply proposed code changes?".to_string());
message_lines.push("Allow Hanzo Dev to apply proposed code changes?".to_string());
let params = PatchApprovalElicitRequestParams {
message: message_lines.join("\n"),
+1 -1
View File
@@ -70,7 +70,7 @@ pub const BROWSER_SNAPSHOT_OPEN_TAG: &str = "<browser_snapshot>";
pub const BROWSER_SNAPSHOT_CLOSE_TAG: &str = "</browser_snapshot>";
pub const COLLABORATION_MODE_OPEN_TAG: &str = "<collaboration_mode>";
pub const COLLABORATION_MODE_CLOSE_TAG: &str = "</collaboration_mode>";
pub const USER_MESSAGE_BEGIN: &str = "## My request for Codex:";
pub const USER_MESSAGE_BEGIN: &str = "## My request for Hanzo Dev:";
/// Submission Queue Entry - requests from user
#[derive(Debug, Clone, Deserialize, Serialize, JsonSchema)]
+2 -2
View File
@@ -1,5 +1,5 @@
{
"name": "@openai/codex-responses-api-proxy",
"name": "@hanzo/dev-responses-api-proxy",
"version": "0.0.0-dev",
"license": "Apache-2.0",
"bin": {
@@ -15,7 +15,7 @@
],
"repository": {
"type": "git",
"url": "git+https://github.com/openai/codex.git",
"url": "git+https://github.com/hanzoai/dev.git",
"directory": "code-rs/responses-api-proxy/npm"
}
}
+3 -3
View File
@@ -39471,7 +39471,7 @@ impl ChatWidget<'_> {
pub(crate) fn show_cloud_tasks_loading(&mut self) {
let loading_item = SelectionItem {
name: "Loading cloud tasks…".to_string(),
description: Some("Fetching latest tasks from Codex Cloud".to_string()),
description: Some("Fetching latest cloud tasks".to_string()),
is_current: true,
actions: Vec::new(),
};
@@ -39527,7 +39527,7 @@ impl ChatWidget<'_> {
pub(crate) fn show_cloud_environment_loading(&mut self) {
let loading_item = SelectionItem {
name: "Loading environments…".to_string(),
description: Some("Fetching available Codex Cloud environments".to_string()),
description: Some("Fetching available cloud environments".to_string()),
is_current: true,
actions: Vec::new(),
};
@@ -39752,7 +39752,7 @@ impl ChatWidget<'_> {
let view = CustomPromptView::new(
format!("Create cloud task ({env_display})"),
"Describe the change you want Codex to implement".to_string(),
"Describe the change you want Hanzo Dev to implement".to_string(),
Some("Press Enter to submit · Esc cancel".to_string()),
self.app_event_tx.clone(),
None,
+1 -1
View File
@@ -59,7 +59,7 @@ pub(super) fn maybe_watch_after_push(
let api_base = format!("https://api.github.com/repos/{owner}/{repo}/actions/runs");
let token = get_github_token().map(|(t, _)| t);
let client = reqwest::Client::builder()
.user_agent("codex-cli-rs/github-monitor")
.user_agent("hanzo-dev/github-monitor")
.build()
.unwrap_or_else(|_| reqwest::Client::new());
+1 -1
View File
@@ -481,7 +481,7 @@ pub async fn run_main(
Ok(code_home) => code_home,
#[allow(clippy::print_stderr)]
Err(err) => {
eprintln!("Error finding codex home: {err}");
eprintln!("Error finding the Hanzo Dev home directory: {err}");
std::process::exit(1);
}
};
+4 -4
View File
@@ -1,11 +1,11 @@
{
"name": "@openai/codex",
"version": "0.6.39",
"name": "@hanzo/dev",
"version": "0.2.189",
"lockfileVersion": 3,
"packages": {
"": {
"name": "@openai/codex",
"version": "0.6.39",
"name": "@hanzo/dev",
"version": "0.2.189",
"license": "Apache-2.0",
"bin": {
"codex": "bin/codex.js"