Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
34 commits
Select commit Hold shift + click to select a range
6d6df03
feat(agent): add structured output helper and agent CLI command
w0wl0lxd Jul 27, 2026
7b7adea
fix(agent-orchestration): repair route_tier and structured_output hel…
w0wl0lxd Jul 27, 2026
ba81680
feat(agent): add background agent server and management CLI
w0wl0lxd Jul 27, 2026
6d64005
feat(agent): implement status, pause, and resume commands
w0wl0lxd Jul 27, 2026
4a19b45
fix(agent): avoid duplicate text when message run ends with error
w0wl0lxd Jul 27, 2026
3fe1fcf
refactor(team): migrate roles and supervisor to n00n.subagent
w0wl0lxd Jul 27, 2026
cdeab82
fix(agent): log cleanup warnings in stop handler
w0wl0lxd Jul 27, 2026
3cb443a
fix(agent): validate agent ids and lock down socket permissions
w0wl0lxd Jul 27, 2026
d4c1099
refactor(agent): share one-shot and background agent setup
w0wl0lxd Jul 27, 2026
2e6aace
docs(changelog): add fragments for agent CLI and team refactor
w0wl0lxd Jul 27, 2026
858f517
fix(agent): await task completion before stop exits
w0wl0lxd Jul 27, 2026
8f72bb4
refactor(cli): remove unused goal arg and stub policy commands
w0wl0lxd Jul 27, 2026
698a7b3
fix(task,workflow): pass thinking config to subagent sessions
w0wl0lxd Jul 27, 2026
286c30c
fix(n00n-agent): make yolo enable rather than toggle in spawn_interac…
w0wl0lxd Jul 27, 2026
3943670
feat(agent): add --goal and mode-aware team/workflow/task prompts
w0wl0lxd Jul 27, 2026
847a251
feat(agent): configurable agent-call limits and runaway guard
w0wl0lxd Jul 27, 2026
22d4ff0
fix(guard): reserve call budget atomically in check and guard consecu…
w0wl0lxd Jul 27, 2026
e4690b3
Merge remote-tracking branch 'origin/main' into feat/agent-cli-simplify
w0wl0lxd Jul 27, 2026
1711ac0
merge: sync main and fix CI after AgentInput.control field
w0wl0lxd Jul 27, 2026
7173e83
fix(agent): gate background agent IPC behind Unix-only cfg
w0wl0lxd Jul 27, 2026
cd9bc87
Merge remote-tracking branch 'origin/main' into feat/agent-cli-simplify
w0wl0lxd Jul 27, 2026
32de81f
merge: sync main after daemon and scripting parity land
w0wl0lxd Jul 27, 2026
6a8f2dc
fix(nix): use platform-correct loader env var in wrappers
w0wl0lxd Jul 27, 2026
11cf398
merge: sync main for automerge
w0wl0lxd Jul 27, 2026
edc29b2
Merge remote-tracking branch 'origin/main' into feat/agent-cli-simplify
w0wl0lxd Jul 28, 2026
483bdcd
refactor(plugins): migrate task and workflow to n00n.subagent.launch …
w0wl0lxd Jul 28, 2026
0066083
Merge remote-tracking branch 'origin/main' into feat/agent-cli-simplify
w0wl0lxd Jul 28, 2026
40cb654
fix(agent): resolve P1 issues in background server and error handling
w0wl0lxd Jul 28, 2026
4b18d8b
Merge remote-tracking branch 'origin/main' into feat/agent-cli-simplify
w0wl0lxd Jul 28, 2026
55d3583
fix(agent): address P2 review feedback in agent.rs
w0wl0lxd Jul 28, 2026
c9bcd03
fix(team): enforce wall-clock timeout during subagent calls
w0wl0lxd Jul 28, 2026
305155a
Merge remote-tracking branch 'origin/main' into feat/agent-cli-simplify
w0wl0lxd Jul 28, 2026
eb34c82
feat(agent): wire research mode through system prompt and tool restri…
w0wl0lxd Jul 28, 2026
cf2092b
fix(workflow): preserve string subagent output and encode structured …
w0wl0lxd Jul 28, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion changelog.d/134.changed.md
Original file line number Diff line number Diff line change
@@ -1 +1 @@
Refactored `plugins/team` to launch subagents through the shared `n00n.subagent` helper, consolidating structured-output and model-tier handling with `task` and `workflow`.
Refactored `plugins/task` and `plugins/workflow` to launch subagents through the shared `n00n.subagent` helper for structured-output cases, consolidating model-tier handling. Team submodules (validation, quorum, summary) retain direct `n00n.agent.session` calls for test compatibility with mock contexts.
1 change: 1 addition & 0 deletions n00n-acp/src/server.rs
Original file line number Diff line number Diff line change
Expand Up @@ -192,6 +192,7 @@ fn spawn_session(
system_prompt_override: None,
append_system_prompt: None,
workflow: false,
mode: AgentMode::Build,
})
}

Expand Down
7 changes: 5 additions & 2 deletions n00n-agent/src/agent/instructions.rs
Original file line number Diff line number Diff line change
Expand Up @@ -71,8 +71,11 @@ pub fn build_system_prompt(
);
let env = format!("{env}\n- Model: {}", model.spec());
let instructions = format!("{env}{instructions}");
let mut system =
crate::prompt::assemble_system(crate::prompt::PromptId::System, slots, &instructions);
let prompt_id = match mode {
crate::AgentMode::Research => crate::prompt::PromptId::Research,
_ => crate::prompt::PromptId::System,
};
let mut system = crate::prompt::assemble_system(prompt_id, slots, &instructions);

if let Some(plan_path) = mode.plan_path() {
let plan_vars = Vars::new().set("{plan_path}", plan_path.display().to_string());
Expand Down
2 changes: 1 addition & 1 deletion n00n-agent/src/agent/run.rs
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ const CACHE_BREAKPOINTS_SHORT: usize = 2;
const CACHE_BREAKPOINTS_MIN: usize = 1;

fn filter_tools_for_mode(tools: &mut Value, mode: &AgentMode) {
if mode.plan_path().is_none() {
if !mode.is_readonly() {
return;
}
if let Some(definitions) = tools.as_array_mut() {
Expand Down
4 changes: 3 additions & 1 deletion n00n-agent/src/headless.rs
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,7 @@ pub struct HeadlessParams {
pub initial_wd: PathBuf,
pub fast: bool,
pub workflow: bool,
pub mode: AgentMode,
}

pub struct HeadlessHandle {
Expand Down Expand Up @@ -154,7 +155,7 @@ fn tool_definitions(
#[must_use]
pub fn spawn(params: HeadlessParams) -> HeadlessHandle {
let working_dir = params.initial_wd.to_string_lossy().into_owned();
let mode = AgentMode::Build;
let mode = params.mode.clone();
let AgentSetup {
vars,
instructions,
Expand Down Expand Up @@ -289,6 +290,7 @@ pub struct InteractiveParams {
pub system_prompt_override: Option<String>,
pub append_system_prompt: Option<String>,
pub workflow: bool,
pub mode: AgentMode,
}

pub struct InteractiveHandle {
Expand Down
8 changes: 7 additions & 1 deletion n00n-agent/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -46,16 +46,22 @@ pub enum AgentMode {
#[default]
Build,
Plan(PathBuf),
Research,
}

impl AgentMode {
#[must_use]
pub fn plan_path(&self) -> Option<&Path> {
match self {
Self::Plan(p) => Some(p),
Self::Build => None,
Self::Build | Self::Research => None,
}
}

#[must_use]
pub fn is_readonly(&self) -> bool {
matches!(self, Self::Plan(_) | Self::Research)
}
}

pub enum ExtractedCommand {
Expand Down
1 change: 1 addition & 0 deletions n00n-storage/src/sessions.rs
Original file line number Diff line number Diff line change
Expand Up @@ -299,6 +299,7 @@ pub enum StoredEffect {
pub enum StoredMode {
Build,
Plan,
Research,
}

#[derive(Debug, Clone, Serialize, Deserialize)]
Expand Down
2 changes: 2 additions & 0 deletions n00n-ui/src/app/session.rs
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,7 @@ fn stored_message(input: AgentInput, delivery: Delivery) -> StoredQueuedMessage
Some(StoredMode::Plan),
Some(path.to_string_lossy().into_owned()),
),
AgentMode::Research => (Some(StoredMode::Research), None),
};
StoredQueuedMessage {
text: input.message,
Expand Down Expand Up @@ -126,6 +127,7 @@ fn restored_submission(
StoredMode::Plan => message
.plan_path
.map_or(input.mode, |path| AgentMode::Plan(PathBuf::from(path))),
StoredMode::Research => AgentMode::Research,
};
}
if let Some(thinking) = message.thinking {
Expand Down
Loading
Loading