refactor(ai): strip Goose harness (Phase 1) — native/simple host-side only
CI / rust client (hh) (macos-latest) (push) Waiting to run
CI / rust client (hh) (ubuntu-latest) (push) Waiting to run
CI / rust coverage (push) Waiting to run
CI / python server (3.10) (push) Waiting to run
CI / python server (3.11) (push) Waiting to run
CI / python server (3.12) (push) Waiting to run
CI / headless e2e smoke (push) Waiting to run
CI / dependency audit (push) Waiting to run
CI / secret scanning (push) Waiting to run
CI / rust client (hh) (macos-latest) (push) Waiting to run
CI / rust client (hh) (ubuntu-latest) (push) Waiting to run
CI / rust coverage (push) Waiting to run
CI / python server (3.10) (push) Waiting to run
CI / python server (3.11) (push) Waiting to run
CI / python server (3.12) (push) Waiting to run
CI / headless e2e smoke (push) Waiting to run
CI / dependency audit (push) Waiting to run
CI / secret scanning (push) Waiting to run
Remove the Goose agentic harness across the codebase per
docs/spec-native-harness.md §3. Goose made N sequential model calls inside the
sandbox (slow on CPU-only hardware) and forced an in-container→host Ollama
gateway that tripped the rootless-Podman slirp4netns loopback bug.
- bridge.py: delete _run_goose/_goose_argv/_goose_present + GOOSE_* consts and
the present-cache; __init__ now takes harness="simple"/max_turns=5; granted
!task runs _run_simple until the native loop lands (Phase 2).
- __main__.py: --harness {native,simple} (was {goose,simple}); drop
--goose-max-turns, add --max-turns; default harness simple.
- app.rs: /ai start accepts native|simple (plain aliases simple) instead of a
bare plain flag; refresh harness comments.
- sbx.rs: remove the in-container Ollama gateway (Docker host-gateway / Podman
slirp4netns host-loopback) and the dk_bootstrap OLLAMA_HOST env — kills the
slirp4netns loopback bug; drop Goose comments.
- bootstrap.sh: drop goose from the prereq probe.
- bootstrap-ai.sh: remove the entire Goose install block, --no-goose flag,
GOOSE_INSTALLER_URL, host config writer, and goose_bin helper.
- sandbox-bootstrap.sh: remove the in-sandbox Goose binary install + config.
- spec-goose-harness.md: banner — harness portion superseded; Podman stays.
cargo check + py_compile clean. No Goose refs remain (headroom/ untouched).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
+18
-11
@@ -2624,11 +2624,12 @@ fn handle_command(
|
||||
app.sys("an AI agent is already running from this client — /ai stop first");
|
||||
} else {
|
||||
// Trailing flag words (any order): `allow` auto-grants the agent
|
||||
// sandbox drive on launch; `plain` selects the legacy one-shot
|
||||
// injector instead of the default Goose harness.
|
||||
// sandbox drive on launch; the harness word `native` (default) or
|
||||
// `simple` picks the granted-`!task` harness. `plain` is a back-compat
|
||||
// alias for `simple`.
|
||||
let mut raw = rest.trim();
|
||||
let mut grant_sbx = false;
|
||||
let mut plain = false;
|
||||
let mut harness: Option<&str> = None;
|
||||
loop {
|
||||
if let Some(head) = raw
|
||||
.strip_suffix("allow")
|
||||
@@ -2638,17 +2639,20 @@ fn handle_command(
|
||||
raw = head.trim();
|
||||
continue;
|
||||
}
|
||||
if let Some(head) = raw
|
||||
.strip_suffix("plain")
|
||||
.filter(|h| h.is_empty() || h.ends_with(' '))
|
||||
if let Some((word, head)) = ["native", "simple", "plain"]
|
||||
.iter()
|
||||
.find_map(|w| {
|
||||
raw.strip_suffix(w)
|
||||
.filter(|h| h.is_empty() || h.ends_with(' '))
|
||||
.map(|h| (*w, h))
|
||||
})
|
||||
{
|
||||
plain = true;
|
||||
harness = Some(if word == "native" { "native" } else { "simple" });
|
||||
raw = head.trim();
|
||||
continue;
|
||||
}
|
||||
break;
|
||||
}
|
||||
let harness = if plain { Some("simple") } else { None };
|
||||
// A bare name (no ':' tag, no '/' path) is a models.toml profile;
|
||||
// anything else is treated as a literal Ollama model tag.
|
||||
let (profile, model): (Option<&str>, &str) = if raw.is_empty() {
|
||||
@@ -2671,7 +2675,10 @@ fn handle_command(
|
||||
Some(p) => format!("profile {p}"),
|
||||
None => format!("ollama/{model}"),
|
||||
};
|
||||
let hdesc = if plain { ", simple harness" } else { "" };
|
||||
let hdesc = match harness {
|
||||
Some(h) => format!(", {h} harness"),
|
||||
None => String::new(),
|
||||
};
|
||||
app.sys(format!(
|
||||
"⛧ summoning {name} ({desc}{hdesc})… it will announce when online"
|
||||
));
|
||||
@@ -3245,8 +3252,8 @@ fn spawn_agent(
|
||||
.arg(model);
|
||||
}
|
||||
}
|
||||
// Override the agent's default `!task` harness (goose) when the launcher
|
||||
// asked for the legacy one-shot injector via `/ai start … plain`.
|
||||
// Override the agent's default `!task` harness when the launcher asked for a
|
||||
// specific one via `/ai start … native|simple` (plain aliases simple).
|
||||
if let Some(h) = harness {
|
||||
cmd.arg("--harness").arg(h);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user