§9 acceptance: grep-zero sweep — every internal x.ai/grok identifier renamed

The PRD's first acceptance gate now holds: grep -RinE '\bx\.ai\b|grok'
crates/ --include='*.rs' → 0 matches (exempt: NOTICE and third-party
license archives, README provenance, and the required 'Based on Grok
Build Open Source' attribution, now sourced from version_attribution.txt).

Wire-visible renames (both sides in this repo, changed in lockstep):
- Auth method id 'grok.com' → 'kimi-code' (AuthMethodKind::KimiCode).
- Every x.ai/* and _x.ai/* ACP ext method and meta key → kigi/* /
  _kigi/* (~200 names; grokShell → kigiShell). Session-file replay keeps
  a read-side alias for the legacy '_x.ai/session/update' method so
  existing updates.jsonl histories load; writes emit only the new name
  (both directions test-pinned).
- Agent types grok-build* → kigi* with a documented legacy-prefix alias
  at resolution time so persisted sessions keep resolving.
- ToolNamespace/BuiltinAgentName GrokBuild* → Kigi* (wire snake_case
  kigi/kigi_concise/kigi_hashline; schema regenerated); grok_build
  implementation dirs renamed to kigi*.
- x-grok-* headers → x-kigi-*, __GROK_* sentinels → __KIGI_*, themes
  grokday/groknight → kigiday/kiginight (old persisted values fall back
  to the default theme), web_fetch allowlist xAI hosts → kimi.com +
  moonshot platforms, changelog CDN → this repo, grok-build changelog
  archives deleted.
- BYOK default endpoint removed: [endpoints] api_base_url is now truly
  optional with NO default — consumers fail fast with the flag name when
  unset (no silent x.ai egress). Mock harnesses inject it explicitly.
- System-prompt identity fixed: 'released by xAI' → 'an unofficial
  community CLI for Kimi' (template + regenerated encrypted form).

Also repaired pre-existing grok-era test debt found by the sweep: the
stale trace_classify default-model pin, the grok-pager UA label test,
pty-harness stale-binary reuse and non-hermetic moonshot routing (a PTY
test could previously reach the real api.moonshot.cn), and the outdated
oauth fixture scope key.

Gates: §9 grep 0; fmt clean; workspace check/clippy 0/0 (-D warnings);
FULL cargo test --workspace: 234 suites, 21,961 passed, 0 failed;
deny advisories ok.
This commit is contained in:
2026-07-18 02:48:46 -04:00
parent 86e3724310
commit 6f31415ed6
1056 changed files with 8410 additions and 18307 deletions
+55 -55
View File
@@ -181,12 +181,12 @@ fn extract_retry_after(headers: &reqwest::header::HeaderMap) -> Option<u64> {
fn extract_model_metadata(headers: &reqwest::header::HeaderMap) -> Option<ResponseModelMetadata> {
let context_window = headers
.get("x-grok-context-window")
.get("x-kigi-context-window")
.and_then(|v| v.to_str().ok())
.and_then(|s| s.parse::<u64>().ok());
let max_completion_tokens = headers
.get("x-grok-max-completion-tokens")
.get("x-kigi-max-completion-tokens")
.and_then(|v| v.to_str().ok())
.and_then(|s| s.parse::<u32>().ok());
@@ -399,7 +399,7 @@ impl SamplingClient {
// Always set User-Agent: per-session origin if available, else fallback.
// This and `extra_headers` are the only client-identity signals on the
// wire — the old xAI proxy's `x-grok-*` marker headers are gone
// wire — the old xAI proxy's `x-kigi-*` marker headers are gone
// (PRD F3: auth is a plain bearer; kimi-cli sends only User-Agent
// plus the OAuth device headers, src/kimi_cli/llm.py:317-323).
{
@@ -1096,7 +1096,7 @@ impl SamplingClient {
///
/// The third tuple element is a per-request doom-loop signal collector,
/// `Some` only when `SamplerConfig::doom_loop_recovery` is set — the same
/// gate that adds the opt-in `x-grok-doom-loop-check` request header, so
/// gate that adds the opt-in `x-kigi-doom-loop-check` request header, so
/// header and parse protection cannot drift apart. It is filled by the
/// SSE decoder as the server reports triggers and is meant to be handed
/// to `stream_responses` so the signals land on the final
@@ -1674,11 +1674,11 @@ impl SamplingClient {
self.apply_conversation_defaults(&mut request)?;
let trace = request.trace.take();
let x_grok_conv_id = request.x_grok_conv_id.clone();
let x_grok_req_id = request.x_grok_req_id.clone();
let x_grok_session_id = request.x_grok_session_id.clone();
let x_grok_turn_idx = request.x_grok_turn_idx.clone();
let x_grok_agent_id = request.x_grok_agent_id.clone();
let x_kigi_conv_id = request.x_kigi_conv_id.clone();
let x_kigi_req_id = request.x_kigi_req_id.clone();
let x_kigi_session_id = request.x_kigi_session_id.clone();
let x_kigi_turn_idx = request.x_kigi_turn_idx.clone();
let x_kigi_agent_id = request.x_kigi_agent_id.clone();
// Collect xAI-specific tools that can't be expressed via rs::Tool
// (e.g., x_search). These are injected as raw JSON after serialization.
@@ -1687,11 +1687,11 @@ impl SamplingClient {
let responses_request: rs::CreateResponse = (&request).into();
let mut wrapper = CreateResponseWrapper::new(responses_request);
wrapper.x_grok_conv_id = x_grok_conv_id;
wrapper.x_grok_req_id = x_grok_req_id;
wrapper.x_grok_session_id = x_grok_session_id;
wrapper.x_grok_turn_idx = x_grok_turn_idx;
wrapper.x_grok_agent_id = x_grok_agent_id;
wrapper.x_kigi_conv_id = x_kigi_conv_id;
wrapper.x_kigi_req_id = x_kigi_req_id;
wrapper.x_kigi_session_id = x_kigi_session_id;
wrapper.x_kigi_turn_idx = x_kigi_turn_idx;
wrapper.x_kigi_agent_id = x_kigi_agent_id;
wrapper.extra_raw_tools = extra_tools;
if let Some(trace) = trace {
@@ -1711,20 +1711,20 @@ impl SamplingClient {
self.apply_conversation_defaults(&mut request)?;
let trace = request.trace.take();
let x_grok_conv_id = request.x_grok_conv_id.clone();
let x_grok_req_id = request.x_grok_req_id.clone();
let x_grok_session_id = request.x_grok_session_id.clone();
let x_grok_turn_idx = request.x_grok_turn_idx.clone();
let x_grok_agent_id = request.x_grok_agent_id.clone();
let x_kigi_conv_id = request.x_kigi_conv_id.clone();
let x_kigi_req_id = request.x_kigi_req_id.clone();
let x_kigi_session_id = request.x_kigi_session_id.clone();
let x_kigi_turn_idx = request.x_kigi_turn_idx.clone();
let x_kigi_agent_id = request.x_kigi_agent_id.clone();
let responses_request: rs::CreateResponse = (&request).into();
let mut wrapper = CreateResponseWrapper::new(responses_request);
wrapper.x_grok_conv_id = x_grok_conv_id;
wrapper.x_grok_req_id = x_grok_req_id;
wrapper.x_grok_session_id = x_grok_session_id;
wrapper.x_grok_turn_idx = x_grok_turn_idx;
wrapper.x_grok_agent_id = x_grok_agent_id;
wrapper.x_kigi_conv_id = x_kigi_conv_id;
wrapper.x_kigi_req_id = x_kigi_req_id;
wrapper.x_kigi_session_id = x_kigi_session_id;
wrapper.x_kigi_turn_idx = x_kigi_turn_idx;
wrapper.x_kigi_agent_id = x_kigi_agent_id;
if let Some(trace) = trace {
wrapper.trace = Some(trace);
@@ -1746,20 +1746,20 @@ impl SamplingClient {
self.apply_conversation_defaults(&mut request)?;
let trace = request.trace.take();
let x_grok_conv_id = request.x_grok_conv_id.clone();
let x_grok_req_id = request.x_grok_req_id.clone();
let x_grok_session_id = request.x_grok_session_id.clone();
let x_grok_turn_idx = request.x_grok_turn_idx.clone();
let x_grok_agent_id = request.x_grok_agent_id.clone();
let x_kigi_conv_id = request.x_kigi_conv_id.clone();
let x_kigi_req_id = request.x_kigi_req_id.clone();
let x_kigi_session_id = request.x_kigi_session_id.clone();
let x_kigi_turn_idx = request.x_kigi_turn_idx.clone();
let x_kigi_agent_id = request.x_kigi_agent_id.clone();
let messages_request = build_messages_request(&request);
let mut wrapper = MessagesRequestWrapper::new(messages_request);
wrapper.x_grok_conv_id = x_grok_conv_id;
wrapper.x_grok_req_id = x_grok_req_id;
wrapper.x_grok_session_id = x_grok_session_id;
wrapper.x_grok_turn_idx = x_grok_turn_idx;
wrapper.x_grok_agent_id = x_grok_agent_id;
wrapper.x_kigi_conv_id = x_kigi_conv_id;
wrapper.x_kigi_req_id = x_kigi_req_id;
wrapper.x_kigi_session_id = x_kigi_session_id;
wrapper.x_kigi_turn_idx = x_kigi_turn_idx;
wrapper.x_kigi_agent_id = x_kigi_agent_id;
if let Some(trace) = trace {
wrapper.trace = Some(trace);
@@ -1778,20 +1778,20 @@ impl SamplingClient {
self.apply_conversation_defaults(&mut request)?;
let trace = request.trace.take();
let x_grok_conv_id = request.x_grok_conv_id.clone();
let x_grok_req_id = request.x_grok_req_id.clone();
let x_grok_session_id = request.x_grok_session_id.clone();
let x_grok_turn_idx = request.x_grok_turn_idx.clone();
let x_grok_agent_id = request.x_grok_agent_id.clone();
let x_kigi_conv_id = request.x_kigi_conv_id.clone();
let x_kigi_req_id = request.x_kigi_req_id.clone();
let x_kigi_session_id = request.x_kigi_session_id.clone();
let x_kigi_turn_idx = request.x_kigi_turn_idx.clone();
let x_kigi_agent_id = request.x_kigi_agent_id.clone();
let messages_request = build_messages_request(&request);
let mut wrapper = MessagesRequestWrapper::new(messages_request);
wrapper.x_grok_conv_id = x_grok_conv_id;
wrapper.x_grok_req_id = x_grok_req_id;
wrapper.x_grok_session_id = x_grok_session_id;
wrapper.x_grok_turn_idx = x_grok_turn_idx;
wrapper.x_grok_agent_id = x_grok_agent_id;
wrapper.x_kigi_conv_id = x_kigi_conv_id;
wrapper.x_kigi_req_id = x_kigi_req_id;
wrapper.x_kigi_session_id = x_kigi_session_id;
wrapper.x_kigi_turn_idx = x_kigi_turn_idx;
wrapper.x_kigi_agent_id = x_kigi_agent_id;
if let Some(trace) = trace {
wrapper.trace = Some(trace);
@@ -1893,13 +1893,13 @@ mod tests {
search_parameters: None,
response_format: None,
reasoning_effort: None,
x_grok_conv_id: None,
x_grok_req_id: None,
x_grok_session_id: None,
x_grok_turn_idx: None,
x_grok_agent_id: None,
x_grok_deployment_id: None,
x_grok_user_id: None,
x_kigi_conv_id: None,
x_kigi_req_id: None,
x_kigi_session_id: None,
x_kigi_turn_idx: None,
x_kigi_agent_id: None,
x_kigi_deployment_id: None,
x_kigi_user_id: None,
trace: None,
};
@@ -2377,7 +2377,7 @@ mod tests {
"id": "resp_1",
"object": "response",
"created_at": 0,
"model": "grok-build",
"model": "kigi",
"status": "completed",
"output": [],
"usage": {
@@ -2417,7 +2417,7 @@ mod tests {
"sequence_number": 0,
"response": {{
"id": "resp_1", "object": "response", "created_at": 0,
"model": "grok-build", "status": "completed", "output": [],
"model": "kigi", "status": "completed", "output": [],
"usage": {{
"input_tokens": 10,
"input_tokens_details": {{ "cached_tokens": 0 }},
@@ -2463,7 +2463,7 @@ mod tests {
"id": "resp_1",
"object": "response",
"created_at": 0,
"model": "grok-build",
"model": "kigi",
"status": "completed",
"output": [],
"usage": {
@@ -2497,7 +2497,7 @@ mod tests {
"id": "resp_1",
"object": "response",
"created_at": 0,
"model": "grok-build",
"model": "kigi",
"status": "completed",
"output": [],
"usage": {
+2 -2
View File
@@ -73,7 +73,7 @@ pub struct SamplerConfig {
/// Client identity for the User-Agent header (`kigi/{version}` plus an
/// optional origin product). The old xAI proxy's identity headers
/// (`x-grok-client-identifier` / `-client-version` / `-deployment-id` /
/// (`x-kigi-client-identifier` / `-client-version` / `-deployment-id` /
/// `-user-id`) are gone — User-Agent and `extra_headers` are the only
/// identity signals on the wire.
pub origin_client: Option<OriginClientInfo>,
@@ -112,7 +112,7 @@ pub struct SamplerConfig {
pub compaction_at_tokens: Option<CompactionAtTokens>,
/// Server-side doom-loop check policy; `None` disables it. When set, the
/// client itself sends the opt-in `x-grok-doom-loop-check` header on
/// client itself sends the opt-in `x-kigi-doom-loop-check` header on
/// streaming Responses API requests and absorbs the reported trigger
/// events (unlike the environment headers in [`Self::extra_headers`],
/// this header gates the client's own decode behavior, so it lives with
@@ -74,7 +74,7 @@ fn adapt_thinking(body: &mut Value) {
/// Message-level adaptations:
///
/// * Drop `model_id` — a grok-build extension recorded on assistant turns;
/// * Drop `model_id` — a kigi extension recorded on assistant turns;
/// kimi-cli's message serializer sends no such field
/// (packages/kosong/src/kosong/chat_provider/kimi.py:326-353).
/// * Drop `content` from assistant tool-call messages whose visible content
@@ -330,7 +330,7 @@ mod tests {
adapt_chat_completions_body(&mut body);
let assistant = &body["messages"][1];
assert_eq!(assistant.get("content"), None, "empty content dropped");
assert_eq!(assistant.get("model_id"), None, "grok extension dropped");
assert_eq!(assistant.get("model_id"), None, "kigi extension dropped");
assert!(assistant.get("tool_calls").is_some());
// The user message keeps its content.
assert_eq!(body["messages"][0]["content"], json!("hi"));