§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:
@@ -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": {
|
||||
|
||||
@@ -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"));
|
||||
|
||||
@@ -353,16 +353,16 @@ async fn request_carries_bearer_kigi_ua_and_kimi_dialect_body() {
|
||||
for gone in [
|
||||
"x-xai-token-auth",
|
||||
"x-authenticateresponse",
|
||||
"x-grok-conv-id",
|
||||
"x-grok-req-id",
|
||||
"x-grok-model-override",
|
||||
"x-grok-session-id",
|
||||
"x-grok-agent-id",
|
||||
"x-grok-client-identifier",
|
||||
"x-grok-client-version",
|
||||
"x-grok-deployment-id",
|
||||
"x-grok-user-id",
|
||||
"x-grok-client-mode",
|
||||
"x-kigi-conv-id",
|
||||
"x-kigi-req-id",
|
||||
"x-kigi-model-override",
|
||||
"x-kigi-session-id",
|
||||
"x-kigi-agent-id",
|
||||
"x-kigi-client-identifier",
|
||||
"x-kigi-client-version",
|
||||
"x-kigi-deployment-id",
|
||||
"x-kigi-user-id",
|
||||
"x-kigi-client-mode",
|
||||
] {
|
||||
assert!(
|
||||
headers.get(gone).is_none(),
|
||||
@@ -401,7 +401,7 @@ async fn request_carries_bearer_kigi_ua_and_kimi_dialect_body() {
|
||||
None,
|
||||
"empty tool-call content dropped (kimi.py:339-350)"
|
||||
);
|
||||
assert_eq!(assistant.get("model_id"), None, "grok extension dropped");
|
||||
assert_eq!(assistant.get("model_id"), None, "kigi extension dropped");
|
||||
assert_eq!(
|
||||
assistant["reasoning_content"],
|
||||
json!("planning the read"),
|
||||
|
||||
Reference in New Issue
Block a user