§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:
1 parent
86e3724310
commit
6f31415ed6
1056 files changed
+8410
-18307
No files matched your search
@@ -1,11 +1,11 @@
|
||||
//! Client-registered hooks for [`SessionActor`].
|
||||
//!
|
||||
//! Hooks registered at `session/new` (`_meta["x.ai/hooks"]`) come in two flavors,
|
||||
//! Hooks registered at `session/new` (`_meta["kigi/hooks"]`) come in two flavors,
|
||||
//! both matched by the agent ([`kigi_hooks::matcher::HookMatcher`], shared with
|
||||
//! file hooks):
|
||||
//! - **`PreToolUse` gate**: an awaited reverse *request* `x.ai/hooks/run`; a `deny`
|
||||
//! - **`PreToolUse` gate**: an awaited reverse *request* `kigi/hooks/run`; a `deny`
|
||||
//! blocks the tool.
|
||||
//! - **All other events**: fire-and-forget *notifications* `x.ai/hooks/event`,
|
||||
//! - **All other events**: fire-and-forget *notifications* `kigi/hooks/event`,
|
||||
//! observe-only (the callback's return is ignored). Sent per matching callback.
|
||||
|
||||
use std::sync::Arc;
|
||||
@@ -23,10 +23,10 @@ use crate::extensions::hooks::{
|
||||
};
|
||||
use crate::sampling::types::ToolCallResponse;
|
||||
|
||||
const HOOK_EVENT_METHOD: &str = "x.ai/hooks/event";
|
||||
const HOOK_RUN_METHOD: &str = "x.ai/hooks/run";
|
||||
const HOOK_EVENT_METHOD: &str = "kigi/hooks/event";
|
||||
const HOOK_RUN_METHOD: &str = "kigi/hooks/run";
|
||||
|
||||
/// Default per-callback bound for a client's `x.ai/hooks/run` reply; on timeout the gate
|
||||
/// Default per-callback bound for a client's `kigi/hooks/run` reply; on timeout the gate
|
||||
/// fails open (the tool proceeds).
|
||||
///
|
||||
/// Some external hosts default to 600s per hook; we default to 30s because our gate sits
|
||||
@@ -47,7 +47,7 @@ enum ClientHookGateOutcome {
|
||||
UnknownDecision,
|
||||
}
|
||||
|
||||
/// Outcome of the `x.ai/hooks/run` reverse request, before interpreting it as a
|
||||
/// Outcome of the `kigi/hooks/run` reverse request, before interpreting it as a
|
||||
/// decision. Separate so [`classify`] stays pure and unit-testable.
|
||||
enum ReverseOutcome {
|
||||
Responded(Arc<RawValue>),
|
||||
@@ -68,7 +68,7 @@ fn classify(outcome: ReverseOutcome) -> (ClientHookResponse, ClientHookGateOutco
|
||||
ClientHookDecision::Deny => ClientHookGateOutcome::Denied,
|
||||
ClientHookDecision::Other => {
|
||||
tracing::warn!(
|
||||
"x.ai/hooks/run returned an unknown decision value; failing open"
|
||||
"kigi/hooks/run returned an unknown decision value; failing open"
|
||||
);
|
||||
ClientHookGateOutcome::UnknownDecision
|
||||
}
|
||||
@@ -77,7 +77,7 @@ fn classify(outcome: ReverseOutcome) -> (ClientHookResponse, ClientHookGateOutco
|
||||
(resp, label)
|
||||
}
|
||||
Err(err) => {
|
||||
tracing::warn!(%err, "malformed x.ai/hooks/run response; failing open");
|
||||
tracing::warn!(%err, "malformed kigi/hooks/run response; failing open");
|
||||
(
|
||||
ClientHookResponse::default(),
|
||||
ClientHookGateOutcome::Malformed,
|
||||
@@ -86,14 +86,14 @@ fn classify(outcome: ReverseOutcome) -> (ClientHookResponse, ClientHookGateOutco
|
||||
}
|
||||
}
|
||||
ReverseOutcome::Transport(err) => {
|
||||
tracing::warn!(%err, "x.ai/hooks/run transport error (no client wired?); failing open");
|
||||
tracing::warn!(%err, "kigi/hooks/run transport error (no client wired?); failing open");
|
||||
(
|
||||
ClientHookResponse::default(),
|
||||
ClientHookGateOutcome::TransportError,
|
||||
)
|
||||
}
|
||||
ReverseOutcome::Timeout => {
|
||||
tracing::warn!("x.ai/hooks/run timed out; failing open");
|
||||
tracing::warn!("kigi/hooks/run timed out; failing open");
|
||||
(
|
||||
ClientHookResponse::default(),
|
||||
ClientHookGateOutcome::TimedOut,
|
||||
@@ -206,7 +206,7 @@ impl SessionActor {
|
||||
}
|
||||
|
||||
/// Run the client-registered `PreToolUse` hooks for `call`, firing
|
||||
/// `x.ai/hooks/run` once per matching callback with the shared `envelope` (the
|
||||
/// `kigi/hooks/run` once per matching callback with the shared `envelope` (the
|
||||
/// same payload file hooks and observe events receive).
|
||||
///
|
||||
/// Returns `Some(ToolLoop::HookDenied)` on the first deny, else `None`.
|
||||
@@ -285,7 +285,7 @@ impl SessionActor {
|
||||
Ok(None)
|
||||
}
|
||||
|
||||
/// Issue one `x.ai/hooks/run` reverse request, bounded by a per-callback `timeout`.
|
||||
/// Issue one `kigi/hooks/run` reverse request, bounded by a per-callback `timeout`.
|
||||
async fn send_hook_run(
|
||||
&self,
|
||||
dispatch: &ClientHookDispatch<'_>,
|
||||
@@ -305,7 +305,7 @@ impl SessionActor {
|
||||
}
|
||||
|
||||
/// Fire observe-only client hooks for `envelope`'s event: send an
|
||||
/// `x.ai/hooks/event` notification to each matching registered callback.
|
||||
/// `kigi/hooks/event` notification to each matching registered callback.
|
||||
/// Fire-and-forget (no decision is consumed); independent of file hooks, so it
|
||||
/// runs even when no on-disk hook registry exists. No-op when nothing is registered.
|
||||
pub(super) fn notify_client_hooks(&self, envelope: &HookEventEnvelope) {
|
||||
|
||||
Reference in new issue
Block a user